Kann mir bitte jemand erklären, wie der Koch arbeitet? Das ist eine ziemlich weit gefasste Frage. Um sie einzugrenzen, habe ich dieses sehr einfache Rezept, das eine Liste von Benutzern durchläuft und jedes einzelne erstellt, wenn sie noch nicht vorhanden sind. Es funktioniert nicht.
Soweit ich weiß, scheint die Schleife so zu verlaufen, wie ich es erwarten würde. Sobald die Schleife abgeschlossen ist, werden meine Bash-Befehle zum Erstellen jedes Benutzers einmal für jede Iteration in der Schleife ausgeführt. Wenn die Bash-Befehle ausgeführt werden, scheinen sie jedoch nur den Benutzerwert aus der ersten Schleifeniteration zu haben.
Was ist der richtige Weg, um ein Rezept zu schreiben, das ähnliche Daten wie in diesem Beispiel durchläuft?
Hier ist das Rezept:
node[:users].each do |user|
puts "in loop for #{user['username']}"
bash "create_user" do
user "root"
code do
puts "running 'useradd' for #{user['username']}"
"useradd #{user['username']}"
end
not_if do
puts "checking /etc/passwd for #{user['username']}"
"cat /etc/passwd | grep #{user['username']}"
end
end
end
Ich teste dies mit Vagrant mit dem folgenden Setup:
Vagrant::Config.run do |config|
config.vm.box = "precise32"
config.vm.box_url = "http://files.vagrantup.com/precise32.box"
config.vm.provision :chef_solo do |chef|
chef.add_recipe "sample"
chef.json = {
:users => [
{:username => 'testA'},
{:username => 'testB'},
{:username => 'testC'},
{:username => 'testD'},
{:username => 'testE'},
],
}
end
end
Die Nachrichten, die von den Puts-Anweisungen im Rezept generiert werden, sehen folgendermaßen aus:
2013-03-08T01:03:46+00:00] INFO: Start handlers complete.
in loop for testA
in loop for testB
in loop for testC
in loop for testD
in loop for testE
[2013-03-08T01:03:46+00:00] INFO: Processing bash[create_user] action run (sample::default line 5)
checking /etc/passwd for testA
[2013-03-08T01:03:46+00:00] INFO: Processing bash[create_user] action run (sample::default line 5)
checking /etc/passwd for testA
[2013-03-08T01:03:46+00:00] INFO: Processing bash[create_user] action run (sample::default line 5)
checking /etc/passwd for testA
[2013-03-08T01:03:46+00:00] INFO: Processing bash[create_user] action run (sample::default line 5)
checking /etc/passwd for testA
[2013-03-08T01:03:46+00:00] INFO: Processing bash[create_user] action run (sample::default line 5)
checking /etc/passwd for testA
[2013-03-08T01:03:46+00:00] INFO: Chef Run complete in 0.026071 seconds