Introduction à Puppet
Mise à jour :
Puppet
est un outil de gestion de configuration qui fonctionne
principalement en mode client/serveur. En effet, il est également possible
d’appliquer le code directement sur une machine cliente sans faire appel au
serveur. Pour rappel un outil de gestion de configuration a pour but :
- de déployer des configurations sur les serveurs ;
- d’automatiser le déploiement et la configuration de logiciels ;
- de s’assurer que les configurations voulues sont celles qui sont appliquées ;
Le serveur est appelé le master
et les clients des nodes
. Sur les nodes sont
installées un agent qui se charge d’obtenir les configurations déclarées sur le
master. Le master regroupe les classes en ce qu’on appelle un catalogue et qui
sera appliqué sur le node par l’agent. Dans le cas où la configuration décrite
n’est pas celle présente sur le node, l’agent appliquera les changements
nécessaires pour la respecter.
Le langage de Puppet
Les manifests
Le code Puppet utilise des fichiers .pp
qui sont écrits dans un langage
déclaratif basé sur du Ruby. Ces fichiers sont appelés des manifests
. Dans ces
manifests on utilise des ressources de base qui peuvent être de type compte
user, group, file, package, service, exec et cron. Ces ressources présentent un
haut niveau d’abstraction. Par exemple, il n’est pas nécessaire d’indiquer le
système de package à utiliser sur la distribution cible du node. Pour identifier
le système hôte, l’agent puppet utilise Facter
qui décrit le système sous la
forme d’un fichier JSON.
Les classes
Une classe est une collection de ressources liées qui, une fois la classe définie, peuvent être déclarées comme une seule unité. Par exemple, une classe peut contenir toutes les ressources (telles que des fichiers, des paramètres, des modules et des scripts) nécessaires pour configurer le serveur Web Apache sur un hôte. Les classes peuvent également déclarer d’autres classes.
Les modules
Un module est un ensemble de classes, de types de ressources, de fichiers, de fonctions et de modèles, regroupés pour atteindre un objectif particulier. Par exemple, un module peut configurer une instance de serveur Web Apache. Des modules écrits par la communauté Puppet sont disponibles sur la PuppetForge ↗.
Apprendre Puppet avec Vagrant
Comme pour Ansible
, Salt
et Chef
, Vagrant
met à disposition un
provisionner
prenant en charge les manifests Puppet
.
Voici un exemple de fichier Vagrantfile l’utilisant :
Vous remarquez que j’installe juste le puppet-agent
et j’indique le chemin du
manifest
à utiliser. D’ailleurs écrivons le :
Ecriture d’un simple manifest
Nous allons tout simplement demander l’installation du package apache. Il suffit
donc de créer le fichier init.pp
dans le répertoire puppet/manifests
:
Nous utilisons deux simples ressources une de type package ↗ et une autre de type notify ↗. Vous pouvez retrouver tous les arguments de ces ressources en suivant leur lien respectif. Une fois dessus vous serez capable d’utiliser n’importe quelle autre type de ressource Puppet.
Utilisation de modules de la puppetForge
Maintenant que l’on sait écrire de simples manifests voyons comment récupérer et utiliser des modules Puppet sur la puppetForge ↗.
Pour télécharger les modules, il faut au préalable installer le puppet-agent :
Ensuite on crée le répertoire et on y télécharge le module désiré :
Notre module est installé localement. Je vais l’utiliser dans mon manifest.
Remplacer le contenu du fichier init.pp
avec ces lignes (on remplace package
par le module) :
On relance notre box Vagrant. Comme pour Chef il faut utiliser la commande reload pour recharger les modifications faites localement :
Maintenant que nous savons utiliser un module de la forge voyons comment en écrire.
Ecriture d’un simple module
Dans un premier temps installons le PDK pour créer la structure de notre module:
Maintenant dans le répertoire puppet/modules créons le squelette de notre module test:
Nous avons la structure, créons notre première classe.
Pour cela éditer le fichier puppet/modules/apache2/manifests/init.pp
. Prenons
comme exemple l’installation du serveur web apache2 :
Pour valider votre code, nous allons utiliser la commande validate de pdk 👍 :
Pour vous aider à écrire votre code Puppet correctement, vous pouvez installer l’extension vscode officielle ↗. Elle est plutôt complète on y retrouve : linting, indentation, intellisense, debug …
Éditer maintenant le fichier puppet/manifests/init.pp et remplacez les lignes par :
Utilisation des facts
Nous allons simplement ajouter un test vérifiant si le systeme d’exploitation est bien celui attendu. Pour retrouver la structure des facts puppet il suffit de lancer la commande facter. Pour limiter le retour à certains paramètres il suffit d’ajouter le nom derrière :
Ajoutons donc ce test dans notre manifest:
Changez la distribution de base de votre Vagrantfile par une fedora et regarder le résultat :
On détruit et on re-provisionne la machine :
Ca fonctionne.
Utilisation de variables et paramètres
Nous remplacer le fichier index.html par notre propre contenu. Pour cela nous allons déclarer un paramètre content dans notre class apache2. Ce paramètre sera ensuite utilisé dans la ressource file :
Pour déclarer les variables par défaut, nous allons l’ajouter dans le fichier
common.yaml
présent dans le répertoire data
de notre module :
Une autre manière aurait eté de l’ajouter dans la déclaration de la classe :
On relance, on récupère l’adresse IP de notre VM et un petit curl pour vérifier que le contenu est bien celui attendu :
Maintenant pour surcharger le paramètre dans l’instance de notre classe, il
suffit d’ajouter la variable content
dans l’appel de la classe :
On relance et on repasse le curl :
On relance la validation de notre module :
Aie. Il faut documenter la variable. Modifions le code de notre manifest :
C’est réglé.
Plus d’infos sur les paramètres ↗
Utilisation de template
Nous aimerions plutôt que le contenu de notre fichier utilise un template Puppet
(EPP) dans lequel on va injecter notre variable content
. Il faut dans un
premier temps créer le fichier index.epp
dans le répertoire templates
de
notre module :
La syntaxe utilisée pour les templates (pas simple) :
- <%= VAR %> affiche le contenu d’une variable
- <% EXPRESSION %> une instruction interprété
- <%# COMMENT %> un commentaire
- <%- ou -%> supprime le saut de ligne avant ou après
On regarde le résultat :
Plus d’infos
- Site Officiel : puppet.com ↗