Comment synchroniser des répertoires à l’aide de Lsyncd sur Ubuntu 20.04

Lsyncd est un outil simple et léger qui te permet de créer un miroir de ton répertoire local vers un autre répertoire sur le serveur distant. Il fonctionne en surveillant en permanence les modifications apportées au répertoire spécifié toutes les quelques secondes et si des modifications sont apportées, elles sont synchronisées avec le serveur distant. Cet outil est très utile pour synchroniser les données d’une zone sécurisée à une zone non sécurisée.

Dans ce tutoriel, nous allons te montrer comment installer et utiliser Lsyncd pour synchroniser les répertoires locaux et les répertoires distants.

Conditions préalables

  • Un serveur exécutant Ubuntu 20.04.
  • Un mot de passe root est configuré sur ton serveur.

Démarrage

Avant de commencer, c’est une bonne idée de mettre à jour les paquets de ton système à la dernière version. Tu peux les mettre à jour à l’aide de la commande suivante :

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

Une fois que tous les paquets sont mis à jour, redémarre ton système pour appliquer les changements.

Installe Lsyncd

Par défaut, le paquet Lsyncd est disponible dans la plupart des systèmes d’exploitation Linux. Tu peux l’installer en exécutant simplement la commande suivante :

apt-get install lsyncd -y

Une fois que Lsyncd est installé, tu peux vérifier la version installée de Lsyncd avec la commande suivante :

lsyncd --version

Tu devrais obtenir la sortie suivante :

Version: 2.2.3

Configurer Lsyncd pour synchroniser les répertoires locaux

Dans cette section, nous allons configurer Lsyncd pour synchroniser le répertoire /etc/ avec le répertoire /mnt/ sur le système local.

Tout d’abord, crée un répertoire pour Lsyncd avec la commande suivante :

mkdir /etc/lsyncd

Ensuite, crée un nouveau fichier de configuration Lsyncd et définis le répertoire source et le répertoire de destination que tu veux synchroniser.

nano /etc/lsyncd/lsyncd.conf.lua

Ajoute les lignes suivantes :

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

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

Sauvegarde et ferme le fichier lorsque tu as terminé.

systemctl start lsyncd
systemctl enable lsyncd

Tu peux aussi vérifier l’état du service Lsyncd avec la commande suivante :

systemctl status lsyncd

Tu devrais voir la sortie suivante :

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

Tu peux vérifier le fichier journal de Lsyncd pour plus de détails, comme indiqué ci-dessous :

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

Tu devrais voir le résultat suivant :

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

Tu peux aussi vérifier l’état de la synchronisation avec la commande suivante :

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

Tu devrais pouvoir voir les changements dans le répertoire /mnt avec la commande suivante :

ls /mnt/

Tu devrais voir que tous les fichiers et répertoires du répertoire /etc sont ajoutés au répertoire /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

Configurer Lsyncd pour synchroniser les répertoires distants

Dans cette section, nous allons configurer Lsyncd pour synchroniser le répertoire /etc/ du système local avec le répertoire /opt/ du système distant.

Avant de commencer, tu dois configurer l’authentification basée sur la clé SSH entre le système local et le serveur distant afin que le système local puisse se connecter au serveur distant sans mot de passe.

Sur le système local, exécute la commande suivante pour générer une clé publique et une clé privée :

ssh-keygen -t rsa

Tu devrais voir la sortie suivante :

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]-----+

La commande ci-dessus va générer une clé privée et une clé publique dans le répertoire ~/.ssh.

Ensuite, tu devras copier la clé publique sur le serveur distant. Tu peux la copier avec la commande suivante :

ssh-copy-id [email protected]

Il te sera demandé de fournir le mot de passe de l’utilisateur root distant, comme indiqué ci-dessous :

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

Une fois l’utilisateur authentifié, la clé publique sera ajoutée au fichier authorized_keys de l’utilisateur distant et la connexion sera fermée.

Maintenant, tu devrais pouvoir te connecter au serveur distant sans entrer de mot de passe.

Pour le tester, essaie simplement de te connecter à ton serveur distant via SSH :

ssh [email protected]

Si tout s’est bien passé, tu seras immédiatement connecté.

Ensuite, tu devras modifier le fichier de configuration de Lsyncd et définir les variables rsyncssh et hôte cible :

nano /etc/lsyncd/lsyncd.conf.lua

Modifie le fichier comme indiqué ci-dessous :

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"
}

Enregistre et ferme le fichier lorsque tu as terminé. Ensuite, redémarre le service Lsyncd pour lancer la synchronisation.

systemctl restart lsyncd

Tu peux vérifier l’état de la synchronisation avec la commande suivante :

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

Tu devrais voir la sortie suivante :

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

Tu devrais pouvoir voir les changements dans le répertoire /opt sur le serveur distant avec la commande suivante :

ls /opt

Tu devrais voir que tous les fichiers et répertoires du répertoire /etc sont ajoutés au répertoire /opt du serveur distant :

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

Conclusion

Dans le guide ci-dessus, nous avons appris à installer et à configurer Lsyncd pour la synchronisation locale et la synchronisation à distance. Tu peux maintenant utiliser Lsyncd dans l’environnement de production à des fins de sauvegarde. N’hésite pas à me demander si tu as des questions.

Vous aimerez aussi...