Transferencia segura de archivos: uso de los módulos Copy y Fetch de Ansible
Ansible es reconocido por sus capacidades de gestión de configuración, pero mover archivos de manera efectiva entre la máquina de control y los nodos gestionados es un requisito fundamental para cualquier estrategia de despliegue. Ya sea que necesite desplegar un archivo de configuración personalizado, enviar un artefacto de despliegue o recuperar registros del sistema (logs), el proceso debe ser rápido, fiable y seguro.
Este artículo se centra en los dos módulos principales para la transferencia de archivos: copy y fetch. Demostraremos cómo aprovechar estos módulos utilizando la potente estructura de comando ad-hoc de Ansible, lo que permite operaciones de archivo rápidas y únicas sin necesidad de escribir un playbook completo. Al final de esta guía, será competente en la transferencia segura (push) de archivos locales a sistemas remotos y en la recuperación (pull) de archivos necesarios a su nodo de control de Ansible.
Requisitos previos
Antes de ejecutar los siguientes ejemplos, asegúrese de tener lo siguiente:
- Nodo de control de Ansible: Una máquina con Ansible instalado.
- Archivo de inventario: Un archivo de inventario operativo (p. ej.,
/etc/ansible/hosts) que defina sus nodos gestionados. - Conectividad: Acceso mediante clave SSH configurado a sus hosts remotos.
Todos los ejemplos asumirán que el grupo de destino se llama webservers en el inventario.
Comprensión de los comandos Ad-Hoc para la transferencia de archivos
Los comandos ad-hoc son comandos de una sola línea ejecutados directamente desde la terminal, ideales para tareas rápidas que no justifican un playbook permanente. La estructura básica es:
ansible <grupo-de-hosts> -m <nombre-del-módulo> -a "clave=valor clave2=valor2 ..."
Para la transferencia de archivos, utilizamos los nombres de módulo -m copy o -m fetch, pasando los argumentos requeridos mediante la bandera -a.
El módulo copy: envío de archivos a nodos remotos
El módulo copy se utiliza para transferir un archivo ubicado en la máquina de control de Ansible a uno o más nodos gestionados. Este es el método estándar para desplegar archivos de configuración, scripts o activos pequeños.
Argumentos clave para copy
El módulo copy requiere dos argumentos esenciales y acepta varios argumentos opcionales para la gestión de la configuración:
| Argumento | Descripción | ¿Requerido? | Valor de ejemplo |
|---|---|---|---|
src |
La ruta absoluta al archivo en la máquina de control de Ansible. | Sí | /tmp/config.conf |
dest |
La ruta absoluta donde se colocará el archivo en el nodo gestionado remoto. | Sí | /etc/app/config.conf |
owner |
Nombre del usuario que debe ser el propietario del archivo en el nodo remoto. | No | nginx |
group |
Nombre del grupo que debe ser el propietario del archivo en el nodo remoto. | No | www-data |
mode |
Permisos (octal) a establecer en el archivo de destino. | No | 0644 |
backup |
Si es yes, crea un archivo de copia de seguridad antes de sobrescribir el original. |
No | yes |
Ejemplo 1: Despliegue simple de archivos
Suponga que tiene un archivo personalizado de Mensaje del Día (motd) localmente y desea enviarlo a todos los servidores web.
# Ruta del archivo local: /home/user/ansible/motd_banner
# Destino remoto: /etc/motd
ansible webservers -m copy -a "src=/home/user/ansible/motd_banner dest=/etc/motd"
Ejemplo 2: Configuración de permisos y propiedad
Si está desplegando un archivo de configuración seguro, debe especificar el propietario, el grupo y los permisos restringidos (por ejemplo, solo el propietario puede leer/escribir).
# Desplegando un archivo de configuración de aplicación, propiedad de 'app_user', grupo 'devops',
# con permisos de lectura/escritura solo para el propietario (0600).
ansible webservers -m copy -b -a "src=/tmp/app_settings.yaml dest=/etc/app/settings.yaml owner=app_user group=devops mode=0600"
Nota sobre
-b: La bandera-b(o--become) es necesaria cuando el destino remoto requiere permisos elevados (como escribir en/etc).
El módulo fetch: recuperación de archivos de nodos remotos
El módulo fetch realiza la operación inversa a copy: recupera un archivo del nodo gestionado de vuelta a la máquina de control de Ansible. Esto es útil para hacer copias de seguridad de archivos de configuración, recuperar registros (logs) o recopilar información de diagnóstico.
Argumentos clave para fetch
El módulo fetch requiere el archivo de origen en el nodo remoto y un directorio de destino en la máquina de control.
| Argumento | Descripción | ¿Requerido? | Valor de ejemplo |
|---|---|---|---|
src |
La ruta absoluta al archivo en el nodo gestionado remoto. | Sí | /var/log/nginx/error.log |
dest |
La ruta absoluta al directorio en la máquina de control donde se guardarán los archivos. | Sí | /tmp/backups/logs |
flat |
Si es yes, el nombre de archivo resultante no contendrá la estructura del nombre de host (no recomendado al recuperar de múltiples hosts). |
No | no (predeterminado) |
Diferencia crítica: estructura de destino
A diferencia del módulo copy, el módulo fetch crea automáticamente una ruta de subdirectorio estructurada basada en el nombre de host remoto para evitar colisiones de nombres de archivo al recuperar archivos de múltiples servidores.
La ruta resultante en la máquina de control se verá así:
<dest>/<hostname>/<src>
Por ejemplo, al recuperar /etc/nginx/nginx.conf de host1 a /tmp/backups, el resultado es:
/tmp/backups/host1/etc/nginx/nginx.conf
Ejemplo 3: Recuperación de copias de seguridad de configuración remota
Para recuperar el archivo de configuración en ejecución de todos los servidores web a un directorio de copia de seguridad local:
# Recuperar nginx.conf de todos los servidores web al directorio local /tmp/config_backups
ansible webservers -m fetch -a "src=/etc/nginx/nginx.conf dest=/tmp/config_backups"
Después de ejecutar este comando, si su objetivo fueran webserver1 y webserver2, la estructura de su directorio local sería:
/tmp/config_backups/
├── webserver1
│ └── etc
│ └── nginx
│ └── nginx.conf
└── webserver2
└── etc
└── nginx
└── nginx.conf
Ejemplo 4: Recuperación de un único archivo sin estructura de host (flat=yes)
Si está absolutamente seguro de que solo está recuperando un archivo de un único host, o si solo necesita el contenido del archivo (no la estructura de origen), puede usar flat=yes. Esto da como resultado que el archivo se coloque directamente en la carpeta de destino, con el nombre del archivo remoto original.
# Recuperar un informe de estado de salud local de un único host, guardándolo directamente.
ansible webserver1 -m fetch -a "src=/tmp/health_status.txt dest=/tmp/reports flat=yes"
# Ruta resultante: /tmp/reports/health_status.txt
Advertencia: Solo use
flat=yescuando apunte a un solo host o si tiene la intención de sobrescribir el archivo en ejecuciones posteriores, ya que Ansible no evitará conflictos.
Mejores prácticas y consideraciones de seguridad
Al administrar archivos utilizando Ansible, la seguridad y la idempotencia son primordiales:
1. Establezca siempre los permisos con copy
Nunca envíe un archivo de configuración sin definir explícitamente el mode y el owner. Si confía en el umask predeterminado del sistema remoto, los archivos confidenciales (como claves SSH o credenciales de bases de datos) podrían terminar con derechos de acceso excesivamente permisivos.
# Mala práctica (Modo derivado de umask)
- name: Desplegar clave insegura
ansible.builtin.copy:
src: private.key
dest: /etc/app/private.key
# Buena práctica (Restringir el acceso explícitamente)
- name: Desplegar clave segura
ansible.builtin.copy:
src: private.key
dest: /etc/app/private.key
mode: '0600'
owner: root
2. Use backup=yes para cambios críticos
Al usar copy para sobrescribir un archivo crítico existente (p. ej., /etc/sudoers), incluya backup=yes. Ansible creará una copia de seguridad con marca de tiempo en el nodo remoto antes de sobrescribir el archivo, proporcionando una opción de reversión sencilla.
3. Considere el módulo synchronize para transferencias grandes
Si bien copy y fetch son excelentes para operaciones ad-hoc rápidas y archivos de configuración pequeños, si necesita transferir estructuras de directorios grandes o necesita transferencias delta eficientes (solo transferir cambios), el módulo synchronize (que utiliza rsync) es la herramienta recomendada para un rendimiento y una gestión superiores.
Resumen
Los módulos copy y fetch son herramientas indispensables en el conjunto de utilidades del administrador de Ansible, ya que brindan métodos robustos y seguros para manipular archivos en toda una infraestructura. Al dominar la sintaxis de comandos ad-hoc y comprender los argumentos clave, puede gestionar eficientemente los artefactos de despliegue y realizar las operaciones necesarias de recuperación de datos sin la sobrecarga de crear playbooks completos para tareas sencillas.
| Módulo | Dirección | Ejemplo de comando Ad-Hoc |
|---|---|---|
copy |
Nodo de control -> Nodo gestionado | ansible all -m copy -a "src=/local/file dest=/remote/path mode=0644" |
fetch |
Nodo gestionado -> Nodo de control | ansible all -m fetch -a "src=/remote/file dest=/local/dir" |