(Modifié le 07/08/2019)

Lsyncd

Lsyncd est un moyen de synchroniser automatiquement un répertoire local avec d’autres machines. Les fichiers sur la machine locale sont surveillés pour les changements toutes les quelques secondes et si des changements sont notés, ils sont alors répliqués et synchronisés sur le(s) serveur(s) distant(s). Cette solution de synchronisation est facile à installer, légère et ne limite pas les performances du système de fichiers local.

Par défaut, Lsync utilise Rsync pour répliquer les fichiers de la machine locale et ne transférera que les fichiers qui ont été modifiés. Il existe d’autres solutions sur le marché qui exécutent cette tâche, mais il s’agit d’une solution peu coûteuse et pratique pour synchroniser automatiquement les données, minimisant ainsi la perte de données et le temps passé à répliquer les fichiers d’une machine à l’autre.

Les 5 fonctions suivantes sont proposées :

  • Vérifie ce qui doit être synchronisé de votre machine locale vers votre ou vos serveurs distants.
  • Contrôles sur le vice versa
  • Synchronisation de votre local vers votre distant
  • Syncs vice-versa
  • Peut éditer votre fichier “rsync includes”.

L’utilisation de cette méthode vous permet de synchroniser en continu les données de votre machine locale vers la machine distante sans ajouter de stress supplémentaire sur le serveur.

Installation lsyncd

L’installation de Lsyncd sur votre serveur est un processus assez simple et facile. Utilisez les commandes suivantes pour l’installer sur votre système Debian ou Archlinux.

sudo apt install lsyncd

Archlinux

yaourt -S lsyncd

L’exécution de ces commandes installera Lsyncd et inclura quelques exemples dans le répertoire /usr/share/doc/lsyncd/examples.Ces exemples peuvent être utilisés pour avoir une meilleure idée des configurations possibles lors de l’utilisation de cette méthode de synchronisation.

Arrêt temporaire du service, pour la configuration

sudo systemctl stop lsyncd

Mise en place de l’environnement

Répertoire local : /srv/wikistatic/_site
La connexion SSH sur la machine distante se fait avec l’utilisateur backupuser et un jeu de clé id_rsa

machine distante

Création répertoire avec les droits utilisateur

sudo mkdir /srv/dest
sudo chown backupuser.backupuser -R /srv/dest

machine locale

Créer un répertoire de logs et quelques fichiers que lsyncd à utilisera

sudo mkdir /var/log/lsyncd
sudo touch /var/log/lsyncd/lsyncd.log
sudo touch /var/log/lsyncd/lsyncd-status.log

Ensuite, nous pouvons créer le répertoire de configuration lsyncd

sudo mkdir /etc/lsyncd

Créer un fichier de configuration à l’intérieur de ce répertoire appelé “lsyncd.conf.lua”

sudo nano /etc/lsyncd/lsyncd.conf.lua
settings {
    logfile = "/var/log/lsyncd/lsyncd.log",
    statusFile = "/var/log/lsyncd/lsyncd-status.log",
    statusInterval = 20
}
sync {
    default.rsync,
    source="/srv/wikistatic/_site",
    target="backupuser@193.70.43.101:/srv/dest",
    rsync = {
        archive = false,
        acls = false,
        compress = true,
        links = false,
        owner = false,
        perms = false,
        verbose = true,
        rsh = "/usr/bin/ssh -p 55027 -i /home/backupuser/.ssh/id_rsa -o StrictHostKeyChecking=no"
    }
}

Utiliser lsyncd

Lancer manuellement

lsyncd /etc/lsyncd/lsyncd.conf.lua

Lancer le service

sudo systemctl start lsyncd

Statut

sudo systemctl status lsyncd
● lsyncd.service - LSB: lsyncd daemon init script
   Loaded: loaded (/etc/init.d/lsyncd)
   Active: active (running) since mer. 2018-04-25 21:14:51 CEST; 27s ago
  Process: 9877 ExecStop=/etc/init.d/lsyncd stop (code=exited, status=0/SUCCESS)
  Process: 15464 ExecStart=/etc/init.d/lsyncd start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/lsyncd.service
           ├─15468 /usr/bin/lsyncd -pidfile /var/run/lsyncd.pid /etc/lsyncd/lsyncd.conf.lua
           ├─15469 /usr/bin/rsync --delete --ignore-errors -vzst --rsh=/usr/bin/ssh -p 55027 -i /home/b...
           └─15470 /usr/bin/ssh -p 55027 -i /home/backupuser/.ssh/id_rsa -o StrictHostKeyChecking=no -l...

avril 25 21:14:51 yanspm.com lsyncd[15464]: Starting synchronization daemon: lsyncd.
avril 25 21:14:51 yanspm.com systemd[1]: Started LSB: lsyncd daemon init script.

Vérifier l’opération

cat /var/log/lsyncd/lsyncd.log
[...]
sent 15,851,575 bytes  received 10,820 bytes  118,819.44 bytes/sec
total size is 21,886,154  speedup is 1.38
Wed Apr 25 21:17:04 2018 Normal: Startup of "/srv/wikistatic/_site/" finished.

Lsyncd rotation des logs

Rotation des logs chaque semaine ,on conserve les 4 dernières rotations

