Ruby and Chef: разрешить и заменить значения в хэше - PullRequest
0 голосов
/ 08 февраля 2012

Я использую opscode chef для автоматизации развертывания кластера MySQL.Я хочу поместить нужные хосты в файл JSON, затем разрешить chef разрешить эти имена хостов во внутренние 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-адреса, но я не совсем понимаю, как получить каждый ключ и значение, разрешить значение,затем замените его на разрешенное значение.

1 Ответ

0 голосов
/ 08 февраля 2012

В 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 ]
...