web-dev-qa-db-fra.com

Quelle est la bonne façon de boucler dans une recette chique (solo)?

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
8

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.

5
Darrin Holst