sudo nano /etc/logrotate.d/lsyncd
/var/log/lsyncd/*.log {
        weekly
        rotate 4
        delaycompress
        compress
        notifempty
        missingok
}

Configuration d’une synchronisation locale

Donc, pour tester, essayons une synchronisation locale avec lsyncd. Commençons par créer un «dossier source» contenant les fichiers à synchroniser.

$ mkdir -p $HOME/unixmen/sync_source

Ensuite, nous allons créer un dossier de sauvegarde:

$ mkdir $HOME/sync_backup

Juste pour le test, remplissez le répertoire source avec des fichiers nuls, en utilisant la commande tactile :

touch $HOME/unixmen/sync_source/unixmentest{1..10}0

Maintenant, créez des fichiers de log et d’état:

# mkdir /var/log/lsyncd
# touch /var/log/lsyncd.{log,status}

Le fichier de configuration continue /etc/lsyncd :

# mkdir /etc/lsyncd

Ici, nous allons créer un nouveau fichier de configuration:

# nano /etc/lsyncd/lsyncd.conf.lua

Où nous mettrons le code suivant:

settings = {
logfile = "/var/log/lsyncd/lsyncd.log",
statusFile = "/var/log/lsyncd/lsyncd.status"
}

sync {
default.rsync,
source = "$HOME/unixmen/sync_source/",
target = "$HOME/sync_backup",
}

En ce moment, si vous regardez dans le répertoire de sauvegarde, vous le trouverez vide, car le service n’est pas en cours d’exécution. Mais, pour résoudre ce problème, redémarrez simplement lsyncd avec les éléments suivants:

# systemctl restart lsyncd

Il va commencer (et continuer) la synchronisation, même si vous ajoutez plus de fichiers sur sync_source. Cela fonctionne complètement en mode automatisé.

Linux inotify rsync

Vous avez deux clients et/ou serveurs ou plus. Ils contiennent des fichiers que vous voulez synchroniser automatiquement.
Rsync + inotify (surveillance en temps réel de votre système de fichiers) sont la solution afin que vos fichiers puissent être synchronisés entre plusieurs machines.

Prérequis sur les machines

  • OpenSSH server
  • Rsync
  • Inotify

Installer toutes les dépendances sur les serveurs

apt update && apt -y install openssh-server rsync inotify-tools

Créons un dossier spécifique que nous voulons synchroniser

mkdir /opt/syncfiles

Utilisation de clés pour SSH

Deux alternatives, l’une (A) utilise SSH avec ACCES root et l’autre (B) utilise SSH avec SANS ACCES root

A-Utilisation de clés pour SSH avec ACCES root

Et pour un transfert de fichiers sécurisé, nous voulons un lien public-privé pour le lien de transfert que rsync utilise

ssh-keygen -t rsa -f ~/rsync-key -N ''

Coller le résultat dans le fichier ~/.ssh/.ssh/authorized_keys de vos serveurs de destination

cat ~/rsync-key.pub

Retirer la clé publique pour des raisons de sécurité

rm ~/rsync-key.pub

Copier le contenu de la clé publique rsync-key.pub dans tous les fichiers authorized_keys de vos serveurs de destination.

Le travail de pré-configuration est terminé, écrire un script qui passe par une boucle infinie avec inotifywait dedans :

#!/bin/bash

# Il est supposé s'exécuter sur rsync-host01, changer rsync-host02 en rsync-host01 pour créer un script qui est censé s'exécuter sur rsync-host02.

while true; do
  inotifywait -r -e modify,attrib,close_write,move,create,delete /opt/syncfiles
  rsync -avz -e "ssh -i /root/rsync-key -o StrictHostKeyChecking=no“  /opt/syncfiles/ root@rsync-host02:/opt/syncfiles/
done

Si le port 22 n’est pas celui par défaut, ajouter l’option -p N°Port à la commande ssh

Enregistrer ce script dans le répertoire /opt sous le nom file-sync.sh

B-Utilisation de clés pour SSH SANS ACCES root

A faire sur tous les serveurs distants

Création utilisateur backupuser et d’un jeu de clé ssh

sudo adduser backupuser  #mot de passe à saisir 

Cette commande va vous demander plusieurs informations et notamment un mot de passe à noter impérativement. N’hésitez pas à définir un mot de passe compliqué, d’environ 16 caractères avec des chiffres, des lettres majuscule/minuscule et quelques caractères spéciaux car vous n’aurez à le taper réellement qu’une fois.

Création dossier .ssh

sudo mkdir /home/backupuser/.ssh/

Modifier les droits

sudo chown backupuser. -R /home/backupuser/.ssh/
sudo chmod 644 -R /home/backupuser/.ssh/

On se connecte en backupuser

sudo su backupuser
ssh-keygen -t rsa
chmo 400 id_rsa*       #lecture seule pour utilisateur backupuser 

Edition fichier sudoers pour un accès root à l’exécution de rsync

sudo -s

On donne à l’utilisateur backupuser les droits d’exécution en mode root de rsync
Ajouter ligne suivante en fin du fichier /etc/sudoers

echo "backupuser ALL=NOPASSWD: /usr/bin/rsync" >> /etc/sudoers

Service systemd sync.service

Créer un fichier appelé sync.service qui peut s’arrêter, démarrer et réinitialiser le script à la demande ou sur des événements spécifiques comme un démarrage du système dans le répertoire /etc/systemd/systemd/system/system/ avec le contenu suivant

[Unit]
Description = SyncService
After = network.target

[Service]
PIDFile = /run/syncservice/syncservice.pid
User = root
Group = root
WorkingDirectory = /opt
ExecStartPre = /bin/mkdir /run/syncservice
ExecStartPre = /bin/chown -R root:root /run/syncservice
ExecStart = /bin/bash /opt/file-sync.sh
ExecReload = /bin/kill -s HUP $MAINPID
ExecStop = /bin/kill -s TERM $MAINPID
ExecStopPost = /bin/rm -rf /run/syncservice
PrivateTmp = true

[Install]
WantedBy = multi-user.target

Droits du fichier de service et recharger le démon systemd

chmod 755 /etc/systemd/system/sync.service  
systemctl daemon-reload

Activer le service

systemctl enable sync.service

Démarrer le service

systemctl start sync.service