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