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:

  1. Nodo de Control de Ansible: Una máquina con Ansible instalado.
  2. Archivo de Inventario: Un archivo de inventario operativo (por ejemplo, /etc/ansible/hosts) que defina sus nodos administrados.
  3. 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. /tmp/config.conf
dest La ruta donde se colocará el archivo en el nodo administrado remoto. /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. /var/log/nginx/error.log
dest La ruta absoluta al directorio en la máquina de control donde se guardarán los archivos. /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=yes solo 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.