0

opscode シェフを使用して、MySQL クラスターのデプロイを自動化しています。目的のホストを JSON ファイルに入れ、シェフにそれらのホスト名を内部 IP アドレスに解決させ、IP アドレスを変数として設定したいと考えています。

次のような単純なハッシュがあります。

    [data_bag_item["dbclstr", "dbclstr", 
{
"id"=>"dbclstr", 
"nodes"=>{"sql1"=>"cdb1.ex.net", 
      "sql2"=>"cdb2.ex.net", 
      "mgmnt"=>"cdb1.ex.net", 
      "db1"=>"cdb1.ex.net", 
      "db2"=>"cdb2.ex.net"
}}]] 

私は基本的にノードキーを取得し、ハッシュ内のすべてのキー値を調べて各キー/値を取得し、IP アドレスを返す検索関数を介して値を解析し、そのキーに値を割り当てたいと考えています。

dbclstr = search(:dbclstr).first # Loads json into hash

privip = dbclstr["nodes"] # grabs node hash from hash (turns into a mash?)
privip = privip.to_hash # turn mash to hash

privip.map { |key,value| # maps the keys and values of the hash.

item = search(:node,"name:value") #loads machine data from chef into object
value = "#{item[0][:cloud][:private_ips]}" # extracts ip address from object and sets it as value, done?

}

まあ、これはうまくいきません。

個別にホスト名を IP アドレスに解決できますが、各キーと値を取得して値を解決し、解決された値に置き換える方法がよくわかりません。

4

1 に答える 1

0

Ruby では、ハッシュがあり、すべてのキーと値のペアを新しい値に更新したい場合、いくつかのオプションがあります。

値が文字列または配列で、新しい文字列または配列が必要な場合

# Using String#replace or Array#replace to swap out the object's contents
my_hash.each do |key,value|
  value.replace( new_value )
end

値が文字列で、テキストを置き換えたい場合は、その場で更新します

my_hash.each do |key,str|
  str.sub! 'foo', 'bar'  # Replace just the first occurrence
  str.gsub! /foo/, 'bar' # Replace every occurrence
end

その他のケース (より一般的)

# Option 1: modify the hash in-place
my_hash.each{ |key,value| my_hash[key] = new_value }

# Option 2a: create a new hash (Ruby 1.9 only)
new_hash = Hash[ my_hash.map{ |key,value| [key, new_value] } ]

# Option 2b: create a new hash (Ruby 1.8+)
new_hash = Hash[ *my_hash.map{ |key,value| [key, new_value] }.flatten ]
于 2012-02-08T04:41:38.677 に答える