Utiliser rsnapshot pour automatiser des sauvegardes distantesUsing rsnapshot for automatic remote backups
Ce tutoriel présente quelques cas pratiques d’utilisation de rsnapshot pour sauvegarder des données d’un serveur distant sur une machine locale. En particulier trois types de sauvegardes vont être présentées :
- sauvegarde d’un dossier distant sur l’ordinateur local en utilisant une connexion SSH par paire de clé publique/privée
- sauvegarde d’un dossier distant sur l’ordinateur local en utilisant une connexion SSH avec mot de passe
- sauvegarde d’une base de données distante sur l’ordinateur local en utilisant une connexion SSH
Pour reprendre le contexte décrit dans ce tutoriel, on appellera
- padawan le serveur contenant les données à sauvegarder. Ce serveur est réputé être accessible par connexion SSH (clé ou mot de passe) ;
- master l’ordinateur local de stockage (Ubuntu, 12.04 LTS)
Plus d’informations : sur la documentation officielle (en français) et merci à Fabrice pour m’avoir indiqué le logiciel.
Installation de rsnapshot
Le logiciel possède un package Ubuntu et s’installe donc en ligne de commande avec :
sudo apt-get install rsnapshot
On commence par soigneusement sauvegarder le fichier de configuration initial avec :
sudo cp /etc/rsnapshot.conf /etc/rsnapshot.conf.bak
On peut ensuite créer un utilisateur dédié qui gèrera les sauvegardes :
sudo adduser sauveur
puis on édite le fichier /etc/rsnapshot.conf
en super-utilisateur pour préciser la configuration générale (les cas typiques d’utilisation sont précisées dans la section suivante) :
-
le répertoire de base où les sauvegardes sont effectuées est précisé en début de fichier :
snapshot_root /home/sauveur/saves/
-
si vous souhaitez utiliser SSH, il faut également décommenter la ligne
cmd_ssh /usr/bin/ssh
-
les logs de rsnapshot doivent être sauvegardés dans un fichier accessible à l’utilisateur qui lance la commande. J’ai choisi :
verbose 1 loglevel 3 logfile /home/sauveur/rsnapshot.log lockfile /home/sauveur/rsnapshot.pid
-
l’option
link_dest 1
permet de sauvegarder un certain nombre de fichiers spéciaux (sockets, pipes…) ;</li>
-
je lance une sauvegarde hebdomadaire, toutes sont sauvegardées dans un dossier
monthly.X
oùX
vaut 0, 1, 2, … (0 étant le plus récent, 1 la sauvegarde de la semaine précédente, …). Ce paramètre est spécifié dansretain monthly 4
qui indique 4 sauvegardes mensuelles.</li> </ul>
Finalement, commentez toute les lignes commençant par
backup
et limitez la lecture du fichier au seul utilisateur sauveur :sudo chown sauveur:sauveur /etc/rsnapshot sudo chmod -r /etc/rsnapshot
Ceci est particulièrement utile si vous inscrivez des mots de passe en dur dans ce fichier, comme indiqué plus loin, afin que les autres utilisateurs n’aient pas accès à la lecture de ces mots de passe.
Quelques cas d’utilisation pratique de rsnapshot
Sauvegarde par connexion SSH avec paire de clés publique/privée
Supposons que sur padawan, l’utilisateur dude ait accès (en lecture au moins) aux fichiers/dossiers à sauvegarder. Sur master, en tant que sauveur, on génère une paire de clés SSH sans mot de passe :
sudo su sauveur ssh-keygen -t dsa
La dernière commande génère deux fichiers à l’emplacement que vous avez précisé en répondant à la question
Enter file in which to save the key (/home/sauveur/.ssh/id_dsa):
Si vous avez laissé cette réponse vide, les fichiers générés sont
id_dsa
etid_dsa.pub
. Copiez le fichierid_dsa.pub
sur padawan dans le dossier/home/dude/.ssh
en le renommantauthorized_keys
. Vous devriez alors, depuis master, en tant que sauveur pouvoir vous connecter sur padawan en tant que dude :ssh dude@padawan.fr
Éditez alors de nouveau le fichier
/etc/rsnapshot.conf
en y ajoutant la ligne suivante (à adapter selon vos besoin) :backup dude@padawan.fr:./ root/
qui aura pour effet de sauvegarder toute le répertoire personnel de dude dans
/home/sauveur/saves/monthly.X/root/
.Attention ! Dans la syntaxe de ce fichier, il faut bien utiliser des tabulations et non des espaces pour séparer les différentes parties de la commande.
Sauvegarde de données par connexion SSH avec mot de passe
Pour se connecter via un mot de passe, on peut utiliser la même astuce que celle décrite dans ce post. Le principe général est d’utiliser le programme sshpass en conjonction avec rsync pour faire une copie locale du serveur distant puis ensuite, de lancer un backup de cette copie locale. Cela consiste à ajouter dans le fichier
/etc/rsnapshot.conf
les deux lignes suivantes :backup_script /usr/bin/rsync -ratlz --rsh="/usr/bin/sshpass -p PWD ssh -o StrictHostKeyChecking=no -l dude" padawan.fr:./ /home/sauveur/tmp/ unused/ backup /home/sauveur/tmp/ root2/
où
PWD
est le mot de passe de dude pour accéder au serveur padawan.Sauvegarde de bases de données par connexion SSH avec mot de passe
La même astuce que précédemment peut être utilisée pour sauvegarder une base de données avec une connexion SSH par mot de passe sur un serveur sur lequel la base de données est accessible. Le principe général consiste à réaliser un sqldump de la base de données après une connexion ssh (utilisant soit une paire de clés sans mot de passe, soit une connexion avec mot de passe) puis de lancer le backup du répertoire dans lequel la base de données a été sauvegardée. Ceci est effectué à l’aide des trois lignes suivantes à ajouter au fichier
/etc/rsnapshot.conf
:backup_script /usr/bin/sshpass -p PWD ssh -o StrictHostKeyChecking=no dude@padawan.fr "mysqldump --no-tablespace --opt -h HOST -u LOGIN -p"PWD2" BDNAME | gzip > ~/sauvebd/bdsauvee.sql.gz" unused1/ backup_script /usr/bin/rsync -ratlz --rsh="/usr/bin/sshpass -p PWD ssh -o StrictHostKeyChecking=no -l dude" padawan.fr:sauvebd/ /home/sauveur/tmp2/ unused2/ backup /home/sauveur/tmp2/ root3/
La première ligne se connecte avec l’utilisateur dude sur padawan (mot de passe
PWD
) et sauvegarde la base de donnéesBDNAME
du serveurHOST
accessible à l’utilisateurLOGIN
avec le mot de passePWD2
: une copie gzippée est sauvegardée dans/home/dude/sauvebd/bdsauvee.sql.gz
(le répertoire/home/dude/sauvebd
doit avoir été créé préalablement). La seconde effectue une synchronisation de ce répertoire dans le répertoire local/home/sauveur/tmp2
et la troisième effectue la sauvegarde via rsnapshot de ce répertoire temporaire dans/home/sauveur/saves/monthly.X/root3/
.Tester et automatiser la sauvegarde avec une tâche CRON
Une fois la configuration effectuée, on peut tester la syntaxe du fichier
/etc/rsnapshot.conf
en lançant, sur master avec l’utilisateur sauveur les commandes suivantes :rsnapshot configtest rsnapshot -t monthly
La première teste la syntaxe du fichier et la seconde simule les opérations qui seront effectuées pour un lancement hebdomadaire de rsnapshot.
Si tout fonctionne correctement, on finalise en créant, sur master avec l’utilisateur sauveur, une tâche CRON :
crontab -e
où on ajoute la ligne suivante :
30 01 * * 3 rsnapshot monthly
qui démarre la commande
</div>rsnapshot monthly
tous les troisièmes jours de la semaine (le mardi), à 1h30.