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