Respuestas:
Puedes usar el with_fileglob
bucle para esto:
- copy:
src: "{{ item }}"
dest: /etc/fooapp/
owner: root
mode: 600
with_fileglob:
- /playbooks/files/fooapp/*
/roles/db/files
pero 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
dest
conjunto 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 }}"
find
módulo solo funciona para ansible 2.x pero no para ansible 1.x
stdout_lines
en el valor de retorno, pero no es aplicable para el find
módulo. Sólo se tiene files
, examined
y matched
como valores de retorno. Espero que ayuden a otros
find
solo 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 loop
debe 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}}"
copy
module es una herramienta incorrecta para copiar muchos archivos y / o estructura de directorio, use synchronize
module en su lugar que usa rsync
como backend. Eso sí, requiere estar rsync
instalado tanto en el controlador como en el host de destino. Es realmente poderoso, verifique la documentación de ansible .
Ejemplo: copiar archivos del build
directorio (con subdirectorios) del controlador al /var/www/html
directorio 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