Publié par
Il y a 4 années · 7 minutes · DevOps

Test Driven Infrastructure avec Chef (Episode 1)

Le but de cette série de tutoriels est de montrer pas à pas comment monter un environnement pour faire du Test Driven Infrastructure avec l’outil de provisioning Chef (ex-Opscode Chef) en suivant l’exemple du livre Test-Driven Infrastructure with Chef, 2nd Edition by Stephen Nelson-Smith.

Cet article est destiné aux développeurs débutants ou expérimentés dans la création de cookbooks Chef. Il faut à minima une compréhension des concepts introduits par Chef.

Les outils utilisés dans cette série de tutoriels seront (par ordre d’apparition) :

  • Ruby 1.9.x
  • Bundler
  • VirtualBox
  • Vagrant
  • Berkshelf
  • Test-Kitchen
  • Cucumber
  • ServerSpec
  • ChefSpec
  • Foodcritic
  • Rubocop
  • Guard
  • Rake


Mises à jour du 15/07/2014 :

  • Réajustement de la description des articles de la série
  • Présentation du contenu de l’exemple Wonderstuff du livre de Stephen Nelson-Smith

Composition de cette série de tutoriels

Cette série est structurée comme suit. (Ce plan est un backlog susceptible de changer au fur et à mesure de son implémentation, dans la plus pure tradition agile :) )

Le présent article montre comment : créer un environnement de développement sain pour cookbooks ; installer les outils de bases permettant le test automatisé de cookbooks ; créer un squelette de cookbook prêt à l’emploi.

Un second article montrera comment : écrire et lancer un test d’acceptance avec Cucumber et Test-Kitchen, un test d’intégration avec ServerSpec (et Test-Kitchen), un test unitaire avec ChefSpec.

Un troisième article montrera comment : écrire une recette qui va faire passer tous les tests ; vérifier la bonne formulation de vos recettes avec Foodcritic et de votre code Ruby avec Rubocop lancer automatiquement les séries de tests à chaque changement d’un fichier source à l’aide de Guard.

Un quatrième article montrera comment écrire un RakeFile pour lancer des ensembles de taches automatiquement.

Contenu de l’exemple Wonderstuff du livre de Stephen Nelson-Smith

Nous allons utiliser l’exemple Wonderstuff comme décrit dans le livre de Stephen Nelson-Smith. Celui-ci consiste à créer un serveur web lighttpd qui servira une page simple comprenant le texte « Wonderstuff Design is a boutique graphics design agency. »

Préparer son environnement de développement

Installation d’un environnement sain

Pour installer un environnement sain pour le développement de cookbook, j’ai trouvé l’article suivant très complet : http://misheska.com/blog/2013/12/26/set-up-a-sane-ruby-cookbook-authoring-environment-for-chef/ . Suivez cet article, qui couvre MacOs, Linux et Windows. (dans cette série, nous allons travailler sur MacOs)

L’article présente les points suivants :

  • Installation de Xcode Command Line Tools (inclus Git)
  • Installation du gestionnaire de package Homebrew
  • Installation du compilateur Apple GCC 4.2
  • Installation de Chruby et de Ruby-Build via Homebrew
  • Compilation de Ruby 1.9.x à partir du source (version utilisée dans cet article : ruby 1.9.3p545 (2014-02-24 revision 45159) [x86_64-darwin13.1.0])
  • Installation de Bundler (version utilisée dans cet article : 1.6.2)

Installation de VirtualBox

Installer VirtualBox en téléchargeant l’application sur https://www.virtualbox.org/wiki/Downloads (la version qui a été utilisée pour l’écriture de cet article est la 4.3.10)

Installation de Vagrant

Installer Vagrant en téléchargeant l’application sur http://www.vagrantup.com/downloads.html (la version qui a été utilisée pour l’écriture de cet article est la 1.5.3)

Initialiser le repo Git

Créer le répertoire qui va contenir votre cookbook, et initialisez-y votre repo Git :

$ git init wonderstuff
Initialized empty Git repository in /path/to/your/cookbooks/directory/wonderstuff/.git/
$ cd wonderstuff

Préparer son environnement de test


Note : nous n’utilisons pas Chef DK, le Chef Development Kit, dans cet article pour deux raisons :

  1. Il est sorti récemment et nous n’avons pas eu le temps de le tester complètement :)
  2. Nous préférons aller au travers d’une installation plus manuelle de l’environnement pour :
    1. pouvoir mieux comprendre comment fonctionne ce dernier
    2. créer des repos non dépendant d’autres installations sur la machine de développement hôte.

Gestion des dépendances des cookbooks avec Berkshelf

Les dépendances entre les différents cookbooks seront gérés avec Berkshelf (version 3.1.3 à l’écriture de l’article).


Info : Vous pourrez trouver plus d’information sur Berkshelf en suivant l’url http://berkshelf.com/


Ajouter Berkshelf au fichier Gemfile que vous devez créer dans le répertoire racine. Berkshelf sera alors automatiquement installé par Bundler lors d’un bundle install . Nous allons utiliser le même processus pour tous les autres gems et outils de ce tutoriel. Nous ne lancerons bundle install que lorsqu’un nombre suffisant de gem seront déclaré à chaque étape.

source 'https://rubygems.org'
 
gem 'berkshelf', '3.1.3'

