Risposte:
Puoi usare il with_fileglobciclo per questo:
- copy:
src: "{{ item }}"
dest: /etc/fooapp/
owner: root
mode: 600
with_fileglob:
- /playbooks/files/fooapp/*
/roles/db/filesma non riesco a farlo funzionare con questo metodo. Ho provato with_fileglob: - /roles/db/file/* ma non andrà bene il percorso
- 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
destinsieme come variabile? { src: 'containerizers', dest: {{ containerizers }} }.
{ src: '{{ source.var }}', dest: '{{ dest.var }}' }
Puoi usare with_together per questo scopo:
- name: Copy multiple files to multiple directories
copy: src={{ item.0 }} dest={{ item.1 }}
with_together:
- [ 'file1', 'file2', 'file3' ]
- [ '/dir1/', '/dir2/', '/dir3/' ]
Se hai bisogno di più di una posizione, hai bisogno di più di un'attività. Un'attività di copia può copiare solo da una posizione (inclusi più file) a un'altra sul nodo.
- 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/*
A partire da Ansible 2.5 i with_*costrutti sono deprecati e loopdovrebbe essere usata la sintassi. Un semplice esempio pratico:
- 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 }}"
finda margine che il modulo funziona solo per ansible 2.x ma non per ansible 1.x
stdout_linesvalore di ritorno ma non è applicabile per il findmodulo. Si hanno solo files, examinede matchedcome valori di ritorno. Spero che questo aiuti gli altri
findsembra solo guardare il sistema remoto, non permettendo di afferrare nulla dal nodo di gestione. Queste risposte, utilizzando with_fileglob, sembrano essere più adatte: 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
Usa il seguente codice sorgente per copiare più file sul tuo computer client.
- 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
Nota:
Se stai passando più percorsi usando la variabile allora
src: "/ root / {{item}}"
Se stai passando percorso utilizzando una variabile per elementi diversi, allora
src: "/ root / {{item.source_path}}"
copymodule è uno strumento sbagliato per copiare molti file e / o strutture di directory, usa synchronizeinvece module che usa rsynccome backend. Intendiamoci, richiede l' rsyncinstallazione sia sul controller che sull'host di destinazione. È davvero potente, controlla la documentazione ansible .
Esempio: copia i file dalla builddirectory (con le sottodirectory) del controller alla /var/www/htmldirectory sull'host di destinazione:
synchronize:
src: ./my-static-web-page/build/
dest: /var/www/html
rsync_opts:
- "--chmod=D2755,F644" # copy from windows - force permissions