3

我正在按照本文中描述的方法新服务器创建 DNS 记录,因为 Chef 对其进行了配置。我为我的 AWS 凭证创建了一个加密数据包项:

$ knife data bag show passwords aws --secret-file .chef/encryted_data_bag_secret 
aws_access_key: <my_access_key>
aws_secret_key: <my_secret_key>
id:             aws

但是,当我运行厨师客户端时,这条线......

aws_creds = Chef::EncryptedDataBagItem.load('passwords', 'aws')

产生此错误:

TypeError: can't convert nil into String

我已尝试搜索错误,但虽然我可以看到其他人遇到此问题的证据,但尚不清楚他们的问题是什么或如何解决。这是怎么回事,我该如何解决?

4

2 回答 2

4

我今天也遇到了这个错误。对我来说,节点缺少 encrypted_data_bag_secret。

根据这个错误(http://tickets.opscode.com/browse/CHEF-4441),错误(在我的情况下)在 Chef 11.4.4 中会更清楚:

No such file or directory - file not found '/etc/chef/encrypted_data_bag_secret'

我希望这会有所帮助。

于 2013-08-19T20:32:05.607 回答
1

关于食谱的执行顺序,(评论 rgnever 的回答)你是正确的,有些事情似乎发生了乱序。这是关于 Chef Recipe 执行的 Opscode 文章

Chef 分两个阶段处理食谱,编译和执行。

  1. 在编译阶段,配方被评估为 Ruby 代码,并将识别的资源添加到资源集合中。
  2. 在执行阶段,Chef 对每个资源采取适当的 Provider 操作。

我还没有找到明确证实这一点的文档,但行为显然是 Data Bags 是一种在编译时被评估的资源类型。因此,您的配方的那部分实际上会破坏运行列表的顺序,跳到您必须实际加载到秘密文件中的任何其他配方之前。

我们能够通过使用该文档中描述的技巧(适用于cookbook_file资源)来解决这个问题。

cb_file = cookbook_file "/etc/chef/encrypted_data_bag_secret" do
  source "chef_secret_file"
  mode 0755
  owner "root"
  group "root"
end

cb_file.run_action(:create)

请注意,cookbook_file 资源:nothing不支持该操作,并且资源块中缺少操作将默认为,这实际上也会在配方的执行阶段覆盖您的秘密文件。:create

于 2013-12-13T17:57:51.247 回答