Site icon WolwX.net

SSH : Script de backup RSYNC automatisé en CRON

Voilà donc, j’ai voulu dépoussiéré un petit script utile que je me suis fait il y à quelques années et qui à pour but de faire un backup entre 2 serveurs dédiés sous Linux. Du coup je l’ai un peu modifié pour l’utilisation de différentes variables.

A savoir que ce script fonctionne bien en solo, mais que son intérêt premier est de l’inclure dans une routine automatique par CRON, de cette manière, je n’ai qu’à vérifier dans ma boîte email pour être sur que mes backups sont fait régulièrement 🙂

Les prérequis :

1> Mise en place des éléments

Pour pouvoir faire fonctionner ce script on va préparer les dossiers et créer un fichier de lancement.

Pour les dossiers rien de spécial, créé simplement les dossiers dans lesquels vous allez stocker vos sauvegardes, par exemple dans /home/BACKUPS, ainsi que son sous dossier contenant les logs.

# mkdir /home/BACKUPS
# chmod -R 777 /home/BACKUPS
# mkdir /home/BACKUPS/+logs+
# chmod -R 777 /home/BACKUPS/+logs+

Ensuite on créé le script de lancement qui sera utile pour utiliser en automatisation et notre rapport email.
En effet ce script de lancement va appeler le script principal en générant un output sous forme de log. C’est ce fichier de log que l’on récupérera dans l’email final contenant le rapport final de sauvegarde.

J’appel mon script de lancement backup-MONDEDIE.sh et voici son contenu :

#!/bin/bash
/home/BACKUPS/./MONDEDIE.sh &> /home/BACKUPS/+logs+/backup-MONDEDIE.log

Rien de complexe à comprendre, on va lancer le script qui ce trouve dans le dossier /home/BACKUPS et qui est pour MONDEDIE, et on lui indique dans le même temps de générer un output sur un fichier log présent dans le dossier /home/BACKUPS/+logs+/

 

2> Connexion SSH sans mot de passe 

Pour les besoins de mon script, et de Rsync en particulier, je veux pouvoir me connecter sur un utilisateur sans passer par le mot de passe SSH.

En effet le script ne peut pas être automatisé si il bloque sur l’authentification SSH à l’étape de synchronisation Rsync …

Pour cela je vais créer un utilisateur, que j’appel “backups“, et qui sera dédié à faire ces sauvegardes.

On créé le dossier ainsi que le fichier qui contiendra l’enregistrement de notre clef SSH propre à cet utilisateur sur les 2 serveurs dédiés, le cible et celui qui va faire les sauvegardes :

# mkdir -p /home/BACKUPS/.ssh
# touch /home/BACKUPS/.ssh/authorized_keys

On créé ensuite l’utilisateur, là aussi sur les 2 serveurs dédiés, en lui adressant son dossier home, puis on lui attribue un mot de passe :

# useradd -d /home/BACKUPS backups
# passwd backups

Enfin, toujours sur les 2 serveurs dédiés, on règle les permissions de dossiers et fichiers :

# chown -R backups:backups /home/BACKUPS
# chown root:root /home/BACKUPS
# chmod 700 /home/BACKUPS/.ssh
# chmod 644 /home/BACKUPS/.ssh/authorized_keys

Voilà on connecte maintenant sur le serveur distant en terminal SSH depuis ce nouvel utilisateur.

Avec cet utilisateur, et sur le serveur distant (celui qui fera les sauvegardes), on va générer une clef SSH utile pour l’authentification sans mot de passe :

# ssh-keygen -t rsa -b 1024

Il vous sera alors demander d’entrer quelques réglages comme la localisation du fichier, ou encore une passphrase, mais ceci est optionnel, pour ma part je valide toujours par un return

Ensuite il vous faudra transférer cette clef sur notre serveur « cible ».
Je passe par un simple transfert en scp :

Puis une fois notre clef transférée on va la rajouter dans la liste des clefs autorisées sur notre serveur cible :
# cd /home/BACKUPS/.ssh; cat /home/BACKUPS/.ssh/id_rsa.pub >> /home/BACKUPS/.ssh/authorized_keys; rm id_rsa.pub

Désormais notre utilisateur backups peut ce connecter en ssh sans mot de passe sur notre serveur cible, petit essai pour confirmer le tout :

# ssh -p 2222 backups@ADRESSEIPDEDIE

(là aussi l’argument -P 2222 n’est à utiliser que si vous passer par un autre port pour le protocol SSH)

 

3> Script de backup RSYNC

Nous pouvons enfin passer au script en lui même 🙂

Ce script à était pensé pour faire sauvegarde d’un serveur dédié vers un autre, mais il fonctionne tout aussi bien en local, sur le même serveur dédié, le tout grâce à RSYNC.

