我遵循this post中描述的方法,为Chef设置新服务器的DNS记录。我已经为我的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
我已经尝试过搜索错误,但是虽然我可以看到其他人遇到此问题的证据,但不清楚他们的问题是什么或者如何解决。这里发生了什么,我该如何解决?
答案 0 :(得分: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'
我希望这有用。
答案 1 :(得分:1)
关于食谱的执行顺序,(评论rgnever的回答)你是正确的,有些事情似乎不按顺序发生。这是一个Opscode article on Chef Recipe execution:
Chef分两个阶段处理配方,编译和执行。
- 在编译阶段,将配方评估为Ruby代码,并将已识别的资源添加到资源集合中。
- 在执行阶段,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 resource不支持:nothing
操作,资源块中缺少操作会默认为:create
,这实际上会覆盖您的机密文件在食谱的执行阶段也是如此。