Aller au contenu
Infrastructure as Code medium

Module find Ansible : recherche multi-fichiers par pattern

8 min de lecture

Logo Ansible

ansible.builtin.find: recherche plusieurs fichiers par pattern (glob ou regex), âge, taille, type. C’est l’équivalent de la commande find Unix mais avec résultat structuré (liste de dicts) consommable par loop: ensuite.

Là où stat: traite un fichier, find: en parcourt plusieurs. Cas d’usage typiques RHCE 2026 : nettoyer les vieux logs (>7 jours), lister les binaires setuid, supprimer les fichiers temporaires.

  • Rechercher par pattern (patterns: glob ou use_regex: true).
  • Filtrer par âge (age: 7d), taille (size: 10m), type (file_type:).
  • Descendre récursivement avec recurse: true.
  • Combiner find: + loop: + file: state: absent pour cleanup ciblé.
  • Diagnostiquer un timeout sur un FS lent ou un dossier énorme.
  • Connaître loop: et register: pour consommer le résultat.
- name: Trouver tous les .log
ansible.builtin.find:
paths: /var/log
patterns: '*.log'
register: log_files

log_files.files est une liste de dicts (un par fichier trouvé) avec : path, size, mode, mtime, uid, gid, etc. — comme un stat: par fichier.

Champs utiles du registre :

  • log_files.files : liste des fichiers trouvés (dicts).
  • log_files.matched : nombre total trouvé.
  • log_files.examined : nombre de fichiers parcourus avant filtrage.
- name: Trouver les .log de 10Mo et plus
ansible.builtin.find:
paths: /var/log
patterns: '*.log'
size: 10m
register: big_logs

Format size: :

  • 10m = au moins 10 mégaoctets (sans préfixe = >= 10m).
  • -100k = moins de 100 kilooctets (préfixe - uniquement).
  • 1g = au moins 1 gigaoctet.
  • Suffixes : b (bytes), k, m, g, t.
- name: Logs de plus de 7 jours
ansible.builtin.find:
paths: /var/log
patterns: '*.log'
age: 7d
register: old_logs
- name: Fichiers tres recents (< 1h)
ansible.builtin.find:
paths: /var/log
patterns: '*.log'
age: -1h
register: recent_logs

Format age: :

  • 7d = 7 jours ou plus (basé sur mtime par défaut).
  • -1h = moins d’1 heure (signe - = inférieur).
  • Suffixes : s (secondes), m (minutes), h (heures), d (jours), w (semaines).

age_stamp: — choisir le timestamp de comparaison : mtime (défaut), atime, ctime.

- name: Trouver tous les dossiers
ansible.builtin.find:
paths: /tmp
file_type: directory
- name: Trouver les symlinks
ansible.builtin.find:
paths: /etc
file_type: link

Valeurs file_type: : file (défaut), directory, link, any.

- name: Tous les .conf dans /etc et sous-dossiers
ansible.builtin.find:
paths: /etc
patterns: '*.conf'
recurse: true
register: all_conf
- name: Compter
ansible.builtin.debug:
msg: "{{ all_conf.matched }} fichiers .conf trouves"

Performance : recurse: true sur / peut prendre des heures sur un système chargé. Toujours scoper avec paths: précis.

- name: Trouver les .log > 1Mo
ansible.builtin.find:
paths: /tmp
patterns: '*.log'
size: 1m
register: logs_to_clean
- name: Supprimer ces fichiers
ansible.builtin.file:
path: "{{ item.path }}"
state: absent
loop: "{{ logs_to_clean.files }}"
loop_control:
label: "{{ item.path }}"

Pattern find + loop: + file: state: absent. Idempotent : un 2e run trouve 0 fichier → loop: 0 itération.

Alternative shell : find /tmp -name '*.log' -size +1M -delete. Moins lisible, moins idempotent, mais plus rapide sur gros volumes.

- name: Find avec regex Python
ansible.builtin.find:
paths: /var/log
patterns: '.*-[0-9]{4}-[0-9]{2}\.log\.gz$'
use_regex: true
register: archived_logs

use_regex: true : patterns: devient une regex Python. Plus puissant que glob mais plus complexe.

SymptômeCauseFix
failed to process size: +10mPréfixe + non acceptéRetirer le +, mettre juste 10m
Recherche très lente sur /Pas de scopeToujours paths: précis
Fichiers cachés ignoréshidden: false (défaut)Ajouter hidden: true
Symlinks suivis non voulusfollow: false (défaut, OK)Vérifier valeur de follow:
  • find: retourne <reg>.files (liste de dicts) + <reg>.matched (count).
  • patterns: = glob par défaut, use_regex: true pour regex Python.
  • size: 10m / age: 7d = filtres standards (pas de préfixe +).
  • recurse: true = descente récursive (attention performance).
  • file_type: : file / directory / link / any.
  • Pattern find + loop + file: state: absent = cleanup idempotent.

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

Challenge — sur db1.lab :

  1. Créer 5 fichiers .log de tailles diverses.
  2. find: les .log de plus de 5Mo.
  3. Les supprimer en loop:.

Validation pytest+testinfra :

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

6 tests vérifient que les petits logs sont conservés et les gros logs supprimés.

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