Un débogueur pour Ansible
Après la découverte de Molecule et voulant gratter un peu plus loin le sujet des bonnes pratique Ansible, j'ai regardé la formation "Testing and Debugging Ansible Automation" sur Pluralsight. Je ne l'ai pas trouvé fofolle, jusqu'au chapitre "Using the Playbook Debugger" 😲. Je n'en avais jamais entendu parler ... Si vous non plus, je vous propose de regarder à quoi cela ressemble.
Le debugger est intégré à la commande ansible-playbook
. Il s'active via de la configuration, et les points d'arrêt s'ajoutent via des instructions, un peu comme en Javascript avec l'instruction debugger.
Si vous connaissez Psysh (un debugger interactif pour Php), on est vraiment sur le même genre d'outil.
Activation du debugger
On peut l'activer via le fichier ansible.cfg
, que je n'utilise pas personnellement :
# ansible.cfg
[defaults]
enable_task_debugger = True
Je préfère donc la seconde méthode, via une variable d'environnement :
ANSIBLE_ENABLE_TASK_DEBUGGER=True ansible-playbook playbook.yml -i inventory.yml
Sauf que, avec les deux méthodes précédentes, le debugger ne se lancera uniquement sur les tâches qui échouent, ce n'est peut-être pas ce vous désirez. Pour un contrôle plus fin, on peut utiliser un système de point d'arrêt.
Les points d'arrêts
La troisième méthode pour activer le debugger est via un système de point d'arrêt avec l'instruction debugger
.
L'instruction peut prendre les valeurs suivantes :
Valeur | Résultat |
---|---|
always | Activation après chaque tâche |
never | Jamais |
on_failed | Seulement si la tâche échoue |
on_unreachable | Seulement si l'hôte est inaccessible |
on_skipped | Seulement si la tâche est ignorée |
Les commandes
La documentation référence plusieurs sortes de points d'arrêts, appellées "debug commands" dans la documentation :
Commande | Raccourci | Comportement |
---|---|---|
print | p | Affiche une variable/argument |
task.args[key] = value | N/A | Met à jour les arguments du module |
task_vars[key] = value | N/A | Met à jour les variables de tâche (requiert update_task ) |
update_task | u | Recréer la tâche avec les variables à jour |
redo | r | Relance la tâche courante |
continue | c | Passer à la tâche suivante |
quit | q | Quitte le debugger |
Documentation d'Ansible
Une astuce
En général, je bloque un peu sur les register
, est ce que ma variable contient bien ce que j'attends ?
Il faut fouiller un peu pour réussir à afficher une variable enregistrée, alors on oublie pas que task_vars
est un dictionnaire python ! On peut du coup utiliser des méthodes comme task_vars.keys()
pour voir ce qu'il s'y cache. Au final pour une variable enregistrée :
p task_vars['hostvars']['your-host-name']['var-name']
Une petite démo
C'est surtout pour tester asciinema
et svg-term
😂. Le cas présenté : on voulait installer vim
mais le chien à marcher un coup sur le clavier (si si, j'ai un tout petit chien), il préférait viiiiim
. Du coup on débogue tout ça :
Conclusion
Bon, cela fait beaucoup de paraphrase de documentation, c'est pas terrible terrible ! Je trouvais important de partager un tel outil, en discutant autour de moi, il m'a semblé assez méconnu. Gardez en tête l'article est rédigé pour Ansible 3.3.
Concernant l'outil, je me suis retrouvé plusieurs fois dans des situations à utiliser le module de debug et itérer N fois pour affiner mon code ... Ce n'est pas super confortable et en plus cela peut être long. Je trouve que ce débogueur peut être une alternative qui tient la route, à voir avec plus d'usage 🙂.