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.