Comment récupérer plusieurs fichiers d'une machine distante vers une machine locale avec Ansible

17

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?

maayke
la source

Réponses:

22

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

/remotedoit être changé avec le chemin du répertoire sur votre serveur distant et /local/avec le répertoire sur votre maître

Kęstutis
la source
1
Soit dit en passant, cela ne va qu'à un niveau (sans les sous-répertoires) et ignore les répertoires en général, donc si ce n'est pas quelque chose que vous désirez, changez simplement la commande shell en conséquence.
Kęstutis
Que se passera-t-il lorsque je fonctionnerai sur plusieurs serveurs? chacun enregistrera-t-il ses propres résultats? et chercher les bons?
Amir Mehler
une idée de comment le faire avec win_find? Je ne peux pas comprendre comment extraire le chemin de la liste de fichiers qu'il renvoie
Peter Kahn
27

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 modeparamètre:

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.

Duncan Lock
la source
1
J'ai trouvé le synchronisemodule beaucoup plus fiable et évolutif que les autres méthodes qu'ansible a pour copier des fichiers.
poussins
3
C'est certainement une meilleure façon de le faire que la réponse acceptée.
childofsoong
5

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. autrement, il n'a pas pu localiser les fichiers.

JamStar
la source
2

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 }}"
Marketta
la source
1

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 }}"
Z.Liu
la source
0
- 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
Diego Roberto Dos Santos
la source
Ça ne marche pas du tout. Cela a-t-il été essayé?
Basil A
0

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.
  1. Extraire les répertoires du nœud vers l'hôte local
- 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

kmajumder
la source