10

1) 次のようなデータ バッグがあります。

 "zookeeper":{
        "server1":"111.111.111.111",
        "server2":"222.222.222.222"
        },

2)私のレシピでは、次のようにハッシュを取得します。

data_bag("mydb")
db = data_bag_item("mydb", "rtb")
ZOOKEEPER = db['zookeeper']

3)私のレシピにも次のようなテンプレートがあります:

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

4) テンプレートを次のようにする必要があります

server.1=111.111.111.111:2888:3888
server.2=222.222.222.222:2888:3888

私の質問はこれです。ハッシュをループしてテンプレートを作成できるように、ハッシュをテンプレートに渡すにはどうすればよいですか? 私は強力な Ruby コーダーではありません。

例えば:

count = 1
for server, ipaddress in zookeeper:
      server.count=ipaddress:2888:3888
      count = count + 1
4

1 に答える 1

28

設定に若干の矛盾があります。データ バッグでは、(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
于 2012-07-15T09:47:44.073 に答える