web-dev-qa-db-fra.com

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

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?

20
maayke

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

/remote doit être modifié avec le chemin du répertoire sur votre serveur distant et /local/ avec répertoire sur votre maître

23
Kęstutis

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.

29
Duncan Lock

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.

5
JamStar

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

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 }}"
1
Z.Liu
- 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.
  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

0
kmajumder