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?

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


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.


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.


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

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

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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.