วิธีการดึงไฟล์หลายไฟล์จากเครื่องระยะไกลไปยังท้องถิ่นด้วย Ansible


17

ฉันต้องการคัดลอกไฟล์จากรีโมตไดเร็กทอรีไปยังโลคัลไดเร็กทอรีด้วย Ansible แต่โมดูลการดึงข้อมูลช่วยให้ฉันสามารถคัดลอกไฟล์เดียวเท่านั้น ฉันมีเซิร์ฟเวอร์จำนวนมากที่ฉันต้องการไฟล์ (ไดเรกทอรีเดียวกันแต่ละเซิร์ฟเวอร์) และตอนนี้ฉันไม่สามารถทำได้ด้วย Ansible

ความคิดใด ๆ

คำตอบ:


22

คุณอาจจะต้องลงทะเบียนเนื้อหาระยะไกลและนอกเหนือจากการวนรอบเนื้อหาบางอย่างเช่นนี้ควรใช้งานได้:

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

ที่/remoteควรเปลี่ยนด้วยเส้นทางไดเรกทอรีบนเซิร์ฟเวอร์ระยะไกลของคุณและ/local/กับไดเรกทอรีในต้นแบบของคุณ


1
โดยวิธีนี้จะลึกเพียงหนึ่งระดับ (ออกจากไดเรกทอรีย่อย) และละเว้นไดเรกทอรีโดยทั่วไปดังนั้นหากไม่ใช่สิ่งที่คุณต้องการเพียงแค่เปลี่ยนคำสั่งเชลล์อย่างชัดเจน
Kęstutis

จะเกิดอะไรขึ้นเมื่อฉันทำงานบนเซิร์ฟเวอร์จำนวนมาก การลงทะเบียนแต่ละครั้งจะเป็นการค้นพบของตัวเองหรือไม่ และเรียกสิ่งที่ถูกต้อง?
Amir Mehler

เบาะแสวิธีการทำเช่นนี้กับ win_find? ฉันไม่สามารถหาเส้นทางพิเศษจากรายการไฟล์ที่ส่งคืนได้
Peter Kahn

27

คุณควรใช้โมดูลซิงโครไนซ์เพื่อทำสิ่งนี้ นี้จะใช้อำนาจที่น่ากลัวของrsync มันจะคัดลอกโครงสร้างไฟล์และไดเรกทอรีของความลึกใด ๆ เป็นกระสุนและมีประสิทธิภาพสูง - เพียงคัดลอกไบต์จริงที่มีการเปลี่ยนแปลง:

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

กุญแจสำคัญคือmodeพารามิเตอร์:

ระบุทิศทางของการซิงโครไนซ์ ในโหมดพุช localhost หรือผู้รับมอบสิทธิ์เป็นแหล่งกำเนิด ในโหมดดึงโฮสต์ระยะไกลในบริบทเป็นแหล่งที่มา


1
ฉันพบว่าsynchroniseโมดูลมีความน่าเชื่อถือและปรับขนาดได้มากกว่าวิธีอื่น ๆ ที่สามารถคัดลอกไฟล์ได้
ลูกไก่

3
นี่เป็นวิธีที่ดีกว่าที่จะทำมากกว่าคำตอบที่ยอมรับ
childofsoong

5

ฉันไม่มีตัวแทนเพียงพอที่จะแสดงความคิดเห็นมิฉะนั้นฉันจะเพิ่ม

ฉันใช้สิ่งที่Kęstutisโพสต์ ฉันต้องทำการปรับเปลี่ยนเล็กน้อย

- 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 คือพื้นที่ที่ฉันต้องเปลี่ยน ไม่สามารถค้นหาไฟล์ได้


2

แก้ไขตัวอย่างข้างต้น

- 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 ฉันคิดว่าเราจำเป็นต้องมีเครื่องหมายคำพูดสำหรับรายการ

- 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

มันไม่ทำงานเลย มีการทดลองนี้หรือไม่?
เพรา A

0

ฉันใช้สิ่งนี้: 1. ดึงไดเรกทอรีจากโฮสต์ระยะไกลไปยังโฮสต์ที่เฉพาะเจาะจง

- 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. ดึงไดเร็กทอรีจากโหนดไปยัง 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 "

สินค้าคงคลัง

[nodes]
server1
server2
server3
[profiling_server]
server1

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.