Sincronizar carpetas entre servidores Linux (SSH)
Hoy ha surgido un temilla que requería sincronizar unas carpetas entre 2 servidores Linux, de forma automática cada hora, y como de costumbre, y para que no se me olvide, apunto por aquí los pasos.
Otra parte importante de este asunto es que quiero que la comunicación sea mediante ssh, para evitar miradas curiosas 🙂
Para sincronizar/copiar las carpetas vamos a utilizar rsync.
Para empezar necesitamos tener instalado rsync en nuestro servidor. Si no lo tenemos, lo podemos instalar fácilmente mediante:
# apt-get install rsync (# yum install rsync) dependiendo de la distro linux que tengamos.
Lo siguiente que vamos a hacer es configurar nuestros servidores para que se comuniquen mediante ssh y no nos pida contraseña, ya que quiero que el comando se ejecute automáticamente.
Creamos las claves privada/pública en el servidor2.
# ssh-keygen -tdsa
Copiamos la clave pública al servidor1
# cd /root/.ssh/
# cat id_dsa.pub | ssh root@servidor1 «cat >> /root/.ssh/authorized_keys»
Probamos que accedemos por ssh y no nos pide contraseña.
# ssh root@servidor1
Si todo es correcto hasta aquí, podemos pasar al siguiente paso, que es ejecutar realmente el rsync.
De las muchas opciones que tiene el comando rsync me voy a quedar con 4 que son suficientes para lo que quiero copiar. Estas opciones son:
- -a para copiar directorios de forma recursiva, manteniendo privilegios, fecha de creación, permisos, etc.
- -v para tener un mayor nivel de detalle de la sincronización.
- -z para comprimir los datos y poder realizar una transferencia mas rápida.
- -e ssh para ssh para copiar los archivos de un servidor a otro mediante una conexión ssh.
El comando lo ejecutaremos desde servidor2 y quedará de la siguiente manera:
# rsync -e ssh -avz root@servidor1:/ruta/carpeta/origen/ /ruta/carpeta/destino/
Si todo ha ido correctamente tendremos en la carpeta /ruta/carpeta/destino/ de servidor2 una réplica de la carpeta /ruta/carpeta/origen/ de servidor1.
Para finalizar, programaremos una tarea con cron para ejecutar el comando cada hora.
Ejecutamos
# crontab -e
y añadimos la linea
0 * * * * rsync -e ssh -avz root@servidor1:/ruta/carpeta/origen/ /ruta/carpeta/destino/ 2>&1 > /var/log/rsync-copia.log
Con esto, se ejecutará la tarea cada hora y nos dejará un log en /var/log/rsync-copia.log
Una página de las que he usado de referencia es:
http://www.esdebian.org/wiki/rsync-ssh-transporte-autenticacion-mediante-claves-sin-frase
Espero que os resulte de utilidad.
Hola Parece haber un error en esta linea
# cat id_dsa.pub | ssh root@servidor1 “cat – >> /root/.ssh/authorized_keys”
el cat – >> ( es sin el guion). cat >>
Gracias por tu aporte !! estuvo muy bueno.!
Hola Moises, muchas gracias por el comentario.
Tenías razón y ya he corregido la línea. Supongo que fue un error al escribir y no lo vi 😉
Saludos.