====== 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