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