Aller au contenu
Infrastructure as Code medium

Verbosité Ansible : -v / -vv / -vvv / -vvvv et callbacks profile_tasks

10 min de lecture

Logo Ansible

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.

  • 4 niveaux de verbosité et le symptôme typique de chacun.
  • Callback profile_tasks : mesurer les tâches lentes.
  • stdout_callback = yaml pour des sorties multi-ligne lisibles.
  • no_log: true : empêcher un secret de fuir en -v.
  • ANSIBLE_KEEP_REMOTE_FILES=1 pour conserver les modules sur la cible.

Tableau de référence, quand utiliser quel niveau

Section intitulée « Tableau de référence, quand utiliser quel niveau »
FlagApporteSymptôme typique
-vRésultats des tâches enrichisVue d'ensemble, voir le détail des register:
-vvArguments réels passés au module (post-template)Bug Jinja2, variable mal substituée
-vvvDétails connexion SSH, chemin tmp module sur la cibleConnection failed, Permission denied, MODULE FAILURE
-vvvvInternals plugin de connexion, ControlMaster, scp/sftp rawTrè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.

- ansible.builtin.command: hostname
register: out
- debug: var=out

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

Cas typique, bug de typo dans une variable :

vars:
db_user: "appuser"
tasks:
- debug: msg="User: {{ db_use }}" # ← typo

Avec -vv :

TASK [debug] ***
task path: /home/.../lab.yml:7
fatal: [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.

Cas typique, connexion SSH refusée :

Fenêtre de terminal
ansible-playbook lab.yml -vvv

Sortie :

ESTABLISH SSH CONNECTION FOR USER: ansible
SSH: 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).

Très rarement utile, sauf debug ControlMaster ou scp/sftp :

Fenêtre de terminal
ansible-playbook lab.yml -vvvv 2>&1 | head -50

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

Ajouter dans ansible.cfg :

[defaults]
stdout_callback = yaml
callbacks_enabled = ansible.posix.profile_tasks, ansible.posix.timer
[callback_profile_tasks]
task_output_limit = 10
sort_order = descending

Lancer :

Fenêtre de terminal
ANSIBLE_CONFIG=ansible.cfg ansible-playbook lab.yml

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

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

Lancer en -v :

ok: [db1.lab] =>
out.stdout: "Token: super_secret_token_42" ← LEAK

Le 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 sortie

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 :

Fenêtre de terminal
ANSIBLE_KEEP_REMOTE_FILES=1 ansible-playbook lab.yml -vvv

Sur la cible, le module reste dans ~/.ansible/tmp/ansible-tmp-*/ :

Fenêtre de terminal
ssh ansible@target
cd ~/.ansible/tmp/ansible-tmp-*/
ls
# AnsiballZ_copy.py
python AnsiballZ_copy.py explode # extrait le code module + args
python 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.

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.

  • -v = dev quotidien (résultats register).
  • -vv = bug Jinja2 (variables post-template + path fichier:ligne).
  • -vvv = bug SSH/connexion (commande SSH exacte).
  • -vvvv = internals plugin (rare, ControlMaster).
  • profile_tasks + timer dans ansible.cfg pour mesurer.
  • stdout_callback = yaml pour lisibilité.
  • no_log: true systématique sur tâches manipulant un secret.
  • ANSIBLE_KEEP_REMOTE_FILES=1 pour debug forensic d'un module.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn