为每个循环主厨每个循环

gba*_*aii 2 ruby erb chef-infra

我有这些数组

services=["service1","service2","service3"]
ports=[11001,11002,11003]
Run Code Online (Sandbox Code Playgroud)

对于每个服务元素,我需要在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
Run Code Online (Sandbox Code Playgroud)

听起来很糟糕,结果很糟糕.

结果应该是3个conf文件:

服务service1.conf:

服务服务1

港口11001

服务service2.conf:

服务服务2

港口11002

服务service3.conf:

服务服务3

港口11003

任何帮助表示赞赏.

谢谢,加布里埃尔

Ten*_*bai 6

我该如何解决这个问题:

attributes/default.rb:

default['services']['service1']['port'] = 11001
default['services']['service2']['port'] = 11002
default['services']['service3']['port'] = 11003
Run Code Online (Sandbox Code Playgroud)

(替代语法):

default['services'] = {
 "service1" => { "port" => 11001 },
 "service2" => { "port" => 11002 },
 "service3" => { "port" => 11003 }
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

当迭代哈希(什么节点属性基于)时,您可以使用|key,values|ruby 的语法来获取第一个变量中的键和第二个变量中的值(可能是另一个哈希).