我有这些数组
node['recipe']['services'].each do |serv|
template "/etc/services/conf.d/service-#{serv}.conf" do
source "service-#{serv}.conf.erb"
owner 'serviceaccount'
group 'serviceaccount'
mode '0644'
variables(
:service => serv,
:ports => node['services']['ports']
)
end
end
对于每个服务元素,我需要在conf.erb文件中分配端口的对应元素。 我到现在所拥有的是:
q)table:([id:1 2 3 4 5] books:((`book1`book2);(enlist `book6);(enlist`book3);(enlist`book4);(`book2;`book5)))
q)table
id| books
--| ------------
1 | `book1`book2
2 | ,`book6
3 | ,`book3
4 | ,`book4
5 | `book2`book5
q)
听起来很糟糕,结果很糟糕。
结果应该是3个conf文件:
服务service1.conf:
服务服务1端口11001
服务service2.conf:
服务服务2端口11002
服务service3.conf:
服务服务3port 11003
感谢任何帮助。
谢谢你, 加布里埃尔
答案 0 :(得分:6)
我将如何解决这个问题:
在attributes/default.rb
:
default['services']['service1']['port'] = 11001
default['services']['service2']['port'] = 11002
default['services']['service3']['port'] = 11003
OR (替代语法):
default['services'] = {
"service1" => { "port" => 11001 },
"service2" => { "port" => 11002 },
"service3" => { "port" => 11003 }
}
在recipes/default.rb
:
node['services'].each do |serv,properties|
template "/etc/services/conf.d/service-#{serv}.conf" do
source "service-#{serv}.conf.erb"
owner 'serviceaccount'
group 'serviceaccount'
mode '0644'
variables(
:service => serv,
:ports => properties['port']
)
end
end
当迭代哈希(基于什么节点属性)时,您可以使用ruby的|key,values|
语法来获取第一个变量中的键和第二个变量中的值(可能是另一个哈希值)
答案 1 :(得分:1)
我会使用带键的哈希作为您的服务名称和值作为您的端口号。然后,您可以使用键和值递增哈希值。
使用您的示例代码,例如:
services = { 'service1' => 11001, 'service2' => 11002, 'service3' => 11003 }
然后在你的食谱中:
node['recipe']['services'].each do |serv, port|
template "/etc/services/conf.d/service-#{serv}.conf" do
source "service-#{serv}.conf.erb"
owner 'serviceaccount'
group 'serviceaccount'
mode '0644'
variables(
:service => serv,
:ports => port
)
end
end
虽然这不是一个惯用的厨师。