Ici, l’objectif est de sauvegarder de façon automatisé sur des cycles donnés tout en gardant l’option de générer une nouvelle copie, le tout avec le même script.
C’est le serveur d’application qui enverra les fichiers, car si le serveur “Application” vient à tomber, on économise des ressources en exécutant un script dans le vent sur Storage. Vous pouvez toujours faire l’inverse, mais comme c’est la dernière politique de sauvegarde que j’ai mis en place…. Faites votre sauce !
Attention à la sécurité de votre infrastructure, j’ai procédé comme ça, certes si un serveur est piraté, le pirate aura accès aux sauvegardes mais pas aux données de prod et il ne pourra pas faire mumuse avec les prods. Mes règles d’accès SSH sont comme suit : tout ce qui n’est explicitement autorisé est interdit. Le fait d’inverser le process, à savoir, que Storage soit l’initiateur de synchro implique qu’il a un accès à TOUS les serveurs et que donc, s’il tombe sous le coup d’un piratage, c’est toute l’infra qui mange !
Pré-requis
- Rsync : pour le transfert de fichiers
- SSH : Tunnel pour le transfert
- SendMail : pour les notifications
- Autoriser Application à se connecter à Storage sans mot de passe (avec une clé)
1234/usr/bin/ssh-keygen -t dsa -b 1024# Ne saisissez rien en Passphrase/usr/bin/ssh-copy-id -i /home/UTILISATEUR/.ssh/id_dsa.pub UTILISATEUR@IPSTORAGE# Entrez le mot de passe
Informations
A noter que la structure des sauvegardes de Storage sera comme suit :
/home/save/$1/$2/*
Utilisation
1 2 3 4 5 6 7 8 9 |
/etc/script/save.sh $1 $2 $3 $4 $5 $6 # $1 Nom du serveur émetteur # $2 Nom de la copie # $3 Chemin vers les données à sauvegarder # Si $3 = Plesk, le chemin sera /var/www/vhosts/ # Si $3 n'existe pas (seulement 1 et 2 sont définis), ce sera /home/ # $4 Email pour les notifications # $5 (option) Login MySQL # $6 (option) Pass MySQL |
Implantation
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
/bin/mkdir /etc/script/ && /usr/bin/nano /etc/script/exit.sh /etc/script/save.sh && /bin/chmod +x /etc/script/*.sh # N'oubliez pas de modifier la ligne 29 en y mettant l'adresse IP de votre storage. #/etc/script/exit.sh #!/bin/bash /bin/kill $1 exit 0; #/etc/script/save.sh #!/bin/bash function sh_help { # $1 host # $2 period # $3 source # $4 notif # $6 mysql login # $7 mysql passw /bin/echo 'Author: julien.vida@me.com | http://blog.julien-vida.fr' } if [ $# = 0 ] ; then #if no arg set sh_help else #if $1 = init if [ $# = 1 ] ; then if [ $1 = 'init' ] ; then /bin/mkdir /tmp/save/ /home/script/exit.sh $$ else sh_help /home/script/exit.sh $$ fi fi # Parameters server= host=$1 #Server name serverName=$1 period=$2 #Name of the backup sql_dest=/tmp/save/ if [ $3 ] ; then if [ $3 = 'plesk' ]; then src="/var/www/vhosts/" else src=$3 fi else src="/home/" fi if [ $4 ]; then mailTo=$4 else mailTo="infra@groupeforce1.com" fi dest="/home/save/$host/$period/" subject="$host,`/bin/date +%s`" # Start Script log="/tmp/save-$period.log" #log init /bin/rm -rf $log #remove pre-existing log file /usr/bin/touch $log #Log creation /bin/echo /home/script/save.sh $@ > $log #add script parameters /bin/echo "" >> $log /bin/echo "Start time: " `/bin/date +%s` >> $log # start time /bin/echo $src "to" $dest "on" $server >> $log /bin/echo "---------" >> $log /bin/echo "Begin of data save" >> $log /bin/echo "" >> $log /usr/bin/rsync -e ssh -rlptgoDv $src root@$server:$dest >> $log /bin/echo "" >> $log /bin/echo "End of data save" >> $log /bin/echo "---------" >> $log if [ $5 ]; then /bin/echo "---------" >> $log /bin/echo "Begin of SQL save" >> $log /bin/echo "" >> $log sql_login=$5 if [ $6 ]; then sql_passw=$6 /usr/bin/mysqldump --password=$sql_passw -u $sql_login -A -C -l -e --skip-comments > $sql_dest/_MysqlDump_$period.sql /usr/bin/rsync -e ssh -rlptgoDv $sql_dest/_MysqlDump_$period.sql root@$server:$dest/mysql/ >> $log /bin/rm -rf $sql_dest/_MysqlDump_$period.sql else /bin/echo "ERROR: sql_passw (arg 6) missing" >> $log /bin/echo "" >> $log fi /bin/echo "" >> $log /bin/echo "End of SQL save" >> $log /bin/echo "---------" >> $log fi /bin/echo "End time: " `/bin/date +%s` >> $log /bin/echo "" >> $log /bin/echo "" >> $log /bin/cat $log | /usr/bin/mail -s "$subject" $mailTo /home/script/exit.sh $$ fi |
On verra le crontab pour l’automatisation un peu plus tard :)
Le billet sur Crontab devrait arriver dans le weekend ;)