Nicolas Le Borgne

Développeur

Un débogueur pour Ansible

Le 29 mai 2021

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 :

ValeurRésultat
alwaysActivation après chaque tâche
neverJamais
on_failedSeulement si la tâche échoue
on_unreachableSeulement si l'hôte est inaccessible
on_skippedSeulement 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 :

CommandeRaccourciComportement
printpAffiche une variable/argument
task.args[key] = valueN/AMet à jour les arguments du module
task_vars[key] = valueN/AMet à jour les variables de tâche (requiert update_task)
update_taskuRecréer la tâche avec les variables à jour
redorRelance la tâche courante
continuecPasser à la tâche suivante
quitqQuitte 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 :

Test asciicinema as svg

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 🙂.

Sources

© 2021 Nicolas Le Borgne