tutorial playbooks playbook modules ejemplos comandos ansible ansible-playbook ansible-2.x

playbooks - Ansible: copiar el contenido de un directorio a otro directorio



comandos ansible (9)

¡Me involucré todo un día, también! y finalmente encontró la solución en el comando de shell en lugar de copiar: o comando: como se muestra a continuación:

- hosts: remote-server-name gather_facts: no vars: src_path: "/path/to/source/" des_path: "/path/to/dest/" tasks: - name: Ansible copy files remote to remote shell: ''cp -r {{ src_path }}/. {{ des_path }}''

Observe estrictamente que: 1. src_path y des_path finalizan por / símbolo 2. en el comando de shell src_path finaliza por . que muestra todo el contenido del directorio 3. Utilicé mi nombre de servidor remoto en hosts: y ejecuté la sección de shell de jenkins, en lugar de remote_src: specifier en libro de jugadas.

Supongo que es un buen consejo ejecutar el siguiente comando en la sección Ejecutar Shell en jenkins:

ansible-playbook copy-payment.yml -i remote-server-name

Estoy tratando de copiar el contenido del directorio dist al directorio nginx.

Escribo lo siguiente:

- name: copy html file copy: src=/home/vagrant/dist/ dest=/usr/share/nginx/html/ remote_src=yes directory_mode=yes

Pero cuando ejecuto el libro de jugadas arroja un error:

TASK [NGINX : copy html file] ************************************************** fatal: [172.16.8.200]: FAILED! => {"changed": false, "failed": true, "msg": "attempted to take checksum of directory:/home/vagrant/dist/"}

¿Tiene un error al copiar un directorio? ¿Cómo puedo copiar un contenido de directorio que tenga dentro de otro directorio y un archivo?

¿Alguna ayuda? Gracias


A continuación funcionó para mí,

-name: Upload html app directory to Deployment host copy: src=/var/lib/jenkins/workspace/Demoapp/html dest=/var/www/ directory_mode=yes


Ansible remote_src no admite la copia recursiva. Consulte la descripción de remote_src en Documentos de copia ansible.

Para copiar recursivamente el contenido de una carpeta y asegurar que la tarea permanezca idempotente, generalmente lo hago de esta manera:

- name: get file names to copy command: "find /home/vagrant/dist -type f" register: files_to_copy - name: copy files copy: src: "{{ item }}" dest: "/usr/share/nginx/html" owner: nginx group: nginx remote_src: True mode: 0644 with_items: - "{{ files_to_copy.stdout_lines }}"

El inconveniente es que el comando de búsqueda sigue apareciendo como ''cambiado''


Encontré una solución para la copia recursiva de remoto a remoto:

- name: List files in /usr/share/easy-rsa find: path: /usr/share/easy-rsa recurse: yes file_type: any register: find_result - name: Create the directories file: path: "{{ item.path | regex_replace(''/usr/share/easy-rsa'',''/etc/easy-rsa'') }}" state: directory mode: "{{ item.mode }}" with_items: - "{{ find_result.files }}" when: - item.isdir - name: Copy the files copy: src: "{{ item.path }}" dest: "{{ item.path | regex_replace(''/usr/share/easy-rsa'',''/etc/easy-rsa'') }}" remote_src: yes mode: "{{ item.mode }}" with_items: - "{{ find_result.files }}" when: - item.isdir == False


Esto encontré una solución ideal para copiar archivos del servidor Ansible al remoto.

copiando archivo yaml

- hosts: localhost user: {{ user }} connection: ssh become: yes gather_facts: no tasks: - name: Creation of directory on remote server file: path: /var/lib/jenkins/.aws state: directory mode: 0755 register: result - debug: var: result - name: get file names to copy command: "find conf/.aws -type f" register: files_to_copy - name: copy files copy: src: "{{ item }}" dest: "/var/lib/jenkins/.aws" owner: {{ user }} group: {{ group }} remote_src: True mode: 0644 with_items: - "{{ files_to_copy.stdout_lines }}"


La solución más sencilla que he encontrado para copiar el contenido de una carpeta sin copiar la carpeta es usar lo siguiente:

- name: Move directory contents command: cp -r /<source_path>/. /<dest_path>/

Esto resuelve la surfer190 de seguimiento de @ surfer190 :

Hmmm y si quieres copiar todo el contenido? Noté que * no funciona - surfer190 23 de julio de 2016 a las 7:29

* es un shell glob, ya que se basa en su shell para enumerar todos los archivos dentro de la carpeta antes de ejecutar cp , mientras que el . instruye directamente a cp para obtener el contenido del directorio (consulte https://askubuntu.com/questions/86822/how-can-i-copy-the-contents-of-a-folder-to-another-folder-in-a-different-directo


Podrías usar el módulo de synchronize . El ejemplo de la documentación:

# Synchronize two directories on one remote host. - synchronize: src: /first/absolute/path dest: /second/absolute/path delegate_to: "{{ inventory_hostname }}"

Esto tiene el beneficio adicional de que será más eficiente para archivos grandes / muchos.


Respuesta resuelta: para copiar el contenido de un directorio en otro directorio, uso el siguiente:

- name: copy consul_ui files command: cp -r /home/{{ user }}/dist/{{ item }} /usr/share/nginx/html with_items: - "index.html" - "static/"

Copia ambos elementos al otro directorio. En el ejemplo, uno de los elementos es un directorio y el otro no. Funciona perfectamente.


El módulo Ansible Copy copia de forma predeterminada los archivos / dirs de la máquina de control a la máquina remota. Si desea copiar archivos / dirs en una máquina remota y tiene Ansible 2.0 , configure remote_src en yes

- name: copy html file copy: src=/home/vagrant/dist/ dest=/usr/share/nginx/html/ remote_src=yes directory_mode=yes