2015-06-14 60 views
2

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

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

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

回答

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 
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