2012-02-08 6 views
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アドレスに解決できますが、各キーと値を取得して値を解決し、解決された値に置き換える方法はわかりません。 Rubyで

+0

A)あなたは、配列が、それは、キー/値のペアのハッシュだ、そこではありませんが何をしています。 b)あなたはそれが "うまくいかない"という意味ですか? (明らかに無効なRubyであったコードのいくつかを整理しましたが、あなたが必要としたものではないと思われます) – Phrogz

+0

この問題の解決策を見つけましたか?正しいと答えていることを忘れないでください! :) – sethvargo

答えて

0

、あなたはハッシュを持っており、新たな価値を持っているすべてのキー/値のペアを更新するとき、あなたはいくつかのオプションがあります。値は文字列や配列である、とあなたは新しい文字列をしたい場合や

を配列

# 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 
012それらを更新し、テキストを置換したい場合

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

# 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 ] 
関連する問題