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