
Quand un playbook échoue, votre premier réflexe doit être -v. Chaque cran de verbosité ouvre un nouveau niveau d’information : -v enrichit les résultats, -vv montre les arguments post-template Jinja2, -vvv révèle la commande SSH exacte, -vvvv expose les internals du plugin de connexion. Cette page distingue précisément quel niveau utiliser pour quel symptôme, et complète avec les callbacks profile_tasks + timer qui mesurent les performances sans toucher au playbook.
À la fin, vous saurez choisir le bon -v selon le bug, activer profile_tasks dans ansible.cfg, et éviter le piège classique : fuiter un secret en sortie verbose.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- 4 niveaux de verbosité et le symptôme typique de chacun.
- Callback
profile_tasks: mesurer les tâches lentes. stdout_callback = yamlpour des sorties multi-ligne lisibles.no_log: true: empêcher un secret de fuir en-v.ANSIBLE_KEEP_REMOTE_FILES=1pour conserver les modules sur la cible.
Prérequis
Section intitulée « Prérequis »- Avoir validé Premier playbook.
- Lab homelab avec un host atteignable.
Tableau de référence — quand utiliser quel niveau
Section intitulée « Tableau de référence — quand utiliser quel niveau »| Flag | Apporte | Symptôme typique |
|---|---|---|
-v | Résultats des tâches enrichis | Vue d’ensemble, voir le détail des register: |
-vv | Arguments réels passés au module (post-template) | Bug Jinja2, variable mal substituée |
-vvv | Détails connexion SSH, chemin tmp module sur la cible | Connection failed, Permission denied, MODULE FAILURE |
-vvvv | Internals plugin de connexion, ControlMaster, scp/sftp raw | Très rare, surtout pour debug ControlMaster ou SSH multiplexing |
Règle pratique : commencer par -v puis monter graduellement. -vvv couvre 90 % des cas de debug réseau/connexion.
-v : voir les register: et résultats
Section intitulée « -v : voir les register: et résultats »- ansible.builtin.command: hostname register: out- debug: var=outSans -v :
TASK [debug] ***ok: [db1.lab] => { "out": "<no_log: True>"}Avec -v :
TASK [debug] ***ok: [db1.lab] => out: changed: false cmd: - hostname rc: 0 stdout: db1.lab stdout_lines: - db1.lab🔍 Observation : -v est le niveau de dev quotidien. Affiche le contenu de chaque register: pour debug rapide.
-vv : voir les variables résolues post-Jinja2
Section intitulée « -vv : voir les variables résolues post-Jinja2 »Cas typique — bug de typo dans une variable :
vars: db_user: "appuser"tasks: - debug: msg="User: {{ db_use }}" # ← typoAvec -vv :
TASK [debug] ***task path: /home/.../lab.yml:7fatal: [db1.lab]: FAILED! => {"msg": "...'db_use' is undefined..."}Le path lab.yml:7 est ajouté → vous savez exactement quelle ligne corriger.
🔍 Observation : -vv ajoute le chemin fichier:ligne + les arguments réels post-template. Bug Jinja2 → toujours -vv minimum.
-vvv : voir la commande SSH exacte
Section intitulée « -vvv : voir la commande SSH exacte »Cas typique — connexion SSH refusée :
ansible-playbook lab.yml -vvvSortie :
ESTABLISH SSH CONNECTION FOR USER: ansibleSSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no \ -o PreferredAuthentications=publickey -o PasswordAuthentication=no \ -o User=ansible -o ConnectTimeout=10 db1.lab '/bin/sh -c '"'"'echo ~ansible && sleep 0'"'"''ssh: Could not resolve hostname db1.lab: Name or service not known🔍 Observation cruciale : -vvv montre la commande SSH exacte. Reproduisez-la avec ssh -vvv user@host pour bypass complètement Ansible et identifier la cause racine (DNS, clé SSH, sudoers).
-vvvv : internals du plugin de connexion
Section intitulée « -vvvv : internals du plugin de connexion »Très rarement utile, sauf debug ControlMaster ou scp/sftp :
ansible-playbook lab.yml -vvvv 2>&1 | head -50Vous voyez le multiplexing SSH (1 socket réutilisée), le transport sftp/scp des modules, et les internals Python du plugin ssh. À utiliser uniquement après avoir épuisé -vvv.
Callback profile_tasks — mesurer les performances
Section intitulée « Callback profile_tasks — mesurer les performances »Ajouter dans ansible.cfg :
[defaults]stdout_callback = yamlcallbacks_enabled = ansible.posix.profile_tasks, ansible.posix.timer
[callback_profile_tasks]task_output_limit = 10sort_order = descendingLancer :
ANSIBLE_CONFIG=ansible.cfg ansible-playbook lab.ymlSortie en fin de run :
TASK execution time: 1. Install nginx ─────────── 12.45s 2. Configure firewalld ───── 3.20s 3. Setup mariadb ──────────── 2.10s …
Playbook run took 0 days, 0 hours, 1 minutes, 23 seconds🔍 Observation : identifier les goulots d’étranglement sans modifier le code. Sur une fleet de production, c’est le premier outil pour décider quoi paralléliser ou optimiser.
stdout_callback = yaml pour sortie lisible
Section intitulée « stdout_callback = yaml pour sortie lisible »Sans :
ok: [db1.lab] => {"ansible_facts": {"my_data": [{"name": "alice"}, {"name": "bob"}]}}Avec stdout_callback = yaml :
ok: [db1.lab] => ansible_facts: my_data: - name: alice - name: bob🔍 Observation : multi-ligne, indenté, lisible. À activer par défaut dans ansible.cfg projet.
⚠️ no_log: true — éviter de fuiter un secret en -v
Section intitulée « ⚠️ no_log: true — éviter de fuiter un secret en -v »Sans no_log: :
- ansible.builtin.shell: 'echo "Token: super_secret_token_42"' register: out- debug: var=out.stdoutLancer en -v :
ok: [db1.lab] => out.stdout: "Token: super_secret_token_42" ← LEAKLe secret apparaît en clair. À ne jamais committer dans Git en CI.
Fix :
- ansible.builtin.shell: 'echo "Token: super_secret_token_42"' register: out no_log: true # ← masque la sortieANSIBLE_KEEP_REMOTE_FILES=1 — debug forensic
Section intitulée « ANSIBLE_KEEP_REMOTE_FILES=1 — debug forensic »Quand un module échoue avec MODULE FAILURE, le module Python est transféré et exécuté sur la cible, puis supprimé. Pour le conserver et l’inspecter :
ANSIBLE_KEEP_REMOTE_FILES=1 ansible-playbook lab.yml -vvvSur la cible, le module reste dans ~/.ansible/tmp/ansible-tmp-*/ :
ssh ansible@targetcd ~/.ansible/tmp/ansible-tmp-*/ls# AnsiballZ_copy.pypython AnsiballZ_copy.py explode # extrait le code module + argspython AnsiballZ_copy.py execute # rejoue le module avec les mêmes args🔍 Observation : reproduit exactement ce qu’Ansible a exécuté, avec accès au traceback Python complet. Indispensable pour debugger un module custom ou un bug obscur.
Lab pratique
Section intitulée « Lab pratique »Le lab troubleshooting/verbosite (labs/troubleshooting/verbosite/) reproduit les 4 niveaux de verbosité avec un exercice par niveau, plus un challenge profile_tasks à 3 tâches mesurées.
À retenir
Section intitulée « À retenir »-v= dev quotidien (résultatsregister).-vv= bug Jinja2 (variables post-template + path fichier:ligne).-vvv= bug SSH/connexion (commande SSH exacte).-vvvv= internals plugin (rare, ControlMaster).profile_tasks+timerdansansible.cfgpour mesurer.stdout_callback = yamlpour lisibilité.no_log: truesystématique sur tâches manipulant un secret.ANSIBLE_KEEP_REMOTE_FILES=1pour debug forensic d’un module.