2016-10-17 6 views
1

У меня есть эти массивыChef каждого цикл для каждого цикла

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:

сервис-service1

порт 11001

сервис-service2.conf:

сервис-service2

порт 11002

ser вице-service3.conf:

сервис-service3

порт 11003

Любая помощь приветствуется.

Спасибо, Габриэля

+0

Где вы определяете эти массивы? Они не похожи на атрибуты ... – Tensibai

ответ

2

Как бы решить эту проблему:

В attributes/default.rb:

default['services']['service1']['port'] = 11001 
default['services']['service2']['port'] = 11002 
default['services']['service3']['port'] = 11003 

ИЛИ (альтернативный синтаксис):

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

Я бы вместо того, чтобы использовать хэш с ключами, как ваши имена служб и значение, как ваши номера портов. Затем вы можете увеличивать свой хэш с помощью ключа и значения.

Использование пример кода, что-то вроде:

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 

Это не очень идиоматических повар, хотя.

+0

yep. Спасибо! – gbaii