Monkeyble un callback Ansible de tests unitaires
Je vous propose de découvrir monkeyble, une collection Ansible qui peut vous aider à tester vos playbooks mais pas que. En effet, il permet aussi de combler un manque au mode check, qu’il fonctionne dans tous les cas via un mode patching. Voyons cela en détail
Introduction
Il arrive parfois que certains playbooks ou rôles Ansible ne fonctionnent plus suite à une montée de version d’une collection, voir d’Ansible. Et souvent, il est compliqué de détecter la cause principale de ce dysfonctionnement. Monkeyble permet de mettre en place des tests unitaires sur les données en entrée et en sortie des modules.
Dans certains contextes complexes, il est aussi compliqué d’obtenir des environnements de tests à l’image de la production. De plus le mode check demande de mettre en place des ‘mocks’, des applications qui simulent le fonctionnement des applications réelles pour qu’ils fonctionnent. Et là aussi monkeyble apporte une solution plus simple et permettant de modifier les réponses d’un module à la volée permettant à un playbook lancé dans ce mode d’aller au bout sans échec.
Installation de Monkeyble
L’installation peut se faire de plusieurs façons, mais je fais le choix de l’installer classiquement via un fichier requirements.yml :
Pour gérer finement vos dépendances par projet, je vous conseille de les
installer localement en créant un fichier ansible.cfg
. Profitons-en pour
activer le callback
:
Vous remarquez que j’installe également caradoc, [un autre callback dont je vous
ai parlé il y a quelques jours] (/post/ansible-callback-caradoc/) qui permet
d’écrire des traces complètes localement de toutes les taches de vos
playbooks. À eux deux, à qui on ajoute
molecule et on a tout ce qu’il faut pour
valider et debuger votre infra-as-code
Ansible dans un pipeline de CI. Je
lance l’installation :
Utilisation du framework de test Monkeyble
Bon tout est en place, reste plus qu’à tester son fonctionnement.
Création de tests unitaires
Tests sur les variables en entrée
Je reprends le test présent sur la documentation de Monkeyble ↗ :
Il faut créer un fichier de test monkeyble.yml
: avec ce contenu :
La structure est assez simple. On voit que l’on peut créer plusieurs jeux de
test en les nommant. On retrouve aussi la syntaxe utilisée dans Ansible. Les
tâches à tester se déclarent en récupérant le nom utilisé dans la tache ansible,
donc attention à bien les reprendre en les copiant/collant. Pour plus de clarté
voici le code du playbook test.yml
:
Monkeyble permet deux types de tests:
- les tests en entrée de taches
test_input
sur les variables, un peu comme avec le module assert d’Ansible - les tests en sortie de taches
test_output
, nous verrons cela dans un autre test
Lançons notre test :
Monkeyble prend en charge les méthodes de tests de la librairie unittest de Python:
- assert_equal
- assert_not_equal
- assert_in
- assert_not_in
- assert_true
- assert_false
- assert_is_none
- assert_is_not_none
- assert_list_equal
- assert_dict_equal
Tests sur les dictionnaires en sortie de tâches
On peut également créer des tests sur les dictionnaires retournés par la tâche. Nous utiliser un autre playbook :
Modifions notre test comme ceci :
Si vous êtes attentif, j’ai supprimé une lettre sur le résultat attendu, donc il devrait sortir en erreur. Lançons-le :
Nickel ca fonctionne comme attendu.
Tests sur l’état d’une tâche
On peut aussi ajouter des tests d’états des tâches. Modifions notre playbook en demandant l’installation d’un package sans les droits :
On relance :
La tâche a bien planté et le test est donc valide. On peut aussi tester :
should_be_skipped: false
should_be_changed: true
Mise en place de Mocks
Monkeyble permet de créer des mocks, en subsituant un module par un autre.
Modifions notre playbook de test, pour créer une machine virtuelle dans un vcenter VmWare. Le parfait exemple de mock :
Et notre fichier de test :
On peut voir que l’on peut forcer la sortie avec result_dict pour ques les tâches suivantes du playbook puissent fonctionner.
Lançons notre test :
Excellent le module a bien retourné un résultat et a pu sortir avec un état non
failed
et retourner le résultat défini dans le scenario monkeyble.
Conclusion
Cette collection Ansible Monkeyble vient vraiment combler un manque dans Ansible.
Je vais rapidement l’intégrer dans mes environnements de développement. Couplé à Caracdoc et Molecule et le code Ansible sera parfaitement testé. Faut-il encore que les développeurs acceptent d’écrire des tests !
Merci à Nicolas Marcq pour cette belle découverte.
Plus d’infos :
- Le projet Monkeyble ↗
- Le documentation ↗
- Un artcile sur LinuxFr ↗ écrit par l’auteur lui-même.