Dans le monde de l’automatisation des infrastructures, où la moindre erreur
peut se propager à grande échelle en quelques secondes, la fiabilité et la
sécurité deviennent des piliers incontournables. Mais comment s’assurer que nos
playbooks Ansible, ces précieuses recettes qui orchestrent nos environnements
informatiques, sont à la hauteur de ces enjeux critiques ? La réponse réside
dans une démarche rigoureuse de tests automatisés, une pratique encore trop
souvent négligée dans le processus de développement.
Pourquoi Tester vos Playbooks Ansible avec TestInfra ?
Testinfra se présente comme le gardien de la qualité dans cet univers,
offrant aux développeurs et aux ingénieurs DevOps un outil puissant pour écrire
et exécuter des tests sur leurs infrastructures automatisées. En permettant de
vérifier si les serveurs configurés répondent aux attentes, Testinfra aide à
prévenir les défaillances avant qu’elles ne surviennent, garantissant ainsi que
chaque déploiement reflète exactement nos intentions.
Comme pour les roles, je fais le choix de mettre en place du TDD ou
Test Driven Development pour écrire mes playbooks Ansible, ce qui
consiste à :
Écrire un test.
Vérifier qu’il échoue.
Écrire le code pour faire passer ce test.
Vérifier qu’il passe.
Améliorer le code si-nécessaire, plus maintenable si besoin avant de reprendre
un nouveau cycle.
Testinfra est écrit en python et donc pour l’installer, on va utiliser pip :
Je vais utiliser la structure suivante :
Dans mon inventaire (inventories/hosts) j’ai ceci :
Pour ceux qui ne connaissent pas Vagrant, je vous renvoie à mon billet sur
vagrant. Sinon
voici le contenu du Vagrantfile :
Le playbook provision-playbook.yml:
On peut lancer le provisionnement :
Ecriture d’un premier jeu de tests
A la racine du projet créer un répertoire tests dans lequel nous allons déposer
nos fichiers de tests.
Comme dit plus haut TestInfra est écrit en python et donc les tests reprennent
la syntaxe python.
Mon fichier de test webservers.py :
Cet exemple vérifie :
que le package nginx :
est installé
et sa version est une 1.21.xxx
que le service nginx :
est activé
est démarré
Lancement du test
Pour lancer le test, on utilise cette commande :
On limite le test au groupe webservers avec le fichier de test webservers.py
Vous devriez obtenir ce résultat :
Normal que ça plante puisqu’on a encore rien installé.
Ecriture du playbook
On écrit le playbook first.yml pour installer nginx à partir du dépôt officiel
(pour récupérer des versions récentes) :
On peut le lancer sur nos machines vagrant :
Nginx est installé avec la version 1.21.6
Relance du test
On obtient cette fois ce résultat.
Amélioration du jeu de test
On aimerait pouvoir vérifier que la version du package nginx installé est bien
celle définie dans l’inventaire.
Nous allons utiliser une petite astuce permettant de récupérer les données de
l’inventaire dans notre test de version. Voici le contenu de la nouvelle version
de notre webservers.py.
On lance à nouveau les tests, ça fonctionne.
Connectez-vous sur le host1 en ssh et forcer la mise à jour :
On relance les tests :
Mince la version 1.23.2 n’est pas celle que présente l’inventaire (qui est notre
source de vérité). Notre configuration a drifté. Plus qu’à l’intégrer à votre CI
pour tout contrôler de temps en temps. Il faudra écrire plein d’autres tests :
comme l’absence de package qui ne devrait pas être présent comme tcpdump, …
des droits sur des dossiers critiques
des configurations durcies
…
Vraiment cool non ?
Conclusion
Les tests automatisés, loin d’être un luxe ou une après-pensée, s’avèrent être
un investissement essentiel pour tout projet d’automatisation. Ils offrent une
assurance contre les erreurs humaines et les régressions involontaires,
garantissant que chaque changement apporté à vos infrastructures est validé
contre un ensemble de critères bien définis avant d’être déployé.
En adoptant Testinfra aux côtés d’Ansible, vous bénéficiez d’une
synergie puissante qui élève la qualité et la robustesse de votre automatisation
à de nouveaux sommets. Les exemples et bonnes pratiques partagés ici visent à
vous équiper des connaissances nécessaires pour intégrer efficacement les tests
dans vos projets, vous permettant ainsi de construire des infrastructures plus
sûres et plus résilientes.
Enfin, je vous encourage à ne pas voir les tests comme une corvée ou un
obstacle, mais comme une opportunité d’apprendre, d’innover et d’améliorer
continuellement vos pratiques d’automatisation. Partagez vos expériences, vos
succès et vos défis dans les commentaires ou avec la communauté. La
collaboration et le partage de connaissances sont des piliers de l’amélioration
continue et de la réussite dans le monde de l’automatisation.
Plus loin
Si vous voulez plus de tutorials Ansible je vous renvoie sur le billet de
l’introduction à ansible