迭代Chef Recipe中的EncryptedDataBagItem

时间:2015-06-14 19:56:42

标签: ruby json chef devops

我想解密一个厨师数据包项(名为passwords)并将其所有属性存储在一个临时JSON文件中,该文件由node.js应用程序读取(然后删除)。有没有办法迭代数据包ITEM的属性并获取它们的值?

plain_data = Chef::EncryptedDataBagItem.load("/home/me/data_bags/secrets/passwords.json", secret_key)

由于EncryptedDataBagItem类没有each方法,有没有解决方法?我不想将每个密码存储在单独的json文件(数据包项目)中。

2 个答案:

答案 0 :(得分:1)

为什么不能这样:

decrypted_item = data_bag_item('secrets', 
                               'passwords', 
                                node['my_repo_name']['secret_key_file_path'])

file '/opt/me/passwords.json' do
  content decrypted_item.to_hash.to_json
  mode 600
end

答案 1 :(得分:0)

显然,只有使用Chef API / DSL才能做到这一点。您仍然可以在Ruby中执行此操作。好消息是您可以在Chef配方中运行任意Ruby代码。我是这样做的:

# Load my secret key from a path specified in a Chef attribute
secret_key = Chef::EncryptedDataBagItem.load_secret("#{node[:my_repo_name][:secret_key_file_path]}")

# Use the ruby_block statement to run arbitrary Ruby code in the Chef DSL
ruby_block "decrypt passwords" do
  block do
    encrypted_path = "/home/me/data_bags/secrets/passwords.json"
    encrypted_data = JSON.parse(File.read(encrypted_path))
    plain_data = Chef::EncryptedDataBagItem.new(encrypted_data, secret_key).to_hash
    File.open('/opt/me/passwords.json', 'w') { |f|
      f.write(JSON.pretty_generate(plain_data))
    }
  end
end