Cómo sincronizar directorios usando Lsyncd en Ubuntu 20.04

Cómo sincronizar directorios usando Lsyncd en Ubuntu 20.04

Lsyncd es una herramienta simple y liviana que le permite duplicar su directorio local en otro directorio en el servidor remoto. Funciona al monitorear continuamente el directorio especificado en busca de cambios cada pocos segundos y, si se realizan cambios, se sincronizan con el servidor remoto. Esta herramienta es muy √ļtil para sincronizar los datos de un √°rea segura a un √°rea no segura.

En este tutorial, le mostraremos cómo instalar y usar Lsyncd para sincronizar directorios locales y directorios remotos.

requisitos previos

  • Un servidor con Ubuntu 20.04.
  • Una contrase√Īa de root est√° configurada en su servidor.

Empezando

Antes de comenzar, es una buena idea actualizar el paquete de su sistema a la √ļltima versi√≥n. Puede actualizarlos usando el siguiente comando:

apt-get update -y
apt-get upgrade -y

Una vez que todos los paquetes estén actualizados, reinicie su sistema para aplicar los cambios.

Instalar Lsyncd

De forma predeterminada, el paquete Lsyncd está disponible en la mayoría de los sistemas operativos Linux. Puede instalarlo simplemente ejecutando el siguiente comando:

apt-get install lsyncd -y

Una vez que Lsyncd está instalado, puede verificar la versión instalada de Lsyncd con el siguiente comando:

lsyncd --version

Deberías obtener el siguiente resultado:

Version: 2.2.3

Configurar Lsyncd para sincronizar directorios locales

En esta sección, configuraremos Lsyncd para sincronizar el directorio /etc/ con el directorio /mnt/ en el sistema local.

Primero, cree un directorio para Lsyncd con el siguiente comando:

mkdir /etc/lsyncd

A continuación, cree un nuevo archivo de configuración Lsyncd y defina el directorio de origen y destino que desea sincronizar.

nano /etc/lsyncd/lsyncd.conf.lua

Agregue las siguientes líneas:

settings {
        logfile = "/var/log/lsyncd/lsyncd.log",
        statusFile = "/var/log/lsyncd/lsyncd.status",
   statusInterval = 20,
   nodaemon   = false
}

sync {
        default.rsync,
        source = "/etc/",
        target = "/mnt"
}

Guarde y cierre el archivo cuando haya terminado.

systemctl start lsyncd
systemctl enable lsyncd

También puede verificar el estado del servicio Lsyncd con el siguiente comando:

systemctl status lsyncd

Debería ver el siguiente resultado:

? lsyncd.service - LSB: lsyncd daemon init script
     Loaded: loaded (/etc/init.d/lsyncd; generated)
     Active: active (running) since Fri 2020-05-01 03:31:20 UTC; 9s ago
       Docs: man:systemd-sysv-generator(8)
    Process: 36946 ExecStart=/etc/init.d/lsyncd start (code=exited, status=0/SUCCESS)
      Tasks: 2 (limit: 4620)
     Memory: 12.5M
     CGroup: /system.slice/lsyncd.service
             ??36921 /usr/bin/lsyncd -pidfile /var/run/lsyncd.pid /etc/lsyncd/lsyncd.conf.lua
             ??36952 /usr/bin/lsyncd -pidfile /var/run/lsyncd.pid /etc/lsyncd/lsyncd.conf.lua

May 01 03:31:20 ubuntu20 systemd[1]: lsyncd.service: Succeeded.
May 01 03:31:20 ubuntu20 systemd[1]: Stopped LSB: lsyncd daemon init script.
May 01 03:31:20 ubuntu20 systemd[1]: Starting LSB: lsyncd daemon init script...
May 01 03:31:20 ubuntu20 lsyncd[36946]:  * Starting synchronization daemon lsyncd
May 01 03:31:20 ubuntu20 lsyncd[36951]: 03:31:20 Normal: --- Startup, daemonizing ---
May 01 03:31:20 ubuntu20 lsyncd[36946]:    ...done.
May 01 03:31:20 ubuntu20 systemd[1]: Started LSB: lsyncd daemon init script.

Puede consultar el archivo de registro de Lsyncd para obtener más detalles, como se muestra a continuación:

tail -f /var/log/lsyncd/lsyncd.log

Debería ver el siguiente resultado:

/lsyncd/lsyncd.conf.lua
Fri May  1 03:30:57 2020 Normal: Finished a list after exitcode: 0
Fri May  1 03:31:20 2020 Normal: --- Startup, daemonizing ---
Fri May  1 03:31:20 2020 Normal: recursive startup rsync: /etc/ -> /mnt/
Fri May  1 03:31:20 2020 Normal: Startup of /etc/ -> /mnt/ finished.

También puede verificar el estado de sincronización con el siguiente comando:

tail -f /var/log/lsyncd/lsyncd.status

Debería poder ver los cambios en el directorio /mnt con el siguiente comando:

ls /mnt/

Debería ver que todos los archivos y directorios del directorio /etc se agregan al directorio /mnt:

acpi                    dconf           hosts            logrotate.conf       newt                     rc2.d          subuid-
adduser.conf            debconf.conf    hosts.allow      logrotate.d          nginx                    rc3.d          sudoers
alternatives            debian_version  hosts.deny       lsb-release          nsswitch.conf            rc4.d          sudoers.d
apache2                 default         init             lsyncd               ntp.conf                 rc5.d          sysctl.conf
apparmor                deluser.conf    init.d           ltrace.conf          openal                   rc6.d          sysctl.d
apparmor.d              depmod.d        initramfs-tools  lvm                  opt                      rcS.d          systemd
apport                  dhcp            inputrc          machine-id           os-release               resolv.conf    terminfo
apt                     dnsmasq.d       insserv.conf.d   magic                overlayroot.conf         rmt            timezone
at.deny                 docker          iproute2         magic.mime           PackageKit               rpc            tmpfiles.d
bash.bashrc             dpkg            iscsi            mailcap              pam.conf                 rsyslog.conf   ubuntu-advantage
bash_completion         e2scrub.conf    issue            mailcap.order        pam.d                    rsyslog.d      ucf.conf
bash_completion.d       environment     issue.net        manpath.config       passwd                   screenrc       udev
bindresvport.blacklist  ethertypes      kernel           mdadm                passwd-                  securetty      ufw
binfmt.d                fonts           kernel-img.conf  mime.types           perl                     security       update-manager
byobu                   fstab           landscape        mke2fs.conf          php                      selinux        update-motd.d
ca-certificates         fuse.conf       ldap             modprobe.d           pki                      sensors3.conf  update-notifier
ca-certificates.conf    fwupd           ld.so.cache      modules              pm                       sensors.d      vdpau_wrapper.cfg
calendar                gai.conf        ld.so.conf       modules-load.d       polkit-1                 services       vim
console-setup           groff           ld.so.conf.d     mtab                 pollinate                shadow         vmware-tools
cron.d                  group           legal            multipath            popularity-contest.conf  shadow-        vtrgb
cron.daily              group-          letsencrypt      multipath.conf       profile                  shells         vulkan
cron.hourly             grub.d          libaudit.conf    mysql                profile.d                skel           wgetrc
cron.monthly            gshadow         libnl-3          nanorc               protocols                sos.conf       X11
crontab                 gshadow-        locale.alias     netplan              pulse                    ssh            xattr.conf
cron.weekly             gss             locale.gen       network              python3                  ssl            xdg
cryptsetup-initramfs    hdparm.conf     localtime        networkd-dispatcher  python3.8                subgid         zsh_command_not_found
crypttab                host.conf       logcheck         NetworkManager       rc0.d                    subgid-
dbus-1                  hostname        login.defs       networks             rc1.d                    subuid

Configurar Lsyncd para sincronizar directorios remotos

En esta sección, configuraremos Lsyncd para sincronizar el directorio /etc/ en el sistema local con el directorio /opt/ en el sistema remoto.

Antes de comenzar, deber√° configurar la autenticaci√≥n basada en clave SSH entre el sistema local y el servidor remoto para que el sistema local pueda conectarse al servidor remoto sin contrase√Īa.

En el sistema local, ejecute el siguiente comando para generar una clave p√ļblica y privada:

ssh-keygen -t rsa

Debería ver el siguiente resultado:

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:c7fhjjhAamFjlk6OkKPhsphMnTZQFutWbr5FnQKSJjE [email protected]
The key's randomart image is:
+---[RSA 3072]----+
| E ..            |
|  ooo            |
| oo= +           |
|=.+ % o . .      |
|[email protected] oSo. o    |
|ooo=B o .o o o   |
|=o.... o    o    |
|+.    o .. o     |
|     .  ... .    |
+----[SHA256]-----+

El comando anterior generar√° una clave privada y p√ļblica dentro del directorio ~/.ssh.

A continuaci√≥n, deber√° copiar la clave p√ļblica en el servidor remoto. Puedes copiarlo con el siguiente comando:Publicidad

ssh-copy-id [email protected]

Se le pedir√° que proporcione la contrase√Īa del usuario root remoto como se muestra a continuaci√≥n:

[email protected]'s password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.

Una vez que el usuario est√© autenticado, la clave p√ļblica se agregar√° al archivo de claves_autorizadas del usuario remoto y se cerrar√° la conexi√≥n.

