Transferencia Segura de Archivos: Uso de los Módulos Copy y Fetch de Ansible
Use comandos ad-hoc de Ansible copy y fetch para enviar archivos a nodos administrados y recuperar registros o configuraciones de vuelta a su nodo de control.
Transferencia Segura de Archivos: Uso de los Módulos Copy y Fetch de Ansible
Mover archivos es una de las primeras tareas prácticas de Ansible que necesita: enviar una configuración a sus servidores, recopilar un archivo de registro o hacer una copia de seguridad de un archivo remoto antes de un cambio. Los módulos copy y fetch manejan esas dos direcciones claramente.
Esta guía utiliza comandos ad-hoc, para que pueda ejecutar transferencias únicas sin escribir un playbook completo. Los mismos argumentos del módulo también funcionan en playbooks cuando desea que la tarea sea repetible.
Prerrequisitos
Antes de ejecutar los ejemplos a continuación, 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 (por ejemplo,
/etc/ansible/hosts) que defina sus nodos administrados. - Conectividad: Acceso SSH configurado con clave 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-host> -m <nombre-módulo> -a "clave=valor clave2=valor2 ..."
Para la transferencia de archivos, usamos los nombres de módulo -m copy o -m fetch, pasando los argumentos requeridos usando 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 administrados. Este es el método estándar para implementar 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 configuración:
| Argumento | Descripción | ¿Requerido? | Ejemplo de Valor |
|---|---|---|---|
src |
La ruta del archivo local en la máquina de control de Ansible. Las rutas absolutas son más claras para los comandos ad-hoc. | Sí | /tmp/config.conf |
dest |
La ruta donde se colocará el archivo en el nodo administrado remoto. | Sí | /etc/app/config.conf |
owner |
Nombre del usuario que debe ser propietario del archivo en el nodo remoto. | No | nginx |
group |
Nombre del grupo que debe ser propietario del archivo en el nodo remoto. | No | www-data |
mode |
Permisos (octales) a establecer en el archivo de destino. | No | 0644 |
backup |
Si es yes, crea un archivo de respaldo antes de sobrescribir el original. |
No | yes |
Ejemplo 1: Implementación 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/usuario/ansible/motd_banner
# Destino remoto: /etc/motd
ansible webservers -m copy -a "src=/home/usuario/ansible/motd_banner dest=/etc/motd"
Ejemplo 2: Configuración de Permisos y Propietario
Si está implementando un archivo de configuración seguro, debe especificar el propietario, el grupo y los permisos restringidos (por ejemplo, solo el propietario puede leer/escribir).
# Implementando 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 desde Nodos Remotos
El módulo fetch realiza la operación inversa de copy: recupera un archivo del nodo administrado 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 o recopilar información de diagnóstico.
Argumentos Clave para fetch
El módulo fetch requiere el archivo fuente en el nodo remoto y un directorio de destino en la máquina de control.
| Argumento | Descripción | ¿Requerido? | Ejemplo de Valor |
|---|---|---|---|
src |
La ruta absoluta al archivo en el nodo administrado 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>/<nombre-host>/<src>
Por ejemplo, recuperar /etc/nginx/nginx.conf de host1 a /tmp/backups resulta en:
/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 respaldo 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 seleccionó 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 Solo Archivo Sin Estructura de Host (flat=yes)
Si está absolutamente seguro de que solo está recuperando un archivo de un solo 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, nombrado después del archivo remoto original.
# Recuperar un informe de estado de salud local de un solo 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: Use
flat=yessolo cuando se dirija 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
Los pequeños errores en la transferencia de archivos pueden convertirse en incidentes de producción, especialmente cuando los archivos terminan en /etc o contienen secretos.
Siempre Establezca 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 sensibles (como claves SSH o credenciales de base de datos) podrían terminar con derechos de acceso demasiado permisivos.
# Mala Práctica (Modo derivado de umask)
- name: Implementar clave insegura
ansible.builtin.copy:
src: private.key
dest: /etc/app/private.key
# Buena Práctica (Restringir acceso explícitamente)
- name: Implementar clave segura
ansible.builtin.copy:
src: private.key
dest: /etc/app/private.key
mode: '0600'
owner: root
Use backup=yes para Cambios Críticos
Al usar copy para sobrescribir un archivo crítico existente (por ejemplo, /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 fácil.
Considere synchronize para Transferencias Grandes
Si bien copy y fetch funcionan bien para operaciones rápidas y archivos pequeños, use ansible.posix.synchronize para árboles de directorios grandes o transferencias delta eficientes. Envuelve rsync, por lo que el nodo de control y el entorno de destino necesitan el acceso rsync y SSH adecuados.
Conclusión
Use copy cuando el origen esté en su nodo de control y el destino esté en el nodo administrado. Use fetch cuando el origen esté en el nodo administrado y desee guardar el archivo localmente.
| Módulo | Dirección | Ejemplo de Comando Ad-Hoc |
|---|---|---|
copy |
Nodo de Control -> Nodo Administrado | ansible all -m copy -a "src=/local/file dest=/remote/path mode=0644" |
fetch |
Nodo Administrado -> Nodo de Control | ansible all -m fetch -a "src=/remote/file dest=/local/dir" |
Para un solo servidor, flat=yes puede hacer que los archivos recuperados sean más fáciles de leer. Para un grupo de servidores, mantenga la estructura de directorios predeterminada basada en el host para que el registro de un host no sobrescriba el de otro.