Table of Contents
Migración de proyecto Ansible entre servidores Debian con rsync
Contexto
Este procedimiento documenta la migración de un proyecto Ansible desde un servidor existente hacia un servidor nuevo en Debian, manteniendo integridad de inventarios, playbooks y estructura del proyecto.
Escenario típico:
- Servidor origen con Ansible instalado bajo /root/ansible
- Servidor destino con Ansible bajo /server/ansible
- Acceso SSH disponible con un usuario no-root
- Acceso a root local mediante su -, pero root por SSH deshabilitado (por seguridad)
Infraestructura
| Rol | Host |
|---|---|
| Servidor origen | 10.28.64.28 |
| Servidor destino | 3av-iac |
| Sistema operativo | Debian |
| Usuario SSH | user |
| Proyecto | Ansible |
Requisito de software
El programa rsync debe estar instalado en ambos servidores:
- servidor origen (envía datos)
- servidor destino (recibe datos)
Si rsync no está instalado en alguno de los dos, la transferencia fallará.
Verificación de rsync
Ejecutar en ambos servidores:
rsync --version
Salida esperada:
rsync version 3.x.x
Instalación de rsync (si no está presente)
En Debian / Ubuntu
Ejecutar como root o con sudo:
apt update apt install rsync -y
Verificar nuevamente:
rsync --version
Problema encontrado
Al intentar ejecutar rsync directamente como root vía SSH:
rsync -avz root@10.28.64.28:/root/ansible/inventory/ /server/ansible/inventory/
Se obtiene:
- Permission denied
- Authentication failed
- root login por SSH bloqueado
Causa raíz
- root login por SSH está deshabilitado (PermitRootLogin no)
- sudo requiere TTY para leer la contraseña
- el uso de ssh -tt introduce salida adicional que rompe el protocolo rsync
- rsync necesita una shell “clean” (sin banners, echoes, motd)
Solución aplicada (recomendada)
Ejecutar rsync como usuario normal vía SSH y elevar privilegios en el servidor remoto usando sudo, sin forzar TTY.
Comando funcional validado
rsync -avz --progress \ --rsync-path="sudo rsync" \ user@10.28.64.28:/root/ansible/inventory/ \ /server/ansible/inventory/
Resultado:
- Transferencia exitosa
- Inventarios copiados correctamente
- Sin errores de protocolo
Archivos migrados
Ejemplo de salida esperada:
hosts_north hosts_north_1 hosts_south hosts_south_1
Verificación post-migración
En el servidor destino:
ls -lah /server/ansible/inventory/
Migrar TODO el proyecto Ansible
Para copiar el proyecto completo (inventory, playbooks, roles, backups, etc.):
rsync -avz --progress \ --rsync-path="sudo rsync" \ user@10.28.64.28:/root/ansible/ \ /server/ansible/
Clonado exacto (modo espejo)
ATENCIÓN: elimina en destino lo que no exista en origen.
rsync -avz --progress --delete \ --rsync-path="sudo rsync" \ user@10.28.64.28:/root/ansible/ \ /server/ansible/
Errores comunes y explicación
sudo: a terminal is required
Causa:
- sudo espera una TTY para leer la contraseña
Solución:
- evitar ssh -tt
- permitir NOPASSWD para rsync
protocol version mismatch
Causa:
- salida adicional en la shell (banner, echo, motd, sudo prompt)
- uso de ssh -tt rompe el protocolo rsync
Solución:
- usar shell no-interactiva
- mantener entorno limpio
Mejora recomendada (automatización)
Permitir que el usuario ejecute rsync como root sin password.
En el servidor origen:
visudo
Agregar al final:
user ALL=(root) NOPASSWD: /usr/bin/rsync
Buenas prácticas
- rsync debe existir en ambos extremos
- No habilitar root por SSH salvo casos excepcionales
- Usar sudo controlado por comando
- Evitar banners en .bashrc para usuarios técnicos
- Probar siempre con –dry-run antes de –delete
Referencias
- man rsync
- man sudo
- man ssh
- Debian Security Hardening Guide
Estado
✔ Procedimiento validado en producción ✔ rsync verificado en ambos servidores ✔ Inventarios y proyecto Ansible migrados correctamente ✔ Documento base para futuras migraciones