Note : Dans les articles de cette série, nous allons prendre des versions exactes pour chaque Rubygem utilisés afin de que le code présenté puisse reproduire exactement le comportement attendu lorsque vous le mettrez en pratique. Ainsi, par exemple, nous utilisons la version spécifique 3.1.3 pour berkshelf :

gem 'berkshelf', '3.1.3'

Vous pouvez décider de prendre des versions plus récentes de ces Rubygems, qui suivent normalement le versionnement sémantique, notamment :

  • des mises à jour de correction d’anomalies (incrément sur le troisième chiffre, c’est à dire 0.0.X), en utilisant dans cet exemple : gem 'berkshelf', '~> 3.1.3'
  • des mises à jour mineures ajoutant des fonctionnalités mais avec rétro-compatibilité (incrément sur le deuxième chiffre, c’est à dire 0.X.0) en utilisant dans cet exemple : gem 'berkshelf', '~> 3.1'

Une fois que nous aurons réussi à faire fonctionner tous les exemples de cette série d’articles, la seconde option sera conseillée.

Pour plus d’information sur les Gemfiles, se reporter sur http://bundler.io/v1.6/gemfile.html.


Environnement de test avec Test-Kitchen

Nous allons utiliser Test-Kitchen (version 1.2.1 à l’écriture de l’article) qui permet de créer automatiquement les VM et lancer les tests automatiquement. Nous utiliserons son plugin kitchen-vagrant (version 0.15.0 à l’écriture de l’article) qui permettra à Test-Kitchen de piloter le cycle de vie des VM en utilisant Vagrant.


Info : vous pourrez trouver plus d’information sur Test-Kitchen en suivant l’url http://kitchen.ci/. Cette vidéo de présentation de Test-Kitchen donne pas mal d’information sur les origines de l’outil et ce qu’il fait d’utile.


Ajouter Test-Kitchen au Gemfile ainsi que son plugin kitchen-vagrant :

gem 'test-kitchen', '1.2.1'
gem 'kitchen-vagrant', '0.15.0'

Lancement de l’installation des Gems avec Bundler

Il ne reste plus qu’à installer tous les composants avec Bundler :

$ bundle install
Fetching gem metadata from https://rubygems.org/.......
Fetching additional metadata from https://rubygems.org/..
Resolving dependencies...
Using addressable 2.3.6
Using multipart-post 2.0.0
Using faraday 0.9.0
Using berkshelf-api-client 1.2.0
Using buff-extensions 1.0.0
Using hashie 2.1.2
Using varia_model 0.4.0
Using buff-config 1.0.0
Using buff-ruby_engine 0.1.0
Using buff-shell_out 0.1.1
Using hitimes 1.2.1
Installing timers 3.0.1
Using celluloid 0.16.0.pre2
Using nio4r 1.0.0
Using celluloid-io 0.16.0.pre2
Using minitar 0.5.4
Using sawyer 0.5.4
Using octokit 3.2.0
Using retryable 1.3.5
Using buff-ignore 1.1.1
Using erubis 2.7.0
Using json 1.8.1
Using mixlib-log 1.6.0
Using mixlib-authentication 1.3.0
Using net-http-persistent 2.9.4
Using semverse 1.1.0
Using ridley 4.0.0
Using dep-selector-libgecode 1.0.2
Using ffi 1.9.3
Using dep_selector 1.0.3
Using solve 1.2.0
Using thor 0.19.1
Using berkshelf 3.1.3
Using mixlib-shellout 1.4.0
Using net-ssh 2.9.1
Using net-scp 1.2.1
Using safe_yaml 1.0.3
Using test-kitchen 1.2.1
Using kitchen-vagrant 0.15.0
Using bundler 1.6.2
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.

Création du squelette de cookbook

Créer le fichier metadata.rb dans le répertoire racine.

name "wonderstuff"
version "0.1.0" 

Créer le squelette de cookbook avec berks init (ne pas écraser le Gemfile que nous venons de créer) :

$ bundle exec berks init
      create  Berksfile
      create  Thorfile
      create  chefignore
      create  .gitignore
    conflict  Gemfile
Overwrite /Users/emmanuelsciara/Documents/Development/chef/wonderstuff-article/Gemfile? (enter "h" for help) [Ynaqdh] n # <== do not overwrite the Gemfile
        skip  Gemfile
      create  .kitchen.yml
      append  Thorfile
      create  test/integration/default
      append  .gitignore
      append  .gitignore
      create  Vagrantfile
Successfully initialized

Terminer le squelette :

$ mkdir recipes
$ touch recipes/default.rb

Commiter le squelette et tout le travail fait jusqu’à présent dans Git :

$ git add --all
$ git commit -m 'first commit with skeleton'

A suivre…

Voilà, vous avez maintenant :

  • un environnement sain et isolé
  • les outils de base (Berkshelf et Test-Kitchen) pour travailler avec des cookbooks sur votre machine de développement
  • un squelette de cookbook prêt à utiliser.

Dans le prochain article, nous allons écrire avec Cucumber un test d’acceptance (BDD) décrivant – en termes de business – ce qui vous voulez obtenir de ce cookbook.

One thought on “Test Driven Infrastructure avec Chef (Episode 1)”

  1. Publié par Benjamin Gandon, Il y a 3 années

    Pour VirtualBox et Vagrant, il est possible d’installer cask pour simplifier leur installation :

    $ brew cask install virtualbox

    $ brew cask install vagrant

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *