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:
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:
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.
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:
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:
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:
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.
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