从特定索引开始或在Chef

时间:2017-05-29 02:24:05

标签: chef

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

{
    "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版本。

1 个答案:

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