Ansible ile uzak makineden yerel dosyaya birden fazla dosya nasıl getirilir


17

Ansible ile uzak dizinden yerel dizine dosyaları kopyalamak istiyorum ama getirme modülü sadece bir dosyayı kopyalamama izin veriyor. Dosyalara ihtiyacım olan birçok sunucu var (her sunucu aynı dizin) ve şimdi Ansible ile bunu nasıl yapacağım.

Herhangi bir fikir?

Yanıtlar:


22

Muhtemelen uzak içeriği kaydetmeniz gerekir ve bunun üzerinden döngü yapmak yerine, böyle bir şey işe yarayacaktır:

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

nerede /remoteuzak sunucuda ve dizin yolu ile değiştirilmesi gerektiğini /local/efendin dizine ile


1
Bu arada, bu sadece bir seviye derinliğe iner (alt dizinleri bırakır) ve genel olarak dizinleri yok sayar, bu yüzden istediğiniz bir şey değilse, kabuk komutunu kolayca değiştirin.
Kęstutis

Bir grup sunucuda çalıştırdığımda ne olacak? her biri kendi bulgularını kaydedecek mi? ve doğru olanları getirme?
Amir Mehler

herhangi bir ipucu nasıl win_find ile yapmak için?
Peter Kahn

28

Bunu yapmak için senkronizasyon modülünü kullanmalısınız . Bu rsync'in müthiş gücünü kullanır . Herhangi bir derinlikte dosya ve dizin yapılarını kopyalar, kurşun geçirmez ve yüksek verimlidir - sadece değişen gerçek baytları kopyalar:

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

Anahtar modeparametredir:

Senkronizasyonun yönünü belirtin. İtme modunda localhost veya delege kaynaktır; Çekme modunda bağlamdaki uzak ana bilgisayar kaynaktır.


1
Bulduğum synchronisemodülü çok daha güvenilir ve ölçeklenebilir yanıtlayıcı 'dosyaları kopyalamak zorundadır diğer yöntemlere göre daha olmaktır.
civcivler

3
Bu kesinlikle kabul edilen cevaptan daha iyi bir yöntemdir.
childofsoong

5

başka yorum eklemek için yeterli temsilcisi yok.

Kęstutis'in gönderdiklerini kullandım. küçük bir değişiklik yapmak zorunda kaldım

- 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 değiştirmek zorunda kaldı alan oldu. aksi halde dosyaları bulamadı.


2

Yukarıdaki örneği düzeltme

- 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

2.2.1.0 gibi en yeni ansible sürümünü kullanıyorsanız, öğeye alıntı yapmamız gerektiğini düşünüyorum

- 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

Bu hiç işe yaramıyor. Bu denendi mi?
Basil A

0

Bunu kullanın: 1. Uzak ana bilgisayardan belirli ana bilgisayarlara dizinleri çekin

- 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. Dizinleri düğümden localhost'a çekin
- 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 "

envanter

[nodes]
server1
server2
server3
[profiling_server]
server1

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.