Come recuperare più file dal computer remoto al locale con Ansible


17

Vorrei copiare i file dalla directory remota alla directory locale con Ansible ma il modulo di recupero mi consente di copiare solo un file. Ho molti server da cui ho bisogno di file (stessa directory per ciascun server) e non so come farlo con Ansible.

Qualche idea?

Risposte:


22

Probabilmente avrai bisogno di registrare il contenuto remoto e poi di passarci sopra, qualcosa del genere dovrebbe funzionare:

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

dove /remotedovrebbe essere modificato con il percorso della directory sul server remoto e /local/con la directory sul master


1
A proposito, questo arriva a un solo livello di profondità (esclude le sottodirectory) e ignora le directory in generale, quindi se non è qualcosa che desideri, cambia semplicemente il comando shell.
Kęstutis,

Cosa succederà quando corro su un gruppo di server? ognuno registrerà i propri risultati? e prendere quelli giusti?
Amir Mehler,

qualche idea su come farlo con win_find? Non riesco a capire come fare un ulteriore percorso dall'elenco dei file che restituisce
Peter Kahn,

27

A tale scopo, è necessario utilizzare il modulo di sincronizzazione . Questo utilizza il fantastico potere di rsync . Copia le strutture di file e directory di qualsiasi profondità, è a prova di proiettile e altamente efficiente, copiando solo i byte effettivi che sono stati modificati:

- name: Fetch stuff from the remote and save to local
  synchronize:  src={{ item }} dest=/tmp/ mode=pull
  with_items:
    - "folder/one"
    - "folder/two"

La chiave è il modeparametro:

Specifica la direzione della sincronizzazione. In modalità push l'host locale o il delegato è l'origine; In modalità pull l'host remoto nel contesto è l'origine.


1
Ho trovato il synchronisemodulo molto più affidabile e scalabile rispetto agli altri metodi che devono essere copiati dai file.
pulcini,

3
Questo è sicuramente un modo migliore per farlo rispetto alla risposta accettata.
figlio del

5

non ho abbastanza rappresentante per commentare altrimenti lo aggiungerei.

Ho usato quello che ha pubblicato Kęstutis. ho dovuto apportare una leggera modifica

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

With_items era l'area che dovevo cambiare. altrimenti non è stato in grado di individuare i file.


2

Correzione dell'esempio sopra

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

1

bene, se stai usando l'ultima versione ansible, come 2.2.1.0, penso che abbiamo bisogno di virgolette per l'oggetto

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

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

Questo non funziona affatto. Questo è stato provato?
Basilio,

0

Uso questo: 1. Estrarre le directory dall'host remoto a host specifici

- 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. Estrai le directory dal nodo a localhost
- 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 "

inventario

[nodes]
server1
server2
server3
[profiling_server]
server1

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.