Aller au contenu
Infrastructure as Code medium

Check mode et diff Ansible : dry-run et visualisation des changements

65 min de lecture

Logo Ansible

Le check mode Ansible (--check) exécute un playbook en dry-run : il calcule ce qui changerait sans rien modifier. Couplé au mode --diff, vous voyez exactement les diffs des fichiers qui seraient écrits, les paquets qui seraient installés, les services qui seraient démarrés. C'est l'outil de pré-validation indispensable avant toute modification en production, et c'est aussi l'audit de conformité d'une fleet : --check retourne un PLAY RECAP avec changed=N qui chiffre la dérive.

Cette page couvre les deux flags (--check, --diff), leur combinaison, le contrôle au niveau task (check_mode: true|false), et les modules qui ne supportent pas check_mode (command, shell, certains modules custom).

  • --check : exécuter un playbook en dry-run sans rien modifier ;
  • --diff : afficher les diffs des fichiers, configurations, états ;
  • La combinaison --check --diff pour audit complet ;
  • check_mode: true|false au niveau task pour des cas particuliers ;
  • Les modules qui ne supportent pas --check (et comment les gérer).

Lancez un playbook en dry-run :

Fenêtre de terminal
ansible-playbook site.yml --check

Ansible exécute chaque tâche en mode simulation : aucun fichier n'est écrit, aucun paquet installé, aucun service démarré. Le PLAY RECAP affiche les changed=N comme si vous aviez vraiment exécuté.

Sortie typique :

TASK [Installer nginx] ***********************************************
changed: [web1.lab]
changed: [web2.lab]
PLAY RECAP ***********************************************************
web1.lab : ok=5 changed=3 unreachable=0 failed=0
web2.lab : ok=5 changed=3 unreachable=0 failed=0

changed=3 veut dire : 3 tâches modifieraient l'état réel si le playbook tournait pour de vrai. C'est l'indicateur de dérive : sur une fleet conforme, vous attendez changed=0 partout.

--diff affiche le détail des modifications, particulièrement utile pour les modules qui touchent des fichiers (copy, template, lineinfile) :

Fenêtre de terminal
ansible-playbook site.yml --diff

Sortie typique :

TASK [Mettre à jour nginx.conf] ***************************************
--- before: /etc/nginx/nginx.conf
+++ after: /tmp/.ansible/tmp/<sha>/source
@@ -3,7 +3,7 @@
worker_processes auto;
events {
- worker_connections 768;
+ worker_connections 1024;
}
changed: [web1.lab]

Vous voyez exactement ce qui va changer dans le fichier. Indispensable pour valider un changement de config avant de l'appliquer.

C'est la commande d'audit qu'on lance avant tout déploiement risqué :

Fenêtre de terminal
ansible-playbook site.yml --check --diff

Effets combinés :

  • Aucun changement réel sur les managed nodes (--check) ;
  • Affichage complet des diffs (--diff) ;
  • PLAY RECAP avec les changed=N qui montrent ce qui aurait été modifié.

Workflow typique :

Fenêtre de terminal
# 1. Audit dry-run
ansible-playbook site.yml --check --diff > audit.log
# 2. Lecture de l'audit, validation
less audit.log
# 3. Si OK, exécution réelle
ansible-playbook site.yml --diff

Vous pouvez forcer un comportement spécifique sur une tâche, indépendamment du flag CLI :

Une tâche qui doit toujours s'exécuter, même en --check :

- name: Vérifier la version installée
ansible.builtin.command: nginx -v
register: nginx_version
check_mode: false # exécute même en --check
changed_when: false # ne marque pas comme changed

Cas typique : une vérification non-destructive qui doit donner la valeur réelle pour conditionner les tâches suivantes (when: nginx_version.stdout is defined).

Une tâche qui ne doit jamais modifier, même en exécution réelle :

- name: Tester ce que ferait dnf upgrade (toujours simulé)
ansible.builtin.dnf:
name: "*"
state: latest
check_mode: true # toujours en mode simulation
register: upgrade_simulation

Cas typique : afficher la liste des paquets qui seraient mis à jour, sans jamais les mettre à jour.

Tous les modules ne savent pas tourner en check mode. Les principaux non supportés :

ModulePourquoi
command, shell, raw, scriptExécutent une commande arbitraire, Ansible ne peut pas savoir si elle modifie l'état
metaMéta-actions (flush_handlers, clear_facts)
Certains modules customSi le développeur n'a pas implémenté supports_check_mode = True

Pour les modules command/shell, en mode --check ils sont skippés par défaut. Si vous voulez quand même les exécuter (cas d'une vérification non destructive), forcez avec check_mode: false :

- name: Vérifier la version (exécuté même en --check)
ansible.builtin.command: nginx -v
register: result
check_mode: false
changed_when: false

Pour vérifier si un module supporte le check mode :

Fenêtre de terminal
ansible-doc ansible.builtin.dnf | grep -A1 "support_check_mode"

Sur une fleet existante, vous voulez savoir quels hôtes dévient de l'état désiré. Lancez votre playbook de baseline en --check :

Fenêtre de terminal
ansible-playbook baseline.yml --check

Le PLAY RECAP montre les hôtes en dérive :

web1.lab : ok=12 changed=0 unreachable=0 failed=0 ← OK
web2.lab : ok=9 changed=3 unreachable=0 failed=0 ← 3 tâches en dérive
db1.lab : ok=10 changed=2 unreachable=0 failed=0 ← 2 tâches en dérive

Couplé à un script qui parse la sortie et alerte un système de ticketing, c'est un audit de conformité automatisé, pattern fréquent en production grande échelle.

SymptômeCauseFix
--check affiche changed mais une exécution réelle ne change rienModule qui ne supporte pas check correctement (faux positif)Vérifier le module ; tester avec ansible-doc <module>
--check --diff ne montre pas le diffLe module ne capture pas avant/aprèsModule limité ; vérifier en réel avec --diff seul
Une tâche command skippée bloque la suiteMode --check skip command ; les tâches qui dépendent d'un register: plantentForcer check_mode: false sur la tâche command
Diff énorme et illisibleLe module copie un binaire ou un fichier très volumineuxno_log: true pour masquer, ou désactiver --diff ponctuellement
--check modifie quand même quelque choseBug dans un module customReporter le bug ; entretemps check_mode: false à éviter
  • --check lance le playbook en dry-run : aucun changement réel.
  • --diff affiche les diffs des fichiers modifiés (avant/après).
  • --check --diff est la commande d'audit : zéro changement, diff complet.
  • check_mode: false force une tâche à s'exécuter même en --check (vérifications non-destructives).
  • check_mode: true force une tâche à toujours simuler (jamais exécuter).
  • Les modules command et shell sont skippés en --check par défaut, ajouter check_mode: false si lecture sans effet de bord.

Un dry-run n'a de valeur que si vous savez ce qu'il ne couvre pas. Le lab vous fait lancer un playbook en --check --diff, repérer les modules qui ne savent pas simuler, forcer check_mode: false sur une lecture sans effet de bord, et diagnostiquer un faux positif changed. La vérification compare l'état des fichiers avant et après, ce qui prouve qu'aucune écriture n'a eu lieu pendant la simulation.

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