Módulo Ansible Copy

AnsibleBeginner
Practicar Ahora

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.

Este es un Guided Lab, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 99%. Ha recibido una tasa de reseñas positivas del 96% por parte de los estudiantes.

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ódulo copy de 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 ruta src está 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!