Quelqu'un peut-il vous expliquer comment fonctionne le chef? C'est une question assez large, de sorte que de l'affrier, j'ai cette recette très simple qui boucle sur une liste d'utilisateurs et crée chacun si elles n'existent pas déjà. Ça ne marche pas.
D'après ce que je peux dire, la boucle semble se produire comme on m'attendrait. Une fois que la boucle a terminé mes commandes Bash pour créer chaque utilisateur sont exécutées, une fois pour chaque itération de la boucle. Toutefois, lorsque les commandes Bash sont exécutées, elles ne semblent avoir que la valeur de l'utilisateur à partir de la première itération de la 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 relevés de puts 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
faites votre nom de script unique ...
bash "create_user_#{user}" do
FWIW, j'ai utilisé https://github.com/fnichol/chef-user plusieurs fois, ce qui vous permet de créer/supprimer des utilisateurs basés sur des attributs et des données de données.