2012-02-08 62 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地址,但我並不真正瞭解如何獲取每個鍵和值,解決該值,然後將其替換爲已解決的值。

+0

一)你有什麼沒有一個數組,它的鍵/值對的哈希值。 b)你是什麼意思「不起作用」? (我清理了一些顯然無效的代碼,但我懷疑這不僅僅是你需要的。) – Phrogz 2012-02-08 04:35:52

+0

你找到了解決這個問題的辦法嗎?請不要忘記標記答案是正確的! :) – sethvargo 2014-01-02 22:53:56

回答

0

在Ruby中,當你有一個Hash和要更新所有鍵/值對有新的價值觀,你有幾種選擇:

如果值是字符串或數組,並希望新的字符串或陣列

# 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 ]