2015-06-14 62 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