A savoir que ce script est divisé en 4 étapes, dans un premier temps il nettoie les anciens fichier, dans un second temps il lance un transfert à travers Rsync, puis il vérifie l’état d’occupation des disques et enfin il envoi un rapport par email.

Il permet lancer la sauvegarde sur 5 dossiers différents, si l’on laisse une variable dossiercible vide elle ne sera tout simplement pas pris en compte.
A noter qu’il est important de ne pas renseigner le dernier slash dans les différents chemins utilisés en variable.

Voici le contenu du script de backup en lui même que je vais inclure dans un fichier appelé MONDEDIE.sh :

echo --------------------------------
echo ----- BACKUP Full Script v2 ----
echo ----- by WolwX @ n1-Web.fr -----
echo --------------------------------
echo 
# DEBUT DES VARIABLES
serv="NOMDEMONDEDIE"
ipdedie="ADRESSEIPDEDIE"
userssh="USER"
portssh="PORT"
cheminbackup="/DOSSIER/BACKUPS"
cheminlogs="/DOSSIER/BACKUPS/+logs+"
dossiercible="/DOSSIER/CIBLE"
dossiercible2=""
dossiercible3=""
dossiercible4=""
dossiercible5=""
sendmail="sendmail"
mailenvoi="BACKUP@MONNDD"
maildestinataire="DESTINATAIRE@MONNDD"
skipcleanup="0"
delais="365"
# FIN DES VARIABLES
if [ $skipcleanup = "0" ]
then
echo --- CLEANUP ---
echo - Cleanup start @ $(date +%d-%m-%y_%H:%M)
echo - Listing des fichiers enregistres @ cleanup-$serv-$(date +%d-%m-%y_%H:%M).log
find $cheminbackup/$serv -type f -mtime $delais -exec echo "{}" \; > $cheminlogs/cleanup-$serv-$(date +%d-%m-%y_%H:%M).log
echo - Effacement des fichiers plus anciens que $delais jours
find $cheminbackup/$serv -type f -mtime $delais -exec rm -f {} \;
echo - Cleanup done @ $(date +%d-%m-%y_%H:%M)
echo  
fi
echo --- RSYNC ---
echo - Rsync start @ $(date +%d-%m-%y_%H:%M)
echo - Synchronisation du dossier cible $dossiercible1
rsync -avz -e "ssh -p $portssh" $userssh@$ipdedie:/$dossiercible1/* $cheminbackup/$serv/${dossiercible1##*/} > $cheminlogs/rsync-$serv-${dossiercible1##*/} -$(date +%d-%m-%y_%H:%M).log
echo - Synchronisation du dossier cible $dossiercible1 terminee
if [ -n "$dossiercible2" ]
then
echo - Synchronisation du dossier cible $dossiercible2
rsync -avz -e "ssh -p $portssh" $userssh@$ipdedie:/$dossiercible2/* $cheminbackup/$serv/${dossiercible2##*/} > $cheminlogs/rsync-$serv-${dossiercible2##*/} -$(date +%d-%m-%y_%H:%M).log
echo - Synchronisation du dossier cible $dossiercible2 terminee
fi
if [ -n "$dossiercible3" ]
then
echo - Synchronisation du dossier cible $dossiercible3
rsync -avz -e "ssh -p $portssh" $userssh@$ipdedie:/$dossiercible3/* $cheminbackup/$serv/${dossiercible3##*/} > $cheminlogs/rsync-$serv-${dossiercible3##*/} -$(date +%d-%m-%y_%H:%M).log
echo - Synchronisation du dossier cible $dossiercible3 terminee
fi
if [ -n "$dossiercible4" ]
then
echo - Synchronisation du dossier cible $dossiercible4
rsync -avz -e "ssh -p $portssh" $userssh@$ipdedie:/$dossiercible4/* $cheminbackup/$serv/${dossiercible4##*/} > $cheminlogs/rsync-$serv-${dossiercible4##*/} -$(date +%d-%m-%y_%H:%M).log
echo - Synchronisation du dossier cible $dossiercible4 terminee
fi
if [ -n "$dossiercible5" ]
then
echo - Synchronisation du dossier cible $dossiercible5
rsync -avz -e "ssh -p $portssh" $userssh@$ipdedie:/$dossiercible5/* $cheminbackup/$serv/${dossiercible5##*/} > $cheminlogs/rsync-$serv-${dossiercible5##*/} -$(date +%d-%m-%y_%H:%M).log
echo - Synchronisation du dossier cible $dossiercible5 terminee
fi
echo - Rsync done @ $(date +%d-%m-%y_%H:%M)
echo 
echo --- CHECK ---
echo - Check start @ $(date +%d-%m-%y_%H:%M)
df -h
echo 
du -sh $cheminbackup/
du -sh $cheminbackup/$serv/
echo - Check done @ $(date +%d-%m-%y_%H:%M)
echo 
echo --- REPORT ---
echo - Report send @ $(date +%d-%m-%y_%H:%M)
echo 'Subject:' "BACKUP-$serv" | cat - "$cheminlogs/backup-$serv.log" | $sendmail -r $mailenvoi $maildestinataire
echo - Report done @ $(date +%d-%m-%y_%H:%M)
echo 
echo -------------------------------
echo

Voilà après création du script, et ajustement des variables, on vérifie qu’il fonctionne correctement en le lançant depuis un terminal ssh :

# cd /home/BACKUPS
# chmod 777 MONDEDIE.sh
# ./MONDEDIE.sh

et voici le output dans le terminal =>

--------------------------------
----- BACKUP Full Script v2 ----
----  by WolwX @ n1-Web.fr  ----
--------------------------------

--- CLEANUP ---
- Cleanup start @ 18-08-18_11:50
- Listing des fichiers enregistres @ cleanup-NOMDEMONDEDIE-18-08-18_11:50.log
- Effacement des fichiers plus anciens que 365 jours
- Cleanup done @ 18-08-18_11:50

--- RSYNC ---
- Rsync start @ 18-08-18_11:50
- Synchronisation du dossier cible /DOSSIER/CIBLE
USER@ADRESSEIPDEDIE's password:
- Rsync done @ 18-08-18_11:50

--- CHECK ---
- Check start @ 18-08-18_11:50
Sys. de fichiers Taille Utilisé Dispo Uti% Monté sur
/dev/sda2 20G 3,6G 15G 20% /
udev 3,9G 4,0K 3,9G 1% /dev
tmpfs 790M 484K 789M 1% /run
none 4,0K 0 4,0K 0% /sys/fs/cgroup
none 5,0M 0 5,0M 0% /run/lock
none 3,9G 0 3,9G 0% /run/shm
none 100M 0 100M 0% /run/user
/dev/sda3 48G 24G 22G 52% /opt
/dev/sda5 1,8T 46G 1,6T 3% /home

46G /home/BACKUPS/
20G /home/BACKUPS/NOMDEMONDEDIE/
- Check done @ 18-08-18_11:50

--- REPORT ---
- Report send @ 18-08-18_11:50
- Report done @ 18-08-18_11:50

-------------------------------

Voilà tout ces bien passé, et en principe vous avez même reçu l’email contenant le même output que le terminal 🙂

 

4> Automatisation du script en CRON

Une fois que tout est ok on peut enfin mettre en place la gestion automatique.

Pour ce faire on va passer par le gestionnaire de tâche planifiée Crontab afin de pouvoir rajouter notre automatisation.

On ce connecte sur notre serveur distant, avec notre utilisateur récemment créé, backups, et on accède à l’éditeur de tâche par cette commande :

# crontab -e

On est alors invité à choisir avec quel éditeur de fichier on va rajouter notre tâche, il suffit d’indiquer le chiffre correspondant à votre éditeur préféré, ou bien de valider 2 pour choisir le plus basique /bin/nano .

Nous voilà sur un document, en principe vierge, il faut alors rajouter cette ligne :

0 7 * * * /DOSSIERS/BACKUPS/./backup-NOMDEMONDEDIE.sh #Le titre de votre souhait

On enregistre le fichier, et notre tâche sera automatiquement validée !

A savoir que dans cet exemple, on indique au gestionnaire de tâche de lancer notre script backup-NOMDEMONDEDIE.sh à la minute 0 de la 7ème heure, et ceci pour tous les jours, tous les mois, et tous les jours de la semaine.

Si l’on veut changer la minute, on remplace le 0 par la minute de notre choix, si l’ont veut changer l’heure on remplace le 7.
Si l’on veut spécifier un jour du calendrier on renseigne le chiffre à la place de la 1ère étoile, si l’ont veut spécifier un mois on renseigne son chiffre à la place de la 2ème étoile.
Enfin si l’on veut spécifier un jour de la semaine la correspondance à renseigner à la place de la dernière étoile est la suivante : Dimanche = 0, Lundi = 1, ainsi de suite jusqu’à Samedi = 6.

 

Voilà donc on est arrivé au bout, et on devrait maintenant être beaucoup plus tranquille avec ces sauvegardes automatique 🙂
On à plus qu’à vérifier ces emails afin de constater le bon déroulement de ces sauvegardes.

Quitter la version mobile