为每个循环主厨每个循环

时间:2016-10-17 15:53:16

标签: ruby chef erb

我有这些数组

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:

服务服务3

port 11003

感谢任何帮助。

谢谢你, 加布里埃尔

2 个答案:

答案 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

虽然这不是一个惯用的厨师。