Chef infra 在EncryptedDataBagItems上循环,从特定索引开始或在Chef中没有特定对象

Chef infra 在EncryptedDataBagItems上循环,从特定索引开始或在Chef中没有特定对象,chef-infra,Chef Infra,我目前有一个包含一些秘密配置的数据包。每次进行新配置时,都会将其添加到数据包中,如下所示: { "id": "config-databag", "config1": { "name": "config1", "secret": "supersecretpassword" }, "config2": { "name": "config2", "secret": "supersecretpassword"

我目前有一个包含一些秘密配置的数据包。每次进行新配置时,都会将其添加到数据包中,如下所示:

{
    "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 %>

{:name=>config[name],:secret=>config[secret]}%>
append-config.erb

special config <%= @name %> : <%= @secret %>
特殊配置:

是否有一种方法可以循环遍历数据库中除“id”对象之外的所有数据项?我目前正在Ubuntu 14.04上使用Chef的11.8.2版。

您可以使用每对迭代器,您可以使用
next
跳过
id
,或者在传递到变量之前删除它(
delete\u if
方法)

现在它可以走两条路

hash.each_pair do |key, value|
  next if key == "id"
  puts key
  puts value["name"]
  puts value["secret"]
end


这比使用if语句检查值是否为字符串要好得多。非常感谢。
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