Siguiendo los tutoriales de Administración de servidores veamos ahora cómo lograr una sincronización en Ubuntu con SSH, Rsync y crontab.
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.
Host servidor o fuente de la verdad es el directorio en donde se alojará el directorio que copiaremos más tarde al host cliente.
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:
Dejemos a la fuente de la verdad ahí como está, y ahora vamos al host cliente.
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.
Lo ejecutamos y si ahora imprimimos el contenido del directorio:
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:
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.
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:
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.
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:
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
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:
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.
En este post te quiero compartir mi experiencia tramitando un acta de nacimiento de México…
Hoy te voy a presentar un creador de credenciales que acabo de programar y que…
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
Esta web usa cookies.
Ver comentarios
Saludos, muy buen tutorial, pero que paso con la contraseña del usuario remoto para comenzar la sincronizacion?
Se usa SSH con claves públicas y privadas para la autentificación