为每个循环制作每个循环

Chef each loop for each loop

我有这些数组

services=["service1","service2","service3"]
ports=[11001,11002,11003]

对于服务的每个元素,我需要在 conf.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

听起来很糟糕,结果也很糟糕。

结果应该是 3 个配置文件:

服务-service1.conf:

服务服务1

端口 11001

服务-service2.conf:

服务服务2

端口 11002

服务-service3.conf:

服务-服务3

端口 11003

感谢任何帮助。

谢谢, 加布里埃尔

我会改为使用散列,其中键作为您的服务名称,值作为您的端口号。然后你可以用键和值递增你的散列。

使用您的示例代码,类似于:

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

虽然不是很地道的厨师。

我将如何解决这个问题:

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| 语法来获取第一个变量中的键和值(可能是另一个hash) 在第二个变量中。