Comment copier plus d'un fichier dans des nœuds distants avec Ansible dans une tâche?
J'ai essayé de dupliquer la ligne du module de copie dans ma tâche pour définir des fichiers, mais cela ne fait que copier le premier fichier.
Vous pouvez utiliser la boucle with_fileglob
pour cela:
- copy:
src: "{{ item }}"
dest: /etc/fooapp/
owner: root
mode: 600
with_fileglob:
- /playbooks/files/fooapp/*
- 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
Vous pouvez utiliser with_together à cette fin:
- 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 plusieurs sites, vous avez besoin de plusieurs tâches. Une tâche de copie ne peut copier qu'un emplacement (y compris plusieurs fichiers) vers un autre emplacement 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/*
- 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 }}"
- 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
Ou vous pouvez utiliser with_items:
- copy:
src: "{{ item }}"
dest: /etc/fooapp/
owner: root
mode: 600
with_items:
- dest_dir
Le module copy
est un outil inapproprié pour copier de nombreux fichiers et/ou la structure de répertoires. Utilisez plutôt le module synchronize
, qui utilise rsync
comme moteur. Remarquez que rsync
doit être installé sur le contrôleur et l’hôte cible. C'est vraiment puissant, vérifiez documentation ansible .
Exemple - Copiez les fichiers du répertoire build
(avec les sous-répertoires) du contrôleur dans le répertoire /var/www/html
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