設定に若干の矛盾があります。データ バッグでは、(JSON でハッシュを使用して) IP アドレスに名前を割り当てます。ただし、生成されたテンプレートでは名前をまったく使用していないようです。これには、注意すべきいくつかの意味があります。
連想配列 (Ruby ではハッシュ、Javascript ではオブジェクトと呼ばれる) を使用する場合、要素の順序は通常保持されず、要素を追加すると大幅に変更される可能性があります。Ruby 1.9 では、ハッシュをループするときに挿入順序を保持するための努力が行われていますが、通常はそれに頼るべきではありません。これにより、データ バッグを改善するための 2 つの代替案が導き出されます。どちらを選択するかは、実際のユース ケースによって異なります。
- ハッシュの代わりに配列を使用します。配列では、順序が維持されることが保証されています。いずれにせよ名前 (つまり、元のハッシュのキー) を使用しない場合は、単純にハッシュを使用して、ここで安全にすることができます。この道を進むとき、テンプレートの配列をループして、そこからカウントを生成できます。
- 順序が重要でない場合は、ハッシュ内のキーを使用して、テンプレートに生成されたサーバーに名前を付ける必要があります。現在、
server<Number>
データバッグで使用していますがserver.<Number>
、テンプレートで使用しています。そうすれば、キーを使用してサーバーに名前を付け、生成された名前をオーバーライドすることができます。
配列の使用
データバッグで配列を使用する場合、つまり次のような場合:
"zookeeper": [
"111.111.111.111",
"222.222.222.222"
],
テンプレートで次のように配列をループできます。
<% @zookeeper.each_with_index do |ipaddress, index| %>
<%= "server.#{index}=#{ipaddress}:2888:3888" %>
<% end %>
これは、ERB テンプレート言語を使用してファイルを作成しました。each_with_indexメソッドを使用して、配列内の各要素を反復処理しました。
ハッシュの使用
代わりにハッシュバリアントを使用する場合、最終的に生成されたファイルの構文と一致するようにデータバッグのキーを変更したと仮定すると、次のようにハッシュをループできます。
<% @zookeeper.each_pair do |name, ipaddress| %>
<%= "#{name}=#{ipaddress}:2888:3888" %>
<% end %>
これは、ハッシュのeach_pair メソッドを使用して各キーと値のペアをループし、これらのペアごとに出力行を生成します。
テンプレートにデータを渡す
最後に、レシピのテンプレートにデータを渡す構文は奇妙です。最初は、変数 (変数など) に大文字で始まる名前を使用しないでくださいZOOKEEPER
。Ruby では、これらは定数 (値定数、クラス、モジュールなど) を識別します。代わりに小文字の名前を使用してください。Ruby では慣例により、変数名に snake_case を使用します。
テンプレートに値を渡すときは、変数を渡すだけです。
db = data_bag_item("mydb", "rtb")
zookeeper = db['zookeeper']
template "/etc/zookeeper/conf/zoo.cfg" do
path "/etc/zookeeper/conf/"
source "zoo.cfg.erb"
owner "root"
group "root"
mode "0644"
variables :zookeeper => zookeeper
end