Tester ses rôles Ansible avec Serverspec
Pour poursuivre notre formation Ansible, au menu du jour les tests des rôles.
Introduction
Ansible est un outil Devops largement utilisé et suivi par une très grande communauté. Pour valider mes rôles, j’utilisais jusqu’à peu molecule, mais dans une démarche de veille techno, j’ai découvert Kitchen-CI ↗ et ça été une belle découverte.
En effet molecule est un produit qui évolue sans cesse, imposant des ruptures importantes à chaque nouvelle version. Et là Kitchen-CI vient vraiment simplifier la partie test des rôles Ansible. J’aurais pu aussi utiliser ansible-test, mais ce sera pour une prochaine fois quand je créerai des collections ansible.
Kitchen-CI
Kitchen-CI est un outil Ruby développé par l’équipe en charge du produit de configuration Chef.
Kitchen-CI, permet de tester le résultat de l’exécution de divers outils de provisionning dont Terraform et Ansible. Vous voyez tout de suite l’intérêt : un outil commun pour réaliser une bonne partie de vos tests.
En effet Kitchen-CI est modulaire via ses drivers et modules qui lui permettent de fonctionner avec une grande partie des plateformes Onprem et Cloud : Docker, Vagrant, Terraform, AWS, Azure.
Automatiser les tests d’un rôle Ansible
Je vais, dans ce premier billet vous expliquer comment mettre en place des tests sur un rôle Ansible et ce, de manière simple avec Docker.
Installation des prérequis
Personnellement je l’installe dans ma VM de test provisionné avec Multipass.
Commençons par installer ruby, python3 docker :
Donnons les droits de lancer des commandes docker à votre utilisateur
La seconde ligne permet de récupérer les droits du groupe sans à se déconnecter :)
Et ansible bien sur :
Maintenant on installe tous les produits Kitchen nécessaire à notre cas
J’ai mis aussi vagrant.
On teste
Normalement on devrait partir d’une feuille blanche pour faire du TDD mais là on va prendre un rôle existant pour y ajouter la partie test. On récupère un rôle permettant d’installer apache fourni par Jeff Geerling :
Il faut créer ces répertoires et ces fichiers :
Dans le fichier .kitchen.yml on décrit notre infrastructure de test :
Quelques explications sur la structure de kitchen
Kitchen utilise des :
- drivers ici j’ai choisi Docker, j’effectuerai des tests en local.
- provisioners : j’ai bien sur choisi Ansible.
- transports: paramétrages des sessions ssh
- verifiers : j’ai choisi ServerSpec.
- platforms: permet de définir comment est construit la machine de test.
- suites: ce paramètre permet de configurer toute une stack si besoin, composé de plusieurs machines. Ici on se limite à une seule machine
Premières commandes kitchen
On peut déjà lancer les premières commandes kichen:
- kitchen list qui permet de lister les instances.
- kitchen create qui va créer les machines nécessaires au test.
On voit que kitchen à instancier une machine docker :)
un playbook
Ajouter ceci au fichier test/integration/default/default.yml :
On lance l’installation
Cela se fait au moyen de la commande kitchen converge. Kitchen va installer tout ce qu’il faut pour exécuter le playbook et lancer le test. En cas d’erreur, vous pouvez vous connecter à votre instance avec la commande kitchen login. Si vous corrigez des choses relancer la commande kitchen converge.
Écriture d’un test
On va limiter le test à l’ajout du user apache. Ajouter ceci au fichier test/integration/serverspec/install_apache_spec.rb :
Il faut aussi ajouter ceci dans le fichier test/integration/spec_helper.rb. :
Lancement des tests
Cela se fait au moyen de la commande kitchen verify. Kitchen install à nouveau tout ce qu’il faut pour exécuter les tests.
Intégrer de nouvelles plateformes
Vous voulez ajouter une machine :) Ajouter juste ceci dans votre fichier .kitchen.yaml dans la partie platforms :
On relance les commandes kitchen converge et kitchen verify.
Il faut corriger ! Je vous en laisse le soin.
On peut aussi tout en une seule commande : kitchen test. Cela va provisionner, installer, tester et détruire. Tant qu’on parle de destruction, il existe la commande kitchen destroy à utiliser au besoin.
La suite de la formation ansible dans de prochains billets avec peut-être un test avec ansible-test et le développement des collections.