2016-10-17 5 views
1

Ich habe diese ArraysChef jede Schleife für jede Schleife

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

Für jedes Element von Dienstleistungen Ich brauche die entsprechende Element-Ports in einer conf.erb Datei zuweisen. Was ich bis jetzt haben, ist:

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 

Es klingt schlecht, und das Ergebnis ist schlecht.

Das Ergebnis sollte 3 conf Dateien sein:

Service-service1.conf:

Service-service1

Port 11001

Service-service2.conf:

Service-service2

port 11002

ser Vize-service3.conf:

Service-service3

Port 11003

Jede Hilfe sehr geschätzt wird.

Danke, Gabriel

+0

Wo definieren Sie diese Arrays? Sie sehen nicht wie Attribute aus ... – Tensibai

Antwort

2

Wie würde ich das Problem angehen:

In attributes/default.rb:

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

OR (alternative Syntax):

default['services'] = { 
"service1" => { "port" => 11001 }, 
"service2" => { "port" => 11002 }, 
"service3" => { "port" => 11003 } 
} 

Im 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 

Beim Iterieren über einen Hash (basierend auf welchen Knotenattributen) können Sie die Syntax von Rubyverwenden, um den Schlüssel in der ersten Variablen und den Wert (der ein anderer Hash sein könnte) in der zweiten Variablen abzurufen.

1

ich stattdessen einen Hash mit den Tasten als Service-Namen und Werte als Portnummern verwenden würde. Dann können Sie Ihren Hash mit dem Schlüssel und dem Wert erhöhen.

Ihr Beispielcode verwenden, so etwas wie:

services = { 'service1' => 11001, 'service2' => 11002, 'service3' => 11003 } 

Und dann in Ihrem Rezept:

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 

Es ist nicht sehr idiomatisch Koch though.

+0

yep. Danke! – gbaii