Aller au contenu
Infrastructure as Code medium

Module fetch Ansible : rapatrier des fichiers du managed node

6 min de lecture

Logo Ansible

ansible.builtin.fetch est l’inverse exact de copy: — il rapatrie un fichier depuis un managed node vers le control node. Il sert à collecter des logs, sauvegarder des configurations existantes avant migration, ou récupérer des rapports générés par les managed nodes.

fetch: gère deux modes d’organisation : arborescence par hôte (flat: false, défaut) ou fichier unique (flat: true). Le second nécessite d’interpoler inventory_hostname dans le dest: pour éviter les écrasements quand plusieurs hôtes sont concernés.

  • Le mode par défaut (arborescence par hôte) et le mode flat (fichier unique).
  • Comment éviter les écrasements quand plusieurs hôtes envoient le même fichier.
  • L’option fail_on_missing: true pour échouer explicitement si le fichier manque.
  • Le piège des chemins relatifs dans dest: (résolus depuis playbook_dir, pas le cwd).
  • Connaître copy:fetch: est son miroir.
  • Comprendre le concept d’inventory_hostname (cf. Magic vars).

Mode par défaut — arborescence par hôte (flat: false)

Section intitulée « Mode par défaut — arborescence par hôte (flat: false) »
- name: Backup des sshd_config
ansible.builtin.fetch:
src: /etc/ssh/sshd_config
dest: backup/

Résultat sur le control node :

backup/
├── web1.lab/etc/ssh/sshd_config
├── web2.lab/etc/ssh/sshd_config
└── db1.lab/etc/ssh/sshd_config

Ansible reproduit l’arborescence absolue sous un dossier nommé d’après l’hôte. Pas de risque d’écrasement entre hôtes — chacun a son sous-dossier. Mode idéal pour des audits ou des collectes systématiques sur un parc.

- name: Recuperer le rapport audit
ansible.builtin.fetch:
src: /tmp/audit-report.txt
dest: ./reports/audit-{{ inventory_hostname }}.txt
flat: true

Résultat :

reports/
├── audit-web1.lab.txt
├── audit-web2.lab.txt
└── audit-db1.lab.txt

flat: true demande à Ansible de placer le fichier directement dans dest:, sans recréer l’arborescence absolue. Mais sans interpolation de inventory_hostname dans le dest:, chaque hôte écrase le précédent — un seul fichier reste à la fin.

Règle : avec flat: true sur plusieurs hôtes, toujours interpoler inventory_hostname dans dest:.

fetch: valide le checksum du fichier après transfert (option validate_checksum: true par défaut). Si le fichier est modifié pendant le transfert, l’opération échoue.

- name: Recuperer un fichier critique
ansible.builtin.fetch:
src: /etc/passwd
dest: ./backups/
fail_on_missing: true # Echoue explicitement si /etc/passwd absent

fail_on_missing: true est important pour les collectes critiques : sans cette option, un fichier absent côté managed node renvoie ok: skipped, et l’opérateur peut ne pas remarquer que les backups manquent pour certains hôtes.

CasPattern
Backup config avant migrationflat: false, dest: backup-2026-04-25/
Collecte de logsflat: true + inventory_hostname dans dest:
Récupération de licencesflat: true, un seul hôte ciblé (pas de boucle)
Audit sécurité multi-hôtesflat: false, exploite l’arborescence sortie pour diff croisé
SymptômeCauseFix
Un seul fichier dans dest: malgré 5 hôtesflat: true sans {{ inventory_hostname }} dans dest:Interpoler inventory_hostname
Les fichiers atterrissent dans solution/<lab>/dest: relatif résolu depuis playbook_dir, pas le cwdUtiliser &#123;&#123; inventory_dir &#125;&#125;/../collected/
fetch: ignoré silencieusementFichier source absent + fail_on_missing: false (défaut)Mettre fail_on_missing: true
Permission denied côté control nodeLe dest: n’est pas writable par l’utilisateur qui lance AnsibleVérifier les permissions du dossier local

slurp: (autre module Ansible) lit le contenu d’un fichier distant et le retourne en base64 dans une variable, sans écrire localement. À utiliser quand on veut inspecter le contenu en mémoire (vérifier une config, alimenter un template:), pas le sauvegarder. fetch: reste le bon choix dès qu’on veut un fichier persistant côté control node.

  • fetch: = inverse de copy: — du managed node vers le control node.
  • Mode défaut : arborescence par hôte (sûr, jamais d’écrasement).
  • Mode flat : fichier unique, mais toujours interpoler inventory_hostname sur multi-hôtes.
  • fail_on_missing: true sur les collectes critiques (sinon les manques sont silencieux).
  • Chemin relatif dest: est résolu depuis playbook_dir, pas le cwd — préférer inventory_dir-relatif ou absolu.

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

Challenge — sur web1.lab ET db1.lab :

  1. fetch: /etc/os-release vers ./collected/<host>-os-release.txt (flat, interpolation hostname).
  2. Sur web1.lab uniquement : écrire un fichier de tag puis le rapatrier.

Validation pytest :

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

4 tests vérifient les fichiers côté control node (pas via SSH — c’est l’inverse de copy:).

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