ฉันจะคัดลอกไฟล์มากกว่าหนึ่งไฟล์ไปยังโหนดระยะไกลโดย Ansible ในงานได้อย่างไร
ฉันพยายามทำสำเนาบรรทัดโมดูลการคัดลอกในงานของฉันเพื่อกำหนดไฟล์ แต่จะคัดลอกเฉพาะไฟล์แรกเท่านั้น
ฉันจะคัดลอกไฟล์มากกว่าหนึ่งไฟล์ไปยังโหนดระยะไกลโดย Ansible ในงานได้อย่างไร
ฉันพยายามทำสำเนาบรรทัดโมดูลการคัดลอกในงานของฉันเพื่อกำหนดไฟล์ แต่จะคัดลอกเฉพาะไฟล์แรกเท่านั้น
คำตอบ:
คุณสามารถใช้with_fileglob
ลูปสำหรับสิ่งนี้:
- copy:
src: "{{ item }}"
dest: /etc/fooapp/
owner: root
mode: 600
with_fileglob:
- /playbooks/files/fooapp/*
/roles/db/files
แต่ไม่สามารถใช้วิธีนี้ได้ ฉันได้ลองแล้วwith_fileglob: - /roles/db/file/*
แต่มันก็ไม่ดีไป
- name: Your copy task
copy: src={{ item.src }} dest={{ item.dest }}
with_items:
- { src: 'containerizers', dest: '/etc/mesos/containerizers' }
- { src: 'another_file', dest: '/etc/somewhere' }
- { src: 'dynamic', dest: '{{ var_path }}' }
# more files here
dest
เซตเป็นตัวแปร { src: 'containerizers', dest: {{ containerizers }} }
.
{ src: '{{ source.var }}', dest: '{{ dest.var }}' }
คุณสามารถใช้ with_together เพื่อจุดประสงค์นี้:
- name: Copy multiple files to multiple directories
copy: src={{ item.0 }} dest={{ item.1 }}
with_together:
- [ 'file1', 'file2', 'file3' ]
- [ '/dir1/', '/dir2/', '/dir3/' ]
หากคุณต้องการมากกว่าหนึ่งตำแหน่งคุณต้องมีงานมากกว่าหนึ่งงาน งานการคัดลอกหนึ่งงานสามารถคัดลอกจากตำแหน่งเดียวเท่านั้น (รวมถึงไฟล์หลายไฟล์) ไปยังอีกที่หนึ่งบนโหนด
- copy: src=/file1 dest=/destination/file1
- copy: src=/file2 dest=/destination/file2
# copy each file over that matches the given pattern
- copy: src={{ item }} dest=/destination/
with_fileglob:
- /files/*
เนื่องจาก Ansible 2.5 with_*
โครงสร้างจึงเลิกใช้งานและloop
ควรใช้ไวยากรณ์ ตัวอย่างที่ใช้ได้จริง:
- name: Copy CA files
copy:
src: '{{item}}'
dest: '/etc/pki/ca-trust/source/anchors'
owner: root
group: root
mode: 0644
loop:
- symantec-private.crt
- verisignclass3g2.crt
- hosts: lnx
tasks:
- find: paths="/appl/scripts/inq" recurse=yes patterns="inq.Linux*"
register: file_to_copy
- copy: src={{ item.path }} dest=/usr/local/sbin/
owner: root
mode: 0775
with_items: "{{ files_to_copy.files }}"
find
โมดูลใช้งานได้กับ 2.x ที่ตอบได้เท่านั้น แต่ไม่สามารถตอบสนองได้ 1.x
stdout_lines
ในค่าส่งคืน แต่ไม่สามารถใช้ได้กับfind
โมดูล มันมีเพียงfiles
, examined
และmatched
เป็นค่าผลตอบแทน หวังว่าจะช่วยผู้อื่น
find
ดูเหมือนจะมองไปที่ระบบระยะไกลเท่านั้นไม่อนุญาตให้หยิบอะไรจากโหนดการจัดการ คำตอบเหล่านี้โดยใช้with_fileglob
ดูเหมือนว่าจะมากขึ้นเหมาะสม: stackoverflow.com/a/42290160/272387 , stackoverflow.com/a/36720342/272387
หรือคุณสามารถใช้ with_items:
- copy:
src: "{{ item }}"
dest: /etc/fooapp/
owner: root
mode: 600
with_items:
- dest_dir
- name: find inq.Linux*
find: paths="/appl/scripts/inq" recurse=yes patterns="inq.Linux*"
register: find_files
- name: set fact
set_fact:
all_files:
- "{{ find_files.files | map(attribute='path') | list }}"
when: find_files > 0
- name: copy files
copy:
src: "{{ item }}"
dest: /destination/
with_items: "{{ all_files }}"
when: find_files > 0
คุณสามารถวนซ้ำตัวแปรด้วยรายการไดเร็กทอรี:
- name: Copy files from several directories
copy:
src: "{{ item }}"
dest: "/etc/fooapp/"
owner: root
mode: "0600"
loop: "{{ files }}"
vars:
files:
- "dir1/"
- "dir2/"
ใช้ซอร์สโค้ดต่อไปนี้เพื่อคัดลอกไฟล์หลายไฟล์บนเครื่องไคลเอนต์ของคุณ
- name: Copy data to the client machine
hosts: hostname
become_method: sudo
become_user: root
become: true
tasks:
# Copy twice as sometimes files get skipped (mostly only one file skipped from a folder if the folder does not exist)
- name: Copy UFO-Server
copy:
src: "source files path"
dest: "destination file path"
owner: root
group: root
mode: 0644
backup: yes
ignore_errors: true
บันทึก:
หากคุณกำลังส่งผ่านหลายเส้นทางโดยใช้ตัวแปรแล้ว
src: "/ root / {{item}}"
หากคุณกำลังส่งผ่านเส้นทางโดยใช้ตัวแปรสำหรับรายการต่างๆ
src: "/ root / {{item.source_path}}"
copy
โมดูลเป็นเครื่องมือที่ไม่ถูกต้องสำหรับการคัดลอกไฟล์และ / หรือโครงสร้างไดเร็กทอรีจำนวนมากให้ใช้synchronize
โมดูลแทนซึ่งใช้rsync
เป็นแบ็กเอนด์ โปรดทราบว่าต้องมีการrsync
ติดตั้งทั้งบนคอนโทรลเลอร์และโฮสต์เป้าหมาย ตรวจสอบเอกสารที่ตอบได้มีประสิทธิภาพมาก
ตัวอย่าง - คัดลอกไฟล์จากbuild
ไดเร็กทอรี (พร้อมไดเร็กทอรีย่อย) ของคอนโทรลเลอร์ไปยัง/var/www/html
ไดเร็กทอรีบนโฮสต์เป้าหมาย:
synchronize:
src: ./my-static-web-page/build/
dest: /var/www/html
rsync_opts:
- "--chmod=D2755,F644" # copy from windows - force permissions