Quelqu'un peut-il m'expliquer comment fonctionne le chef? C'est une question assez large, donc pour la réduire, j'ai cette recette très simple qui fait une boucle sur une liste d'utilisateurs et crée chacun d'eux s'ils n'existent pas déjà. Ça ne marche pas.
D'après ce que je peux dire, la boucle semble se produire comme je m'y attendais. Une fois la boucle terminée, mes commandes bash pour créer chaque utilisateur sont exécutées, une fois pour chaque itération de la boucle. Cependant, lorsque les commandes bash sont exécutées, elles ne semblent avoir la valeur utilisateur qu'à partir de la première itération de boucle.
Quelle est la bonne façon d'écrire une recette qui boucle sur des données variables similaires à cet exemple?
Voici la recette:
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
Je teste cela en utilisant Vagrant avec la configuration suivante:
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
Les messages générés par les instructions put dans la recette ressemblent à ceci:
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