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