Jawaban:
Anda dapat menggunakan with_fileglob
loop untuk ini:
- copy:
src: "{{ item }}"
dest: /etc/fooapp/
owner: root
mode: 600
with_fileglob:
- /playbooks/files/fooapp/*
/roles/db/files
tetapi saya tidak bisa membuatnya berfungsi dengan metode ini. Saya sudah mencoba with_fileglob: - /roles/db/file/*
tetapi tidak akan baik-baik saja jalannya
- 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
himpunan sebagai variabel? { src: 'containerizers', dest: {{ containerizers }} }
.
{ src: '{{ source.var }}', dest: '{{ dest.var }}' }
Anda dapat menggunakan with_together untuk tujuan ini:
- name: Copy multiple files to multiple directories
copy: src={{ item.0 }} dest={{ item.1 }}
with_together:
- [ 'file1', 'file2', 'file3' ]
- [ '/dir1/', '/dir2/', '/dir3/' ]
Jika Anda membutuhkan lebih dari satu lokasi, Anda memerlukan lebih dari satu tugas. Satu tugas salin hanya dapat menyalin dari satu lokasi (termasuk beberapa file) ke lokasi lain di node.
- 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/*
Karena Ansible 2.5, with_*
konstruksi tidak digunakan lagi , dan loop
sintaks harus digunakan. Contoh praktis sederhana:
- 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
modul hanya bekerja untuk kemungkinan 2.x tetapi tidak untuk kemungkinan 1.x
stdout_lines
nilai kembali tetapi tidak berlaku untuk find
modul. Itu hanya memiliki files
, examined
dan matched
sebagai nilai kembali. Harapan yang membantu orang lain
find
tampaknya hanya melihat sistem jarak jauh, tidak memungkinkan untuk mengambil apa pun dari node pengelola. Jawaban ini, menggunakan with_fileglob
, tampaknya lebih cocok: stackoverflow.com/a/42290160/272387 , stackoverflow.com/a/36720342/272387 .
- 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
Gunakan kode sumber berikut untuk menyalin beberapa file di komputer klien Anda.
- 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
catatan:
Jika Anda melewati beberapa jalur dengan menggunakan variabel kemudian
src: "/ root / {{item}}"
Jika Anda melewati jalur dengan menggunakan variabel untuk item yang berbeda maka
src: "/ root / {{item.source_path}}"
copy
modul adalah alat yang salah untuk menyalin banyak file dan / atau struktur direktori, gunakan synchronize
modul sebagai gantinya yang digunakan rsync
sebagai backend. Pikiran Anda, itu perlu rsync
diinstal pada pengontrol dan host target. Ini sangat kuat, periksa dokumentasi yang memungkinkan .
Contoh - salin file dari build
direktori (dengan subdirektori) pengontrol ke /var/www/html
direktori pada host target:
synchronize:
src: ./my-static-web-page/build/
dest: /var/www/html
rsync_opts:
- "--chmod=D2755,F644" # copy from windows - force permissions