Cara mengambil beberapa file dari mesin jarak jauh ke lokal dengan Ansible


17

Saya ingin menyalin file dari direktori jarak jauh ke direktori lokal dengan modul Ansible tapi fetch memungkinkan saya untuk menyalin hanya satu file. Saya memiliki banyak server dari mana saya memerlukan file (direktori yang sama setiap server) dan sekarang saya tidak bisa melakukan ini dengan Ansible.

Ada ide?

Jawaban:


22

Anda mungkin perlu mendaftarkan konten jarak jauh dan daripada memutarnya, sesuatu seperti ini akan berfungsi:

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

di mana /remoteharus diubah dengan jalur direktori pada server jauh Anda dan /local/dengan direktori pada master Anda


1
By the way, ini hanya satu tingkat dalam (meninggalkan subdirektori) dan mengabaikan direktori secara umum jadi jika itu bukan sesuatu yang Anda inginkan, cukup ubah perintah shell secara bersamaan.
Kęstutis

Apa yang akan terjadi ketika saya menjalankan banyak server? Apakah masing-masing akan mendaftarkan temuannya sendiri? dan mengambil yang benar?
Amir Mehler

ada petunjuk bagaimana melakukan ini dengan win_find? Saya tidak tahu bagaimana cara tambahan path dari daftar file yang dikembalikan
Peter Kahn

27

Anda harus menggunakan modul sinkronisasi untuk melakukan ini. Ini menggunakan kekuatan rsync yang luar biasa . Ini akan menyalin struktur file & direktori dengan kedalaman apa pun, anti peluru dan sangat efisien - hanya menyalin byte aktual yang telah berubah:

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

Kuncinya adalah modeparameter:

Tentukan arah sinkronisasi. Dalam mode push, localhost atau delegate adalah sumbernya; Dalam mode tarik, host jarak jauh dalam konteks adalah sumbernya.


1
Saya telah menemukan synchronisemodul menjadi jauh lebih dapat diandalkan dan terukur daripada metode lain yang mungkin untuk menyalin file.
anak ayam

3
Ini jelas merupakan cara yang lebih baik untuk melakukannya daripada jawaban yang diterima.
childofsoong

5

saya tidak punya cukup rep untuk berkomentar kalau tidak saya akan menambahkannya.

Saya menggunakan apa yang diposting Kęstutis. Saya harus membuat sedikit modifikasi

- 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 adalah area yang harus saya ubah. itu tidak dapat menemukan file sebaliknya.


2

Memperbaiki contoh di atas

- 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

baik, jika Anda menggunakan versi terbaru yang memungkinkan, seperti 2.2.1.0, saya pikir kita perlu mengutip item tersebut

- 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

Ini tidak bekerja sama sekali. Apakah ini sudah dicoba?
Basil A

0

Saya menggunakan ini: 1. Tarik direktori dari host jarak jauh ke host tertentu

- 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. Tarik direktori dari node ke localhost
- 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 "

inventaris

[nodes]
server1
server2
server3
[profiling_server]
server1

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.