Jak pobrać wiele plików ze zdalnego komputera na lokalny za pomocą Ansible

17

Chciałbym skopiować pliki ze zdalnego katalogu do katalogu lokalnego za pomocą Ansible, ale moduł pobierania pozwala mi skopiować tylko jeden plik. Mam wiele serwerów, z których potrzebuję plików (ten sam katalog na każdym serwerze) i nie wiem, jak to zrobić za pomocą Ansible.

Jakieś pomysły?

maayke
źródło

Odpowiedzi:

22

Prawdopodobnie będziesz musiał zarejestrować zdalną zawartość, a następnie zapętlić ją, coś takiego powinno działać:

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

gdzie /remotenależy zmienić za pomocą ścieżki katalogu na zdalnym serwerze i /local/katalogu na serwerze głównym

Kęstutis
źródło
1
Nawiasem mówiąc, to idzie tylko jeden poziom w głąb (pomija podkatalogi) i ogólnie ignoruje katalogi, więc jeśli nie jest to coś, czego pragniesz, po prostu zmień polecenie powłoki.
Kęstutis
Co się stanie, gdy uruchomię kilka serwerów? czy każdy zarejestruje własne ustalenia? i pobrać odpowiednie?
Amir Mehler,
jakieś wskazówki, jak to zrobić za pomocą win_find? Nie mogę wymyślić, jak dodać ścieżkę z listy plików, którą zwraca
Peter Kahn
27

W tym celu należy użyć modułu synchronizacji . Wykorzystuje to niesamowitą moc rsync . Kopiuje struktury plików i katalogów o dowolnej głębokości, jest kuloodporny i bardzo wydajny - kopiuje tylko te bajty, które uległy zmianie:

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

Kluczem jest modeparametr:

Określ kierunek synchronizacji. W trybie push host lokalny lub delegat jest źródłem; W trybie ciągłym zdalny host w kontekście jest źródłem.

Zamek Duncana
źródło
1
Odkryłem, że synchronisemoduł jest znacznie bardziej niezawodny i skalowalny niż inne metody, które ansible musi kopiować.
pisklęta
3
Jest to zdecydowanie lepszy sposób na zrobienie tego niż zaakceptowana odpowiedź.
childofsoong
5

nie mam wystarczającej liczby przedstawicieli, aby skomentować, w przeciwnym razie dodałbym to.

Użyłem tego, co napisał Kęstutis. musiałem dokonać drobnej modyfikacji

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

Elementy with_items to obszar, który musiałem zmienić. w przeciwnym razie nie byłby w stanie zlokalizować plików.

JamStar
źródło
2

Naprawianie powyższego przykładu

- 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
źródło
1

cóż, jeśli używasz najnowszej wersji ansible, takiej jak 2.2.1.0, myślę, że potrzebujemy cudzysłowu

- 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
źródło
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
źródło
To w ogóle nie działa. Czy zostało to wypróbowane?
Basil A
0

Używam tego: 1. Ściągnij katalogi ze zdalnego hosta do określonych hostów

- 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. Przeciągnij katalogi z węzła do hosta lokalnego
- 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 "

Inwentarz

[nodes]
server1
server2
server3
[profiling_server]
server1

kmajumder
źródło