【问题标题】:EncryptedDataBagItem.load produces 'cannot convert nil into String'EncryptedDataBagItem.load 产生“无法将 nil 转换为字符串”
【发布时间】:2013-12-14 01:57:51
【问题描述】:

我正在按照 this post 中描述的方法为新服务器创建 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

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

【问题讨论】:

    标签: ruby chef-infra amazon-route53 databags


    【解决方案1】:

    我今天也遇到了这个错误。对我来说,节点缺少 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'
    

    我希望这会有所帮助。

    【讨论】:

    • 这绝对是问题的一部分。我有一个可以复制秘密文件的配方(在 run_list 中比这个更早),但显然密钥文件需要在 在 chef-client 开始运行之前就位
    【解决方案2】:

    关于配方​​的执行顺序,(评论 rgnever 的回答)你是正确的,有些事情似乎发生了乱序。这是Opscode article on Chef Recipe execution

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

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

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

    我们能够通过使用该文档中描述的技巧(适用于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,这实际上会在执行阶段覆盖您的秘密文件食谱也是如此。

    【讨论】:

      猜你喜欢
      • 2012-02-09
      • 2013-06-05
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多