2012-02-08 3 views
0

Я использую команду opscode для автоматизации развертывания кластера MySQL. Я хочу поместить нужные хосты в файл JSON, а затем пусть chef разрешает эти имена хостов на внутренние IP-адреса, а затем устанавливает IP-адреса в качестве переменных.Ruby and Chef: Resolve and Replace Значения в хеш-файле

У меня есть простой хэш, который выглядит следующим образом:

[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

а) То, что вы там не массив, это хэш пар ключ/значение. б) Что значит «не работает»? (Я очистил некоторые из вашего кода, который был явно недействителен Ruby, но я подозреваю, что это было не то, что вам нужно.) – Phrogz

+0

Вы нашли решение этой проблемы? Не забудьте отметить правильный ответ! :) – sethvargo

ответ

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 

Другие случаи (более общие)

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