Bon, les choses sérieuses vont commencer ! Je vous sens frétiller avec Chef installé sur votre machine :)

<3615MaVie>
Je pensais le publier beaucoup plus tôt, mais je suis super pris au boulot en ce moment et le soir je suis lessivé. L’article étant trop long, je vais le publier en 2 parties. Une aujourd’hui et une autre début de semaine prochaine.
</3615MaVie>

Pour poser les bases, je suis un gros fan de TDD (Test Driven Development) et BDD (Behavior Driven Development).

Ce qu’il faut retenir, c’est les étapes :

Schéma TDD

Schéma TDD

Étape 1, écrire le test qui forcement est rouge.

Étape 2, écrire le code le plus simple pour passer le test au vert.

Étape 3, regarder si l’on ne peut pas « refactorer » tout ça en gardant les tests verts.

Avec les priorités :

– BDD -> le « fonctionnel »

– TDD -> les tests unitaires/intégration

Vous l’avez compris, il faut donc commencer par écrire le mode de fonctionnement voulu du cookbook. Sauf que je sais que là, vous êtes sur les dents. Et que vous avez envie de jouer concrètement avec Chef.

Je vais donc vous montrer maintenant comment faire des tests bas niveau avec Chef.

Première étape, récupérez de quoi avoir un repository « perso » :

% cd /mon/repertoire/de/larticle/precedent
% ls
Gemfile Gemfile.lock README.md
% git clone https://github.com/opscode/chef-repo.git
Cloning into 'chef-repo'...
remote: Counting objects: 209, done.
remote: Compressing objects: 100% (126/126), done.
remote: Total 209 (delta 75), reused 170 (delta 49)
Receiving objects: 100% (209/209), 35.05 KiB, done.
Resolving deltas: 100% (75/75), done.
% cd chef-repo
% ls
LICENSE Rakefile chefignore cookbooks environments
README.md certificates config data_bags roles
% rm -rf .git
% mv README.md ../README-chef.md # Si vous voulez garder votre README.md d'origine
% mv * ..
mv .gitignore ..
% cd ..
% git add .gitignore *
% git commit -m "Add a clean chef repo"
[master 2e7e758] Add a clean chef repo
11 files changed, 545 insertions(+), 1 deletion(-)
create mode 100644 LICENSE
create mode 100644 README-chef.md
create mode 100644 Rakefile
create mode 100644 certificates/README.md
create mode 100644 chefignore
create mode 100644 config/rake.rb
create mode 100644 cookbooks/README.md
create mode 100644 data_bags/README.md
create mode 100644 environments/README.md
create mode 100644 roles/README.md

Vous avez maintenant de quoi faire des cookbooks pour votre environnement cible de Chef.

Je vais prendre un exemple qui va consister à mettre en place avec un Raspberry π pour en faire un serveur Web afin d’héberger des applications Ruby.

GO !

% knife cookbook create nginx_unicorn
% git status
# On branch master
# Untracked files:
# cookbooks/nginx_unicorn/
% git add cookbooks/nginx_unicorn ; git commit -m "Fresh nginx_unicorn cookbook"
[master 5be0d84] Fresh nginx_unicorn cookbook
4 files changed, 95 insertions(+)
create mode 100644 cookbooks/nginx_unicorn/CHANGELOG.md
create mode 100644 cookbooks/nginx_unicorn/README.md
create mode 100644 cookbooks/nginx_unicorn/metadata.rb
create mode 100644 cookbooks/nginx_unicorn/recipes/default.rb

Et voilà, vous avez fait votre premier cookbook :)

Pour aller un peu plus loin, nous allons avoir besoin de plusieurs Gem supplémentaires. Dans le dernier article, nous avons utilisé :

% gem install chef

Pour simplifier la compatibilité des Gems (mais aussi pour votre bien) utilisé dans l’article avec ce que vous pourrez utiliser chez vous. Je vais installer Bundler qui en 3 mots est un gestionnaire de Gem Ruby. Laissez vous faire, ça va marcher tout seul :)

% gem install bundler --no-ri --no-rdoc
Successfully installed bundler-1.3.5
1 gem installed

Jusqu’a présent, j’avais dans mon Gemfile ceci :

source "https://rubygems.org"

gem "chef"

Pour mettre à jour :

% bundle
Using erubis (2.7.0)
Using highline (1.6.18)
Using json (1.7.7)
Using mixlib-log (1.6.0)
Using mixlib-authentication (1.3.0)
Using mixlib-cli (1.3.0)
Using mixlib-config (1.1.2)
Using mixlib-shellout (1.1.0)
Using net-ssh (2.6.7)
Using net-ssh-gateway (1.2.0)
Using net-ssh-multi (1.1)
Using ipaddress (0.8.0)
Using systemu (2.5.2)
Using yajl-ruby (1.1.0)
Using ohai (6.16.0)
Using mime-types (1.23)
Using rest-client (1.6.7)
Using chef (11.4.4)
Using bundler (1.3.5)
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.

Il vous a ajouté un fichier Gemfile.lock qui permet de « figer » les versions de Gem à utiliser dans votre projet.

Vous pouvez dès maintenant les ajouter dans Git (je l’avais déjà fait, c’est pour ça que vous ne trouverez pas ce commit sur mon Github) :

git add Gemfile* ; git commit -m "Add Gemfile(s)"

Nous allons metre à jour le fichier Gemfile :

# All you need for manage chef repository
source "https://rubygems.org"

gem "chef"
gem "foodcritic"
gem "chefspec"

gem "guard"
gem "guard-rspec"

if RUBY_PLATFORM =~ /darwin/i
  gem 'rb-fsevent', '~&gt; 0.9.1'
  gem 'growl'
end

Un petit coup de bundle :

Resolving dependencies...
Using builder (3.2.0)
Using erubis (2.7.0)
[...]
Using treetop (1.4.12)
Using foodcritic (2.1.0)
Using bundler (1.3.5)
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.

Voilà, voilà. Une fois tout ça en place nous allons dans l’article suivant écrire les tests puis nos premiers éléments de recette.

Vous pouvez passer à la suite ici.