Respuestas:
Puedes usar el with_fileglobbucle para esto:
- copy:
src: "{{ item }}"
dest: /etc/fooapp/
owner: root
mode: 600
with_fileglob:
- /playbooks/files/fooapp/*
/roles/db/filespero no puedo hacerlo funcionar con este método. Lo he intentado, with_fileglob: - /roles/db/file/* pero el camino no va bien
- 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
destconjunto como variable? { src: 'containerizers', dest: {{ containerizers }} }.
{ src: '{{ source.var }}', dest: '{{ dest.var }}' }
Puede usar with_together para este propósito:
- name: Copy multiple files to multiple directories
copy: src={{ item.0 }} dest={{ item.1 }}
with_together:
- [ 'file1', 'file2', 'file3' ]
- [ '/dir1/', '/dir2/', '/dir3/' ]
Si necesita más de una ubicación, necesita más de una tarea. Una tarea de copia puede copiar solo desde una ubicación (incluidos varios archivos) a otra en el 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/*
- 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 }}"
findmódulo solo funciona para ansible 2.x pero no para ansible 1.x
stdout_linesen el valor de retorno, pero no es aplicable para el findmódulo. Sólo se tiene files, examinedy matchedcomo valores de retorno. Espero que ayuden a otros
findsolo parece mirar el sistema remoto, no permitiendo tomar nada del nodo de administración. Estas respuestas, usando with_fileglob, parecen ser más adecuadas: stackoverflow.com/a/42290160/272387 , stackoverflow.com/a/36720342/272387 .
Desde Ansible 2.5, las with_*construcciones están en desuso y se loopdebe usar la sintaxis. Un ejemplo práctico sencillo:
- 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
- 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
Utilice el siguiente código fuente para copiar varios archivos en su máquina cliente.
- 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:
Si está pasando varias rutas mediante el uso de variables, entonces
src: "/ root / {{item}}"
Si está pasando la ruta utilizando una variable para diferentes elementos, entonces
src: "/ root / {{item.source_path}}"
copymodule es una herramienta incorrecta para copiar muchos archivos y / o estructura de directorio, use synchronizemodule en su lugar que usa rsynccomo backend. Eso sí, requiere estar rsyncinstalado tanto en el controlador como en el host de destino. Es realmente poderoso, verifique la documentación de ansible .
Ejemplo: copiar archivos del builddirectorio (con subdirectorios) del controlador al /var/www/htmldirectorio en el host de destino:
synchronize:
src: ./my-static-web-page/build/
dest: /var/www/html
rsync_opts:
- "--chmod=D2755,F644" # copy from windows - force permissions