Ahora, deber√≠a poder iniciar sesi√≥n en el servidor remoto sin ingresar la contrase√Īa.

Para probarlo, intente iniciar sesión en su servidor remoto a través de SSH:

ssh [email protected]

Si todo salió bien, iniciará sesión de inmediato.

A continuación, deberá editar el archivo de configuración de Lsyncd y definir las variables rsyncssh y host de destino:

nano /etc/lsyncd/lsyncd.conf.lua

Cambie el archivo como se muestra a continuación:

settings {
        logfile = "/var/log/lsyncd/lsyncd.log",
        statusFile = "/var/log/lsyncd/lsyncd.status",
   statusInterval = 20,
   nodaemon   = false
}

sync {
        default.rsyncssh,
        source = "/etc/",
	host = "remote-server-ip",
        targetdir = "/opt"
}

Guarde y cierre el archivo cuando haya terminado. Luego, reinicie el servicio Lsyncd para iniciar la sincronización.

systemctl restart lsyncd

Puede verificar el estado de sincronización con el siguiente comando:

tail -f /var/log/lsyncd/lsyncd.log

Debería ver el siguiente resultado:

Fri May  1 04:32:05 2020 Normal: --- Startup, daemonizing ---
Fri May  1 04:32:05 2020 Normal: recursive startup rsync: /etc/ -> 45.58.38.21:/opt/
Fri May  1 04:32:06 2020 Normal: Startup of "/etc/" finished: 0

Debería poder ver los cambios en el directorio /opt en el servidor remoto con el siguiente comando:

ls /opt

Debería ver que todos los archivos y directorios del directorio /etc se agregan al directorio /opt del servidor remoto:

acpi                    dconf           hosts            logrotate.conf       newt                     rc2.d          subuid-
adduser.conf            debconf.conf    hosts.allow      logrotate.d          nginx                    rc3.d          sudoers
alternatives            debian_version  hosts.deny       lsb-release          nsswitch.conf            rc4.d          sudoers.d
apache2                 default         init             lsyncd               ntp.conf                 rc5.d          sysctl.conf
apparmor                deluser.conf    init.d           ltrace.conf          openal                   rc6.d          sysctl.d
apparmor.d              depmod.d        initramfs-tools  lvm                  opt                      rcS.d          systemd
apport                  dhcp            inputrc          machine-id           os-release               resolv.conf    terminfo
apt                     dnsmasq.d       insserv.conf.d   magic                overlayroot.conf         rmt            timezone
at.deny                 docker          iproute2         magic.mime           PackageKit               rpc            tmpfiles.d
bash.bashrc             dpkg            iscsi            mailcap              pam.conf                 rsyslog.conf   ubuntu-advantage
bash_completion         e2scrub.conf    issue            mailcap.order        pam.d                    rsyslog.d      ucf.conf
bash_completion.d       environment     issue.net        manpath.config       passwd                   screenrc       udev
bindresvport.blacklist  ethertypes      kernel           mdadm                passwd-                  securetty      ufw
binfmt.d                fonts           kernel-img.conf  mime.types           perl                     security       update-manager
byobu                   fstab           landscape        mke2fs.conf          php                      selinux        update-motd.d
ca-certificates         fuse.conf       ldap             modprobe.d           pki                      sensors3.conf  update-notifier
ca-certificates.conf    fwupd           ld.so.cache      modules              pm                       sensors.d      vdpau_wrapper.cfg
calendar                gai.conf        ld.so.conf       modules-load.d       polkit-1                 services       vim
console-setup           groff           ld.so.conf.d     mtab                 pollinate                shadow         vmware-tools
cron.d                  group           legal            multipath            popularity-contest.conf  shadow-        vtrgb
cron.daily              group-          letsencrypt      multipath.conf       profile                  shells         vulkan
cron.hourly             grub.d          libaudit.conf    mysql                profile.d                skel           wgetrc
cron.monthly            gshadow         libnl-3          nanorc               protocols                sos.conf       X11
crontab                 gshadow-        locale.alias     netplan              pulse                    ssh            xattr.conf
cron.weekly             gss             locale.gen       network              python3                  ssl            xdg
cryptsetup-initramfs    hdparm.conf     localtime        networkd-dispatcher  python3.8                subgid         zsh_command_not_found
crypttab                host.conf       logcheck         NetworkManager       rc0.d                    subgid-
dbus-1                  hostname        login.defs       networks             rc1.d                    subuid

Conclusión

En la guía anterior, aprendimos cómo instalar y configurar Lsyncd para sincronización local y sincronización remota. Ahora puede utilizar Lsyncd en el entorno de producción con fines de copia de seguridad. No dude en preguntarme si tiene alguna pregunta.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *