Réponses:
Vous pouvez utiliser la with_fileglob
boucle pour cela:
- copy:
src: "{{ item }}"
dest: /etc/fooapp/
owner: root
mode: 600
with_fileglob:
- /playbooks/files/fooapp/*
/roles/db/files
mais 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
dest
ensemble 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 loop
syntaxe 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 }}"
find
module ne fonctionne que pour ansible 2.x mais pas pour ansible 1.x
stdout_lines
dans la valeur de retour mais n'est pas applicable pour le find
module. Il a seulement files
, examined
et matched
que les valeurs de retour. J'espère que cela aidera les autres
find
ne 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}}"
copy
module est un mauvais outil pour copier de nombreux fichiers et / ou une structure de répertoires, utilisez synchronize
plutôt le module qui utilise rsync
comme backend. Attention, il doit être rsync
installé à 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 build
répertoire (avec sous-répertoires) du contrôleur vers le /var/www/html
ré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