2017-05-29 4 views
0

現在、一部のシークレット設定を含むデータバッグがあります。毎回新しい設定が行われる下図のように、それはdatabagに追加されます。私のレシピでChefの特定のインデックスまたは特定のオブジェクトから始まるEncryptedDataBagItemをループします。

{ 
    "id": "config-databag", 
    "config1": { 
     "name": "config1", 
     "secret": "supersecretpassword" 
    }, 
    "config2": { 
     "name": "config2", 
     "secret": "supersecretpassword" 
    } 
} 

、私はdatabagを取得し、部分テンプレートを使用してファイルにすべての設定をレンダリングするテンプレートを持っています:

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でシェフのバージョン11.8.2を使用しています。

答えて

1

each_pairイテレータを使用することができます。nextを使用してidをスキップすることも、変数に渡す前に削除することもできます(delete_ifメソッド)。

hash = { 
    "id" => "config-databag", 
    "config1" => { 
     "name" => "config1", 
     "secret" => "supersecretpassword" 
    }, 
    "config2" => { 
     "name" => "config2", 
     "secret" => "supersecretpassword" 
    } 
} 

そして今は2つの方法があります。

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

これは私は値が文字列だったかどうかをチェックif文を持つよりもはるかに進歩しています。どうもありがとう。 – leeeennyy

関連する問題