Introducción
En este laboratorio, explorarás el módulo Ansible Copy, que te permite copiar archivos y directorios a hosts remotos. El módulo Copy proporciona una forma flexible y eficiente de transferir archivos como parte de tus tareas de automatización de Ansible.
Copiar un archivo a un host remoto
En este paso, copiarás un archivo desde la máquina de control a un host remoto utilizando el módulo Ansible Copy.
Primero, crea un nuevo archivo de playbook de Ansible llamado /home/labex/project/copy-module-playbook.yaml y ábrelo en un editor de texto.
Agrega el siguiente contenido al archivo del playbook:
- hosts: localhost
tasks:
- name: Copy a file to remote host
copy:
src: /home/labex/file.txt
dest: /home/labex/project/file.txt
copy: Utiliza el módulocopyde Ansible, que se utiliza para copiar archivos desde el nodo de control (host local) a un host remoto.src: Especifica la ruta del archivo de origen, indicando la ruta del archivo que se va a copiar en el host local.dest: Especifica la ruta del archivo de destino, indicando a dónde se debe copiar el archivo en el host remoto.
A través de esta tarea del playbook, el archivo /home/labex/file.txt se copiará a la ruta /home/labex/project/file.txt en el host remoto. El módulo copy de Ansible facilita el proceso de copiar archivos de manera eficiente.
A continuación, crea un archivo llamado file.txt en el directorio /home/labex.
echo "This is the content of the file." > /home/labex/file.txt
Luego, ejecuta el playbook utilizando el siguiente comando:
ansible-playbook copy-module-playbook.yaml
Ejemplo de salida:
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'
PLAY [localhost] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Copy a file to remote host] **********************************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Finalmente, verifica que el archivo file.txt exista en la ruta de destino especificada en el host remoto.
cat /home/labex/project/file.txt
Ejemplo de salida:
This is the content of the file.
Aquí "This is the content of the file." es el mismo contenido que el archivo /home/labex/file.txt, lo que significa que el archivo /home/labex/file.txt se ha copiado exitosamente a /home/labex/project/file.txt.
Copiar un directorio a un host remoto
En este paso, copiarás un directorio desde la máquina de control a un host remoto utilizando el módulo Ansible Copy.
Primero, modifica el archivo de playbook existente eliminando todo el contenido y agregando el siguiente contenido al archivo del playbook:
- hosts: localhost
tasks:
- name: Copy a directory to remote host
copy:
src: /home/labex/directory
dest: /home/labex/project/
Con el tipo de paso 1, si src se establece como un directorio, esta tarea del playbook copia el directorio /home/labex/directory a la ruta /home/labex/project/ en el host remoto.
A continuación, crea un directorio llamado directory en el directorio /home/labex y crea un archivo llamado file2.txt en el directorio directory.
mkdir /home/labex/directory
touch /home/labex/directory/file2.txt
Luego, ejecuta el playbook utilizando el siguiente comando:
ansible-playbook copy-module-playbook.yaml
Ejemplo de salida:
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'
PLAY [localhost] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Copy a directory to remote host] *****************************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Finalmente, verifica que el directorio directory y su contenido existan en la ruta de destino especificada en el host remoto.
tree /home/labex/project
Salida esperada:
/home/labex/project
├── copy-module-playbook.yaml
├── directory
│ └── file2.txt
└── file.txt
1 directory, 3 files
Puedes ver que el directorio directory y el archivo file2.txt se han copiado exitosamente al directorio /home/labex/project en el host de destino.
Preservar atributos de archivos
En este paso, aprenderás cómo preservar atributos de archivos, como permisos y marcas de tiempo, cuando uses el módulo Ansible Copy.
Primero, modifica el archivo de playbook existente eliminando todo el contenido y agregando el siguiente contenido al archivo del playbook:
- hosts: localhost
tasks:
- name: Preserve file attributes
copy:
src: /home/labex/file.txt
dest: /tmp/file.txt
mode: preserve
mode: preserve: Este parámetro preserva el modo (permisos) del archivo de origen durante el proceso de copia, asegurando que el archivo de destino conserve los mismos permisos que el archivo de origen.
A través de esta tarea del playbook, el archivo /home/labex/file.txt se copiará a /tmp/file.txt en el host remoto, preservando al mismo tiempo los atributos del archivo, como los permisos.
Luego, ejecuta el playbook utilizando el siguiente comando:
ansible-playbook copy-module-playbook.yaml
Ejemplo de salida:
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'
PLAY [localhost] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Preserve file attributes] ************************************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Finalmente, verifica que el archivo file.txt se haya copiado a la ruta de destino especificada en el host remoto preservando sus atributos.
Usa ll para ver los detalles de /home/labex/file.txt:
ll /home/labex/file.txt
Ejemplo de salida:
-rw-rw-r-- 1 labex labex 33 Mar 9 08:34 /home/labex/file.txt
Usa ll para ver los detalles de /tmp/file.txt:
ll /tmp/file.txt
Ejemplo de salida:
-rw-rw-r-- 1 labex labex 33 Mar 9 09:00 /tmp/file.txt
Este playbook de Ansible se puede utilizar para preservar patrones de permisos (bits de permiso) y información del propietario durante el proceso de replicación.
Manejar permisos
En este paso, explorarás cómo manejar los permisos de archivos cuando uses el módulo Ansible Copy. Aprenderás cómo establecer permisos específicos para el archivo copiado en el host remoto.
Primero, modifica el archivo de playbook existente eliminando todo el contenido y agregando el siguiente contenido al archivo del playbook:
- hosts: localhost
tasks:
- name: Handle permissions
copy:
src: /home/labex/file.txt
dest: /tmp/file1.txt
mode: "0644"
mode: Reemplaza"0644"con el modo de permiso deseado para el archivo. Consulta la documentación de chmod para obtener más información sobre los modos de permiso.
A través de esta tarea del playbook, el archivo /home/labex/file.txt se copiará a /tmp/file1.txt en el host remoto, con los permisos especificados de 0644.
Luego, ejecuta el playbook utilizando el siguiente comando:
ansible-playbook copy-module-playbook.yaml
Ejemplo de salida:
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'
PLAY [localhost] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Handle permissions] ******************************************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Finalmente, verifica que el archivo file1.txt se haya copiado a la ruta de destino especificada en el host remoto con los permisos establecidos.
Usa ll para ver los detalles de /home/labex/file.txt:
ll /home/labex/file.txt
Ejemplo de salida:
-rw-rw-r-- 1 labex labex 33 Mar 9 08:34 /home/labex/file.txt
Usa ll para ver los detalles de /tmp/file1.txt:
ll /tmp/file1.txt
Ejemplo de salida:
-rw-r--r-- 1 labex labex 33 Mar 9 09:11 /tmp/file1.txt
Este playbook de Ansible se puede utilizar para establecer permisos específicos, como lectura, escritura y ejecución, para el archivo en el host remoto.
Copia idempotente
En este paso, harás que la operación de copia sea idempotente utilizando el módulo Ansible Copy. Asegurarás que el archivo solo se copie si no existe en el host remoto o si el archivo de origen ha cambiado.
Primero, modifica el archivo de playbook existente eliminando todo el contenido y agregando el siguiente contenido al archivo del playbook:
- hosts: localhost
tasks:
- name: Idempotent copy
copy:
src: /home/labex/file.txt
dest: /tmp/file2.txt
remote_src: yes
remote_src: yes: Este parámetro especifica que la rutasrcestá en el host remoto, lo que permite a Ansible transferir archivos desde el host remoto a otra ubicación.
A través de esta tarea del playbook, el archivo /home/labex/file.txt ubicado en el host remoto se copiará a /tmp/file2.txt en el host remoto solo si no existe o si el archivo de origen ha cambiado.
A continuación, verifica si el archivo /tmp/file2.txt existe.
ll /tmp/file2.txt
Ejemplo de salida:
ls: cannot access '/tmp/file2.txt': No such file or directory
Luego, ejecuta el playbook utilizando el siguiente comando:
ansible-playbook copy-module-playbook.yaml
Ejemplo de salida:
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'
PLAY [localhost] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Idempotent copy] *********************************************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Finalmente, verifica que el archivo file2.txt se copie a la ruta de destino especificada en el host remoto solo si no existe o si el archivo de origen ha cambiado.
ll /tmp/file2.txt
Ejemplo de salida:
-rw-rw-r-- 1 labex labex 33 Mar 9 08:34 /tmp/file2.txt
En este punto, ejecuta el playbook nuevamente.
ansible-playbook copy-module-playbook.yaml
Ejemplo de salida:
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'
PLAY [localhost] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Idempotent copy] *********************************************************
ok: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Ten en cuenta que changed=1 se convierte en changed=0, lo que demuestra que este playbook de Ansible puede detectar que el archivo solo se copiará si no existe en el host remoto o si el archivo de origen ha sido modificado.
Resumen
¡Felicidades! Has completado con éxito el laboratorio del módulo Ansible Copy. Has aprendido cómo usar el módulo Copy para copiar archivos y directorios a hosts remotos, preservar atributos de archivos, manejar permisos y garantizar la idempotencia.
El módulo Copy es una herramienta poderosa para transferir archivos en tus tareas de automatización de Ansible. Proporciona varios parámetros para personalizar la operación de copia según tus requisitos.
Ahora que tienes una buena comprensión del módulo Copy, puedes aprovechar sus capacidades en tus playbooks de Ansible para gestionar de manera eficiente las transferencias y sincronización de archivos en toda tu infraestructura. ¡Que disfrutes copiando con Ansible!


