我目前有一个包含一些秘密配置的数据库。每次进行新配置时,它都会被添加到数据库中,如下所示:
{
"id": "config-databag",
"config1": {
"name": "config1",
"secret": "supersecretpassword"
},
"config2": {
"name": "config2",
"secret": "supersecretpassword"
}
}
在我的食谱中,我检索数据库并有一个模板,它将使用部分模板将所有配置呈现到文件中:
secret_key = Chef::EncryptedDataBagItem.load_secret('/path/to/data_bag_key');
configurations = Chef::EncryptedDataBagItem.load('my-databag', 'config-databag', secret_key).to_hash
template 'file' do
source 'file.erb'
owner 'root'
group 'root'
mode '644'
variables(
'configurations' => configurations
)
notifies :restart, 'service[foo]'
end
file.erb
<% @configurations.each do |config| %>
<%= render 'append-config.erb', :variables => { :name => config[name], :secret => config[secret] } %>
<% end %>
追加-config.erb
special config <%= @name %> : <%= @secret %>
除了“id”对象之外,有没有办法可以遍历数据库中的所有数据项?我目前正在使用Ubuntu 14.04上的Chef 11.8.2版本。
答案 0 :(得分:1)
您可以使用each_pair迭代器,可以使用id
跳过next
,也可以在传递给变量(delete_if
方法)之前将其删除。
hash = {
"id" => "config-databag",
"config1" => {
"name" => "config1",
"secret" => "supersecretpassword"
},
"config2" => {
"name" => "config2",
"secret" => "supersecretpassword"
}
}
现在可以采取两种方式。
hash.each_pair do |key, value|
next if key == "id"
puts key
puts value["name"]
puts value["secret"]
end
或
hash.delete_if { |key, _| key == "id" }
hash.each_pair do |key, value|
puts key
puts value["name"]
puts value["secret"]
end