Chef est donc un outil pour configurer des machines (appelées "node" dans la terminologie Chef). Cela permet par exemple :
Chef n'est pas qu'un simple moteur de scripts shell : il a plutôt une approche descriptive: vous décrivez ce que vous voulez, et Chef se charge de l'installer. Quelques caractéristiques de chef :
package
va savoir si il faut utiliser apt
, rpm
ou yum
.Note : Chef est un outil qui se positionne comme Puppet ou CfEngine. Voir ici pour le pourquoi de ce type d'outils. Chez Octo, nous avons choisi Chef, parce qu'il fallait en choisir un et que Chef nous paraissait plus extensible que Puppet (car il utilise le langage Ruby au lieu d'un DSL). Nous ne regrettons pas ce choix. Mais même si nous avons choisi un outil, les sujets traités dans les articles suivants s'appliqueront souvent autant à Chef qu'à Puppet.
Chef est écrit en Ruby. Il est basé sur le concept de ressources : vous décrivez une liste de ressources, que Chef va déployer. Quelques exemples de ressources : un fichier, un package, un service... La liste des ressources de base fournies par Chef est ici.
Ces ressources vont être regroupées dans des recettes, que vous allez devoir écrire (ou réutiliser).
Qu'est ce qu'une recette ? C'est une description de plusieurs ressources qui forment un ensemble cohérent. Par exemple, nous allons décrire une recette pour memcached. Concrètement, une recette, c'est un ensemble de fichiers écrits en Ruby, organisés d'une certaine façon. Une recette est un dossier contenant les sous dossiers suivants :
Prenons un exemple. (Si vous ne voulez pas lire l'exemple maintenant, vous pouvez sauter à la fin de l'encart gris). Voici la structure d'une recette pour déployer memcached:
La recette proprement dite, c'est le fichier memcached/recipes/default.rb
:
package "memcached"
template "/etc/memcached.conf" do
source "memcached.conf.erb"
variables :port => node.memcached.port
end
On déploie donc 2 ressources :
memcached
/etc/memcached.conf
, qui est basé sur un modèle ERB, dans lequel on va remplacer la variable port
, par sa valeur cible, contenue dans node.memcached.port
(voir l'explication sur les attributs ci dessous). Voir ici pour plus d'informations sur les modèles.Le fichier ERB memcached.conf.erb
est dans memcached/templates/default
:
# memcached default config file
-d
logfile /var/log/memcached.log
-m 296
-p <%= @port %>
-u nobody
-l 127.0.0.1
-P /var/run/memcached.pid
En plus de ces 2 fichiers, il en faut un troisième pour les attributs default.rb
, dans memcached/attributes
:
default[:memcached][:port] = 11211
Cela permet d'ajouter un attribut au noeud courant, avec un valeur par défaut. Cet attribut est utilisé dans la recette, par node.memcached.port
. Chef dispose d'un système de configuration par couche, très bien conçu, qui permet de surcharger la configuration à de multiples endroits.
On peut par exemple utiliser les rôles pour surcharger les configurations. Un rôle est un fichier Json qui contient :
Exemple cache.json
:
{
"name":"cache",
"default_attributes":{
"memcached": { "port" : 11212 }
},
"json_class":"Chef::Role",
"env_run_lists":{},
"run_list":["recipe[memcached]","recipe[munin]"],
"description":"",
"chef_type":"role",
"override_attributes":{}
}
Ce fichier déclare un rôle cache
, pour lequel il faut exécuter les recettes memcached
et munin
(un outil de monitoring), et où le port de memcached
sera 11212.
Note : ces exemples sont disponibles sur github.
Chef a 2 modes de fonctionnement :
Nous avons choisi d'utiliser le mode chef-solo. Ce choix fera l'objet d'un article à lui tout seul :).
Cela étant dit, pour jouer avec chef-solo
, il vous faut plusieurs choses :
chef-solo
Pour l'installer, il y a plusieurs solutions :
gem install chef
si vous avez un environnement ruby configuré.apt-get install chef
si c'est packagé dans votre distribution.Aucune de ces deux méthodes ne nous satisfait vraiment, cela sera le sujet d'un prochain article.
La documentation officielle d'installation est ici.
chef-solo
Il faut deux fichiers de configuration pour chef-solo
. Le premier est un fichier Ruby : solo.rb
, dont le contenu minimal est :
json_attribs "run_list.json"
cookbook_path "/path/to/cookbooks"
La première ligne indique un fichier json contenant la liste des recettes à exécuter. Par exemple :
{"run_list":["recipe[memcached]"]}
La seconde ligne de solo.rb
pointe sur le répertoire contenant les recettes Chef.
Où trouver des recettes ? Vous pouvez les écrire vous même, ce n'est pas très compliqué. Sinon, il y en a plein sur internet chez 37 signals, Opscode (la boîte derrière Chef), ou là (ceci est un spoiler pour la suite).
Pour utiliser l'exemple memcached
ci dessus, vous pouver cloner le dépôt github (git clone git://github.com/bpaquet/devops-corner.git
), puis aller dans le dossier devops-corner/chef_for_dummies
. Tous les fichiers nécessaires au lancement de Chef y sont.
Une fois que vous avez tout ça, il ne reste qu'à lancer Chef :
chef-solo -c solo.rb
Et c'est parti !
Cette introduction très rapide sur Chef nous servira de base pour les articles suivants. Pour aller plus loin :
C'était l'épisode 1. N'hésitez pas à utiliser les commentaires pour des suggestions d'améliorations ou pour poser des questions...