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 :
- Le paquet rsync en principe nativement présent sur beaucoup de distribution Linux, si ce n’est pas le cas :
# sudo apt-get install rsync
- Le paquet cron est lui aussi en principe nativement présent sur la majorité des distributions Linux, si ce n’est pas le cas sur la votre :
# sudo apt-get install cron
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 :
# scp -P 2222 /home/BACKUPS/.ssh/id_rsa.pub backups@ADRESSEIPDEDIE:/home/BACKUPS/.ssh/
(l’argument -P 2222 n’est à utiliser que si vous passer par un autre port pour le protocol SSH, ce que je fais personnellement pour augmenter la sécurité)
# 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.