Aller au contenu
Infrastructure as Code medium

Module stat Ansible : info sur fichiers et dossiers

6 min de lecture

Logo Ansible

ansible.builtin.stat: retourne des informations sur un fichier ou dossier sans le modifier : existence, type, taille, mode, owner, checksum, mtime. C’est le module n°1 de la logique conditionnelle Ansible — combiné avec register: + when:, il permet de coder des branches sûres.

stat: est lecture seule par définition — toujours changed=0.

  • Vérifier l’existence d’un fichier avant d’agir dessus.
  • Distinguer les types : fichier régulier, dossier, symlink, hardlink.
  • Comparer des checksums SHA256 pour détecter une modification.
  • Mesurer la taille et le mtime pour des contrôles de conformité.
  • Diagnostiquer un fichier symlink qui pointe vers le vide.
- name: Stat sur /etc/passwd
ansible.builtin.stat:
path: /etc/passwd
register: passwd_stat
- name: Inspecter le resultat
ansible.builtin.debug:
var: passwd_stat.stat

passwd_stat.stat est un dict qui contient : exists, isfile, isdir, islnk, size, mode, uid, gid, pw_name, gr_name, mtime, etc.

- name: Stat sur un fichier optionnel
ansible.builtin.stat:
path: /etc/myapp.conf
register: myapp_conf
- name: Action SI le fichier existe
ansible.builtin.copy:
src: /etc/myapp.conf
dest: /tmp/backup.conf
remote_src: true
when: myapp_conf.stat.exists
- name: Action SI le fichier n existe PAS
ansible.builtin.copy:
content: "Default config\n"
dest: /etc/myapp.conf
mode: "0644"
when: not myapp_conf.stat.exists

Pattern branche conditionnelle classique : avant toute opération sur un fichier qui peut ou non exister, on stat puis on décide.

TypeChamps distinctifs
Fichier régulierisfile: true, size, checksum
Dossierisdir: true (pas de size significatif)
Symlinkislnk: true, lnk_source (cible), lnk_target (chemin résolu)
Hardlinknlink > 1 (nombre de liens)
Block/char deviceisblk: true / ischr: true
- name: Stat avec checksum SHA256
ansible.builtin.stat:
path: /etc/passwd
get_checksum: true
checksum_algorithm: sha256
register: passwd_check
- name: Afficher le checksum
ansible.builtin.debug:
msg: "SHA256 : {{ passwd_check.stat.checksum }}"

Attention performance : get_checksum: true calcule le hash en lisant tout le fichier. Sur un fichier de 1Go, c’est lent. À utiliser uniquement quand vous avez besoin du checksum.

Algorithmes supportés : sha1 (défaut), sha256 (recommandé), sha512, md5 (déprécié).

- name: Stat avec mtime
ansible.builtin.stat:
path: /etc/passwd
register: passwd_mtime
- name: Verifier que /etc/passwd n a pas ete modifie depuis 24h
ansible.builtin.assert:
that:
- (ansible_date_time.epoch | int - passwd_mtime.stat.mtime | int) < 86400
fail_msg: "ALERTE : /etc/passwd modifie depuis moins de 24h"

mtime est un timestamp Unix. Pour comparer, soustraire et tester en secondes. Utile pour des audits de sécurité.

Par défaut, stat: ne suit pas les symlinks. Le symlink lui-même existe (exists: true), mais sa cible peut être absente :

- ansible.builtin.stat:
path: /tmp/mon-symlink-casse
register: link_stat
# → exists: true, islnk: true, MAIS cible non vérifiée

Pour suivre le lien :

- ansible.builtin.stat:
path: /tmp/mon-symlink-casse
follow: true
register: link_stat_follow
failed_when: false # follow + cible absente → erreur sinon

Avec follow: true, exists: false si la cible n’existe pas.

SymptômeCauseFix
Performance dégradéeget_checksum: true sur gros fichiersDésactiver sauf besoin réel
Symlink considéré “existant” alors qu’il pointe vers le videfollow: false (défaut)Ajouter follow: true ou stat sur la cible
passwd_stat.stat.size introuvable sur dossierDossiers n’ont pas de size significatifVérifier isdir avant d’accéder à size
  • stat: = lecture seule, toujours changed=0.
  • register: + when: var.stat.exists = pattern de logique conditionnelle.
  • isfile, isdir, islnk = distinction des types.
  • get_checksum: true = lecture complète du fichier (lent sur gros fichiers).
  • follow: false (défaut) = stat sur le symlink lui-même, pas la cible.

Cette page a un lab d’accompagnement : labs/modules-diagnostic/stat/ dans stephrobert/ansible-training.

Challenge — sur db1.lab :

  1. Stat 3 fichiers système (/etc/passwd avec checksum, /etc/shadow, /etc/sudoers).
  2. Générer un rapport /tmp/lab-stat-report.txt.

Validation pytest+testinfra :

Fenêtre de terminal
ansible-playbook solution.yml
pytest -v labs/modules-diagnostic/stat/challenge/tests/

4 tests vérifient le rapport, le checksum SHA256, l’UID 0 sur shadow, et la présence des 3 fichiers.

Ce site vous est utile ?

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

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn