EncryptedDataBagItem.load生成'无法将nil转换为String'

时间:2013-08-19 17:12:36

标签: ruby chef amazon-route53 databags

我遵循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

我已经尝试过搜索错误,但是虽然我可以看到其他人遇到此问题的证据,但不清楚他们的问题是什么或者如何解决。这里发生了什么,我该如何解决?

2 个答案:

答案 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分两个阶段处理配方,编译和执行。

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

我还没有找到明确证实这一点的文档,但显然行为显然是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,这实际上会覆盖您的机密文件在食谱的执行阶段也是如此。