0

我正在使用 opscode chef 来自动化 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 中,当您有一个 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 ]
于 2012-02-08T04:41:38.677 回答