Sincronización en Ubuntu con SSH, Rsync y crontab

Introducción

Siguiendo los tutoriales de Administración de servidores veamos ahora cómo lograr una sincronización en Ubuntu con SSH, Rsync y crontab.

¿Qué es cada cosa?

  • SSH es para controlar un servidor remoto. Es como un telnet pero seguro y cool. No olvides leer: configurar claves para autenticación SSH, pues hará falta
  • Rsync sincroniza directorios y archivos, ya sea en la misma computadora o de una computadora a otra (justo lo que haremos)
  • crontab ejecuta tareas específicas cada determinado tiempo.

¿Qué haremos?

Mantener una copia exacta de una carpeta en 2 servidores. Cualquier cambio que hagamos en el de la fuente de la verdad se verá reflejado en el cliente. Un cambio es cuando agregamos, editamos o eliminamos un fichero o directorio.

Para esto ejecutaremos rsync cada determinado tiempo con crontab. Y SSH se utiliza para poder entrar al servidor remoto sin necesidad de alguna contraseña.

Términos

Host servidor o fuente de la verdad es el directorio en donde se alojará el directorio que copiaremos más tarde al host cliente.

Paso 1: crear directorio

Primero vamos a crear un directorio en el host servidor. Y vamos a llenarlo con archivos falsos o como se le diga.

Creamos el directorio…

mkdir cosas_importantes

Accedemos a él…

cd cosas_importantes

Y dentro de él creamos 3 archivos con touch:

touch archivo1.txt archivo2.txt archivo3.txt

Podríamos igualmente hacerlo con touch archivo{1..3}.txt pero eso es otra historia.

Así se debe ver nuestro directorio:

Directorio que vamos a sincronizar con rsync
Directorio que vamos a sincronizar con rsync

Dejemos a la fuente de la verdad ahí como está, y ahora vamos al host cliente.

Paso 2: probar comando rsync para sincronizar

Pequeña nota: en las capturas se ejecuta rsync sin la opción v, pero hay que ponerla así como se ve en los comandos, no en la captura. Ya que cuando las tomé olvidé dicha opción. Igualmente esto no afecta a nada, pero servirá para el log.

En el host cliente creamos un directorio en donde vamos a soltar todo el contenido de la fuente de la verdad. Yo lo llamaré “sincronizado”…

mkdir sincronizado

No vamos a meternos al directorio, sólo vamos a crearlo y quedarnos fuera de él.

Y aquí viene la magia. Ejecutaremos rsync para “descargar” la carpeta. La primera vez la descargará completa, pero después sólo va a sincronizar los cambios; de ahí proviene la magia.

rsync -azv --delete luis@192.168.1.88:/home/luis/cosas_importantes/ /home/luis_fake/sincronizado/

Vamos paso por paso.

  • La opción a es para sincronizar directorios recursivamente y mantener sus permisos, dueños y todas esas cosas.
  • Luego, la opción z es para comprimir los archivos durante la transferencia. Esto funciona en la vida real cuando transferimos archivos grandes por largas redes.
  • Como tercera  opción tenemos a v es para que sea verboso, algo así como que te diga qué está haciendo; los mensajes que genere servirán para depurar.
  • Y la opción –delete es para que los archivos sean eliminados en la copia en caso de que sean eliminados en la fuente de la verdad.
  • Luego tenemos a luis@192.168.1.88 que son un usuario e IP que ya configuramos anteriormente con SSH.
  • Más tarde indicamos el directorio que vamos a copiar, el cuál está en el host remoto en /home/luis/cosas_importantes/. Es importante dejar la / al final del nombre
  • Y finalmente indicamos en dónde guardaremos o descargaremos el contenido. En este caso será en la carpeta que creamos, cuya ruta es /home/luis_fake/sincronizado/ (recuerda que ya estamos en el host cliente).

Lo ejecutamos y si ahora imprimimos el contenido del directorio:

Probando rsync para descargar directorio recursivamente
Probando rsync para descargar directorio recursivamente

Magia pura. Ya tenemos nuestros tres archivos que creamos. Si ahora vamos a la fuente de la verdad y creamos otro archivo…

touch otro_archivo.txt

Y luego en el host cliente ejecutamos el mismo comando para sincronizar (presionamos la flecha de arriba hasta encontrarlo para volver a ejecutarlo, no es necesario escribirlo 2 veces)…

rsync -azv --delete luis@192.168.1.88:/home/luis/cosas_importantes/ /home/luis_fake/sincronizado/

Ahora volvemos a imprimir el contenido del directorio con ls -la:

ls sincronizado/

Veamos la imagen:

