Como buscar vários arquivos da máquina remota para local com Ansible

12

Eu gostaria de copiar arquivos do diretório remoto para o diretório local com Ansible, mas o módulo fetch permite copiar apenas um arquivo. Eu tenho muitos servidores dos quais eu preciso de arquivos (mesmo diretório de cada servidor) e eu não sei agora como fazer isso com Ansible.

Alguma idéia?

    
por maayke 11.05.2015 / 11:57

6 respostas

16

Provavelmente, você precisará registrar conteúdo remoto e, em vez de repeti-lo, algo como isto deve 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

onde /remote deve ser alterado com o caminho do diretório em seu servidor remoto e /local/ com o diretório em seu mestre

    
por 11.05.2015 / 12:13
21

Você deve usar o módulo de sincronização para fazer isso. Isso usa o incrível poder de rsync . Ele irá copiar o arquivo & estruturas de diretório de qualquer profundidade, é à prova de balas e altamente eficiente - apenas copiando os bytes reais que foram alterados:

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

A chave é o parâmetro mode :

Specify the direction of the synchronization. In push mode the localhost or delegate is the source; In pull mode the remote host in context is the source.

    
por 28.08.2015 / 02:42
3

Eu não tenho representante suficiente para comentar, caso contrário eu adicionaria.

Eu usei o que Kęstutis postou. Eu tive que fazer uma pequena modificação

- 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 with_items foi a área que eu tive que mudar. não foi possível localizar os arquivos de outra forma.

    
por 21.12.2016 / 18:47
2
- 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
    
por 26.05.2016 / 03:39
1

Corrigindo o exemplo acima

- 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 }}"
    
por 21.02.2017 / 13:00
0

bem, se você estiver usando a última versão ansible, como 2.2.1.0, acho que precisamos de citações para o item

- 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 }}"
    
por 01.05.2017 / 03:41