
ignore_errors: true indique à Ansible de ne pas considérer une tâche en échec comme bloquante — le play continue malgré l’erreur. C’est une directive simple à utiliser mais souvent un anti-pattern : elle masque les vraies erreurs, rend le diagnostic difficile, et peut laisser un système dans un état incohérent. Cette page liste les rares cas légitimes d’usage, et explique pourquoi failed_when: ou block/rescue/always sont presque toujours préférés.
ansible-lint profil production signale les ignore_errors: true comme problème (ignore-errors) — sauf certaines exceptions documentées.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- L’effet de
ignore_errors: true(la tâche échouée est marquéeignored, le play continue) - Les 3 cas légitimes où c’est justifié
- Pourquoi
failed_when:est souvent une meilleure réponse - Pourquoi
block/rescue/alwaysest presque toujours plus propre - L’impact dans le PLAY RECAP :
ignored=N
Prérequis
Section intitulée « Prérequis »- Avoir lu failed_when et changed_when ;
- Avoir lu Block / rescue / always.
L’effet de ignore_errors: true
Section intitulée « L’effet de ignore_errors: true »- name: Tâche qui échoue ansible.builtin.command: /bin/false ignore_errors: true
- name: Tâche suivante (s'exécute quand même) ansible.builtin.debug: msg: "Le play continue"PLAY RECAP : ok=1 changed=1 failed=0 ignored=1. La tâche en échec est marquée ignored=1 (visible dans le RECAP), le play continue.
Les 3 cas légitimes
Section intitulée « Les 3 cas légitimes »Cas 1 — Cleanup best-effort
Section intitulée « Cas 1 — Cleanup best-effort »Une opération de cleanup où l’échec n’est pas critique :
- name: Tenter de stopper un service (peut ne pas exister) ansible.builtin.systemd: name: legacy-service state: stopped ignore_errors: trueSi le service n’existe pas, on s’en fiche — c’est exactement ce qu’on voulait. Mais mieux :
# ✅ Plus propre avec failed_when:- name: Tenter de stopper un service legacy ansible.builtin.systemd: name: legacy-service state: stopped failed_when: falsefailed_when: false est explicite : “ne jamais marquer cette tâche comme failed”.
Cas 2 — Test conditionnel sur un fait
Section intitulée « Cas 2 — Test conditionnel sur un fait »Vérifier la présence d’un binaire pour conditionner les tâches suivantes :
- name: Vérifier la présence de docker ansible.builtin.command: which docker register: docker_check ignore_errors: true changed_when: false
- name: Configurer Docker (si présent) ansible.builtin.copy: src: daemon.json dest: /etc/docker/daemon.json when: docker_check.rc == 0Mieux : failed_when: false ou block/rescue :
# ✅ failed_when: false plus explicite- name: Vérifier la présence de docker ansible.builtin.command: which docker register: docker_check changed_when: false failed_when: falseCas 3 — Opération attendue d’échouer dans un block/rescue
Section intitulée « Cas 3 — Opération attendue d’échouer dans un block/rescue »Très rarement utile, car block/rescue capture déjà les erreurs proprement :
- block: - name: Tenter une opération ansible.builtin.command: /usr/local/bin/risky.sh ignore_errors: true # ← inutile dans un block
rescue: - name: Cleanup ansible.builtin.debug: msg: "Erreur capturée"ignore_errors: à l’intérieur d’un block empêche le rescue de se déclencher (puisque la tâche n’est plus marquée failed). À éviter.
Pourquoi ignore_errors: true est un anti-pattern
Section intitulée « Pourquoi ignore_errors: true est un anti-pattern »Trois raisons :
-
Masque les vraies erreurs : un échec inattendu ne lève plus la main. Le bug se manifeste plus tard, ailleurs, sans contexte.
-
Pollue le diagnostic : un
ignored=12dans le PLAY RECAP est inutilement alarmant — vous devez chercher dans les logs lesquelles ont vraiment échoué. -
Empêche
block/rescue: si vous mettezignore_errors: truedans un block, le rescue n’est jamais déclenché. Vous perdez le bénéfice de la gestion structurée.
Cas pratique — ignore_errors dans un play simple (lab ecrire-code/ignore-errors)
Section intitulée « Cas pratique — ignore_errors dans un play simple (lab ecrire-code/ignore-errors) »Voici l’exemple validé sur le lab 24-ecrire-code-ignore-errors :
- name: Challenge ignore errors hosts: db1.lab become: true tasks: - name: Stopper un service inexistant ansible.builtin.systemd: name: ce-service-nexiste-pas state: stopped ignore_errors: true
- name: Marqueur post ignore ansible.builtin.copy: dest: /tmp/ignore-after.txt content: "play continued\n" mode: "0644"PLAY RECAP : ok=1 changed=1 failed=0 ignored=1. La tâche suivante s’est bien exécutée.
Réécriture préférée sans ignore_errors: :
- name: Stopper un service legacy si présent ansible.builtin.systemd: name: ce-service-nexiste-pas state: stopped failed_when: false # ← explicite, pas de "ignored" dans RECAPComparatif des alternatives
Section intitulée « Comparatif des alternatives »| Mécanisme | Avantage | Inconvénient |
|---|---|---|
ignore_errors: true | Simple à écrire | Masque les erreurs ; pollue PLAY RECAP |
failed_when: false | Explicite : “jamais d’échec” | À utiliser avec parcimonie aussi |
failed_when: <expr> | Précis : on définit ce qui constitue un échec | Plus verbeux |
block / rescue / always | Capture + réagit (notification, cleanup) | Plus de structure |
Règle pratique : si vous écrivez ignore_errors: true, demandez-vous d’abord si l’une des 3 alternatives ne ferait pas mieux. Dans 99 % des cas, oui.
Pièges fréquents
Section intitulée « Pièges fréquents »| Symptôme | Cause | Fix |
|---|---|---|
ignored=N dans PLAY RECAP, on ne sait pas quoi a échoué | C’est par design | Préférer failed_when: ou block/rescue qui montrent le détail |
ignore_errors: true dans un block, le rescue ne se déclenche pas | C’est attendu | Retirer ignore_errors: ; laisser le rescue capturer |
ansible-lint signale ignore-errors | Anti-pattern détecté | Migrer vers failed_when: ou block/rescue |
ignore_errors: true cumulé avec failed_when: | Comportement ambigu | Choisir l’un ou l’autre, pas les deux |
À retenir
Section intitulée « À retenir »ignore_errors: truemarque la tâcheignored=1mais ne fait pas planter le play.- 3 cas légitimes — mais dans 99 % des cas,
failed_when:oublock/rescuesont préférés. failed_when: falseest plus explicite queignore_errors: truepour “ne jamais échouer”.ignore_errors: truedans un block empêche le rescue — anti-pattern.ansible-lintprofil production signaleignore-errorscomme un problème.
Pratiquer dans le lab
Section intitulée « Pratiquer dans le lab »Cette page a un lab d’accompagnement : labs/ecrire-code/ignore-errors/ dans
stephrobert/ansible-training. Il contient
un README.md guidé, un Makefile (make verify lance les tests), et un
challenge final auto-évalué : continuer un play malgré l’échec d’une tâche grâce à ignore_errors: true.
Une fois le lab provisionné :
cd ~/Projets/ansible-training/labs/ecrire-code/ignore-errors/
cat README.md # tuto pas à pascat challenge/README.md # consigne du challenge finalpytest -v challenge/tests/ # lancer les tests testinfraSi les tests passent, vous maîtrisez les concepts couverts dans ce guide. En
cas de blocage, docs/troubleshooting.md
à la racine du repo couvre les pièges fréquents (rate-limit SSH, clé absente,
collection manquante).