Ver directorio que ha sido copiado de la fuente de la verdad
Ver directorio que ha sido copiado de la fuente de la verdad

La magia sigue. Y ahí seguirá, también lo hará cuando cambiemos el contenido de un archivo o eliminemos al mismo; eso no nos importa ahora.

Pero… ¿no es un poco aburrido estar ejecutando el comando manualmente? aquí viene crontab al rescate.

Paso 3: script para sincronizar

Con cron simplemente llamamos a un script. Primero tenemos que crearlo, y ya más tarde lo llamamos. No voy a entrar en detalles, el script queda así:

#!/bin/bash
# Sincronizar dos directorios con rsync
# @see https://parzibyte.me/blog
# @date 2018-08-21

# Algunas variables para cambiar rápidamente ;)

#Remoto
USUARIO_REMOTO="luis"
IP_HOST_REMOTO="192.168.1.88"
DIRECTORIO_REMOTO="cosas_importantes"
RUTA_COMPLETA_DIRECTORIO_REMOTO="/home/$USUARIO_REMOTO/$DIRECTORIO_REMOTO/"

#Local
USUARIO_LOCAL="luis_fake"
DIRECTORIO_LOCAL="sincronizado"
RUTA_COMPLETA_DIRECTORIO_LOCAL="/home/$USUARIO_LOCAL/$DIRECTORIO_LOCAL/"

FECHA_Y_HORA=`date "+%d-%m-%y_%H-%M-%S"`

# Un log, porque la vida sin logs no es nada
RUTA_LOG="/home/$USUARIO_LOCAL/rsync.txt"
#Ya sé que va con acento en la o pero no importa ahora
echo "[$FECHA_Y_HORA]Comenzando sincronizacion..." >> $RUTA_LOG
rsync -azv --delete $USUARIO_REMOTO@$IP_HOST_REMOTO:$RUTA_COMPLETA_DIRECTORIO_REMOTO $RUTA_COMPLETA_DIRECTORIO_LOCAL >> $RUTA_LOG

Como lo dije, no lo explicaré porque espero que se explique por sí mismo. Lo copiamos (a mano, o como queramos, eso depende de nosotros) a nuestro servidor, y lo guardamos.

En mi caso lo llamaré “sincronizar.sh”. Debemos darle permisos de ejecución (tutorial aquí) así que…

sudo chmod +x sincronizar.sh

Y lo ejecutamos con…

./sincronizar.sh

Si lo hacemos bien (obviamente cambiando las variables como la IP y esas cosas) entonces no se mostrará nada pero habrá registros en el log:

Ejecución de script para sincronizar con rsync y ssh
Ejecución de script para sincronizar con rsync y ssh

Como vemos, indica la fecha y hora. Pero aparte de ello, nos dice cuáles archivos cambiaron y todas esas cosas.

Lo ejecutamos primero aquí para evitar errores, ya que si se ejecuta con cron no debería haber problemas.

En cambio, si lo hubiésemos puesto en cron sin probar, y hubiera un error, no sabríamos de quién es la culpa.

Paso 4: crontab

Ahora sí para terminar vamos a editar el crontab. En mi caso pondré que mi script se ejecute cada minuto (un poco pesado pero de todos modos no es para la vida real).

Abrimos el archivo con…

crontab -e

Si nos pregunta, seleccionamos la opción que tenga a nano (o si sabemos usar los otros editores podemos hacerlo)

Y dentro de él ponemos o agregamos lo siguiente:

Ejemplo de crontab para ejecutar el script creado previamente
Ejemplo de crontab para ejecutar el script creado previamente

 

Recordemos que es minuto, hora, día, mes, día de semana. Yo quiero que el script que está en /home/luis_fake/sincronizar.sh se ejecute en todos los minutos en todas las horas, días, meses y días de semana, por eso queda así:

* * * * * /home/luis_fake/sincronizar.sh

Paso 5: revisar log

Efectivamente se está ejecutando el script cada minuto. Probé creando un archivo llamado pruebas en la fuente de la verdad, y no tuve que ejecutar el comando, sólo esperé un poco. He aquí una parte del log:

Revisar log
Revisar log

Vemos que en el número 1 se ejecutó a las 05 con 50 y sincronizó el archivo prueba.txt como se ve en el número 2.

En el número 3 se volvió ejecutar a las 05 con 51 (cada minuto) y no sincronizó nada, pues no había cambios, pero sí se está ejecutando.

Y así es como podemos sincronizar un directorio con todo su contenido utilizando SSH, rsync y cron. Espero que haya servido.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

2 comentarios en “Sincronización en Ubuntu con SSH, Rsync y crontab”

Dejar un comentario