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

17

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

Alguma ideia?

maayke
fonte

Respostas:

22

Você provavelmente precisará registrar conteúdo remoto e, em seguida, fazer um loop sobre ele, 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 /remotedeve ser alterado com o caminho do diretório no servidor remoto e /local/com o diretório no seu mestre

Kęstutis
fonte
1
A propósito, isso atinge apenas um nível de profundidade (exclui subdiretórios) e ignora os diretórios em geral; portanto, se isso não é o que você deseja, basta alterar o comando do shell de acordo.
Kęstutis
O que acontecerá quando eu rodar em vários servidores? cada um registrará suas próprias descobertas? e buscar os certos?
Amir Mehler
alguma pista de como fazer isso com o win_find? Eu não consigo descobrir como caminho extra a partir da lista de arquivo ele retorna
Peter Kahn
27

Você deve usar o módulo de sincronização para fazer isso. Isso usa o incrível poder do rsync . Ele copiará estruturas de arquivos e diretórios 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 modeparâmetro:

Especifique a direção da sincronização. No modo push, o host ou delegado local é a fonte; No modo pull, o host remoto no contexto é a fonte.

Duncan Lock
fonte
1
Eu achei o synchronisemódulo muito mais confiável e escalável do que os outros métodos que o ansible tem para copiar arquivos.
pintainhos
3
Definitivamente, é uma maneira melhor de fazê-lo do que a resposta aceita.
childofsoong 02/02
5

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

Eu usei o que Kęstutis postou. eu tive que fazer uma ligeira 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 maneira.

JamStar
fonte
2

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

bem, se você estiver usando a versão mais recente, como 2.2.1.0, acho que precisamos de aspas 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 }}"
Z.Liu
fonte
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
fonte
Isso não funciona. Isso já foi tentado?
Basil A
0

Eu uso o seguinte: 1. Puxe diretórios do host remoto para 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. Puxar diretórios do nó para o host 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 "

inventário

[nodes]
server1
server2
server3
[profiling_server]
server1

kmajumder
fonte