Je voudrais copier des fichiers du répertoire distant vers le répertoire local avec Ansible mais le module de récupération me permet de copier un seul fichier. J'ai de nombreux serveurs à partir desquels j'ai besoin de fichiers (même répertoire pour chaque serveur) et je ne sais pas comment faire cela avec Ansible.
Des idées?
Vous devrez probablement enregistrer du contenu distant et le boucler dessus, quelque chose comme ça devrait fonctionner:
- Shell: (cd /remote; find . -maxdepth 1 -type f) | cut -d'/' -f2
register: files_to_copy
- fetch: src=/remote/{{ item }} dest=/local/
with_items: "{{ files_to_copy.stdout_lines }}"
où /remote
doit être modifié avec le chemin du répertoire sur votre serveur distant et /local/
avec répertoire sur votre maître
Vous devez utiliser le module de synchronisation pour ce faire. Cela utilise la puissance impressionnante de rsync . Il copiera les structures de fichiers et de répertoires de n'importe quelle profondeur, est à l'épreuve des balles et très efficace - ne copiant que les octets réels qui ont changé:
- name: Fetch stuff from the remote and save to local
synchronize: src={{ item }} dest=/tmp/ mode=pull
with_items:
- "folder/one"
- "folder/two"
La clé est le paramètre mode
:
Spécifiez le sens de la synchronisation. En mode Push, l'hôte local ou le délégué est la source; En mode pull, l'hôte distant en contexte est la source.
je n'ai pas assez de représentant pour commenter sinon je l'ajouterais.
J'ai utilisé ce que Kęstutis a publié. j'ai dû faire une légère modification
- Shell: (cd /remote; find . -maxdepth 1 -type f) | cut -d'/' -f2
register: files_to_copy
- fetch: src=/remote/{{ item }} dest=/local/
with_items: "{{ files_to_copy.stdout_lines }}"
Le with_items était la zone que je devais changer. il n'a pas pu localiser les fichiers autrement.
Correction de l'exemple ci-dessus
- hosts: srv-test
tasks:
- find: paths="/var/tmp/collect" recurse=no patterns="*.tar"
register: files_to_copy
- fetch: src={{ item.path }} dest=/tmp
with_items: "{{ files_to_copy.files }}"
eh bien, si vous utilisez la dernière version ansible, comme 2.2.1.0, je pense que nous avons besoin de devis pour l'article
- name: use find to get the files list which you want to copy/fetch
find:
paths: /etc/
patterns: ".*passwd$"
use_regex: True
register: file_2_fetch
- name: use fetch to get the files
fetch:
src: "{{ item.path }}"
dest: /tmp/
flat: yes
with_items: "{{ file_2_fetch.files }}"
- hosts: srv-test
tasks:
- find: paths="/var/tmp/collect" recurse=no patterns="*.tar"
register: file_to_copy
- fetch: src={{ item }} dest=/tmp
with_items: files_to_copy.stdout_lines
J'utilise ceci: 1. Tirez les répertoires de l'hôte distant vers des hôtes spécifiques
- name: Gather hosts stats from other hosts
Shell: " scp -r {{results_root_dir_src}} root@{{groups['profiling_server'][0]}}:{{results_root_dir_dest}}/abc/"
when: "'profiling_server' not in group_names"
#It will not run on the node where the directories need to be copied.
- name: Gather from Host to local
delegate_to: 127.0.0.1
run_once: true
become: false
Shell: "scp -r root@{{groups['profiling_server'][0]}}:{{results_root_dir}} ./results_local_location "
inventaire
[nodes]
server1
server2
server3
[profiling_server]
server1