Réponses:
Vous pouvez utiliser la with_fileglobboucle pour cela:
- copy:
src: "{{ item }}"
dest: /etc/fooapp/
owner: root
mode: 600
with_fileglob:
- /playbooks/files/fooapp/*
/roles/db/filesmais je ne peux pas le faire fonctionner avec cette méthode. J'ai essayé with_fileglob: - /roles/db/file/* mais ça ne va pas bien le chemin
- 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
destensemble comme variable? { src: 'containerizers', dest: {{ containerizers }} }.
{ src: '{{ source.var }}', dest: '{{ dest.var }}' }
Vous pouvez utiliser with_together à cet effet:
- name: Copy multiple files to multiple directories
copy: src={{ item.0 }} dest={{ item.1 }}
with_together:
- [ 'file1', 'file2', 'file3' ]
- [ '/dir1/', '/dir2/', '/dir3/' ]
Si vous avez besoin de plus d'un emplacement, vous avez besoin de plus d'une tâche. Une tâche de copie ne peut copier qu'un emplacement (y compris plusieurs fichiers) vers un autre sur le nœud.
- 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/*
Depuis Ansible 2.5, les with_*constructions sont obsolètes et la loopsyntaxe doit être utilisée. Un exemple pratique simple:
- 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 }}"
findmodule ne fonctionne que pour ansible 2.x mais pas pour ansible 1.x
stdout_linesdans la valeur de retour mais n'est pas applicable pour le findmodule. Il a seulement files, examinedet matchedque les valeurs de retour. J'espère que cela aidera les autres
findne semble regarder que le système distant, ne permettant pas de récupérer quoi que ce soit du nœud de gestion. Ces réponses, en utilisant with_fileglob, semblent plus appropriées: 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
Utilisez le code source suivant pour copier plusieurs fichiers sur votre ordinateur 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
Remarque:
Si vous passez plusieurs chemins en utilisant la variable, alors
src: "/ root / {{élément}}"
Si vous passez le chemin en utilisant une variable pour différents éléments, alors
src: "/ root / {{item.source_path}}"
copymodule est un mauvais outil pour copier de nombreux fichiers et / ou une structure de répertoires, utilisez synchronizeplutôt le module qui utilise rsynccomme backend. Attention, il doit être rsyncinstallé à la fois sur le contrôleur et sur l'hôte cible. C'est vraiment puissant, vérifiez la documentation disponible .
Exemple - copier des fichiers du buildrépertoire (avec sous-répertoires) du contrôleur vers le /var/www/htmlrépertoire sur l'hôte cible:
synchronize:
src: ./my-static-web-page/build/
dest: /var/www/html
rsync_opts:
- "--chmod=D2755,F644" # copy from windows - force permissions