Cómo recuperar múltiples archivos de la máquina remota a local con Ansible

17

Me gustaría copiar archivos del directorio remoto al directorio local con Ansible, pero el módulo fetch me permite copiar solo un archivo. Tengo muchos servidores de los que necesito archivos (el mismo directorio de cada servidor) y no sé cómo hacerlo con Ansible.

¿Algunas ideas?

maayke
fuente

Respuestas:

22

Probablemente necesitará registrar contenido remoto y luego recorrerlo, algo como esto debería funcionar:

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

donde /remotedebe cambiarse con la ruta del directorio en su servidor remoto y /local/con el directorio en su maestro

Kęstutis
fuente
1
Por cierto, esto solo tiene un nivel de profundidad (deja fuera los subdirectorios) e ignora los directorios en general, por lo que si eso no es algo que desea, simplemente cambie el comando de shell en consecuencia.
Kęstutis
¿Qué pasará cuando corro en un montón de servidores? ¿cada uno registrará sus propios hallazgos? y buscar los correctos?
Amir Mehler
alguna idea de cómo hacer esto con win_find? No puedo encontrar la ruta adicional de la lista de archivos que devuelve
Peter Kahn
27

Debe usar el módulo de sincronización para hacer esto. Esto usa el increíble poder de rsync . Copiará las estructuras de archivos y directorios de cualquier profundidad, es a prueba de balas y altamente eficiente, solo copia los bytes reales que han cambiado:

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

La clave es el modeparámetro:

Especifique la dirección de la sincronización. En modo push, el host local o delegado es la fuente; En modo pull, el host remoto en contexto es la fuente.

Duncan Lock
fuente
1
He encontrado que el synchronisemódulo es mucho más confiable y escalable que los otros métodos que Ansible tiene para copiar archivos.
pollitos
3
Esta es definitivamente una mejor manera de hacerlo que la respuesta aceptada.
childofsoong
5

No tengo suficiente representante para comentar, de lo contrario lo agregaría.

Usé lo que Kęstutis publicó. tuve que hacer una ligera modificación

- 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 fue el área que tuve que cambiar. de lo contrario, no pudo localizar los archivos.

JamStar
fuente
2

Arreglando el ejemplo anterior

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

bueno, si está utilizando la última versión ansible, como 2.2.1.0, creo que necesitamos citas para el artículo

- 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
fuente
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
fuente
Esto no funciona en absoluto. ¿Se ha intentado esto?
Basilio A
0

Yo uso esto: 1. Extraer directorios del host remoto a hosts específicos

- 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. Extraer directorios del nodo al 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

kmajumder
fuente