introduction
La sauvegarde des données importantes est un élément essentiel de la gestion de toute infrastructure informatique. Bien que les besoins de chacun soient différents en ce qui concerne les sauvegardes, il est recommandé de conserver les données de sauvegarde à un emplacement hors site.
L'envoi de copies de données à un emplacement hors site constituait un défi logistique majeur. Mais avec l'avènement des services de stockage basés sur le cloud comme Crashplan et Dropbox, ainsi que le développement de solutions de stockage d'objets commeDigitalOcean Spaces, c'est devenu une tâche beaucoup plus simple. Malgré cela, se rappeler de sauvegarder des fichiers et de prendre le temps de les télécharger peut toujours être un obstacle pour certains.
C'est pourquoi les utilisateurs choisissent d'utiliser divers outils pour effectuer des sauvegardes de routine et automatiques de leurs données importantes. Dans ce tutoriel, nous allons construire un script autour de l'outil de ligne de commandes3cmd
qui peut être utilisé pour télécharger rapidement des données vers DigitalOcean Spaces. Nous utiliserons ensuitecrontab
pour invoquer régulièrement le script de sauvegarde et télécharger des fichiers sur notre espace.
Conditions préalables
Pour ce tutoriel, vous aurez besoin de:
-
Un droplet Ubuntu 16.04 x64 avec un utilisateur sudo non root. Cela peut être configuré en suivant nosinitial server setup guide for Ubuntu 16.04.
Avoir une certaine familiarité avec les scripts shell et le planificateur de travaux decron
peut également être utile. Pour des conseils et un contexte supplémentaire, envisagez de lire “https://www.digitalocean.com/community/tutorial_series/an-introduction-to-shell-scripting[An Introduction to Shell Scripting]” et “https: //www.digitalocean .com / communauté / didacticiels / procédures-de-planification-de-routine-avec-cron-et-anacron-on-vps [Comment planifier des tâches de routine avec Cron et Anacron sur un VPS]. ”
Avec nos conditions préalables en place, nous sommes prêts à commencer notre processus d’automatisation de la sauvegarde.
Construire notre script de sauvegarde
De nombreux outils peuvent être utilisés pour télécharger des fichiers de sauvegarde sur un service de stockage d’objets automatiquement et à intervalles réguliers. Cependant, ceux-ci peuvent être difficiles à configurer et peuvent ne pas offrir beaucoup de flexibilité. L'utilisation d'un simple script shell peut constituer une approche beaucoup plus élégante et simple d'automatisation des sauvegardes du stockage d'objets.
Pour ce tutoriel, nous allons écrire un script bash de base qui créera une sauvegarde d'un fichier ou d'un répertoire en utilisanttar
. Le script téléchargera ensuite cette sauvegarde vers Spaces à l'aide de l'utilitaire de ligne de commandes3cmd
.
Pour commencer, connectez-vous à votre Droplet et accédez à votre dossier personnel:
cd ~
Une fois dans le dossier de départ, nous utiliseronsnano
pour créer un fichier vide dans lequel nous pourrons écrire dans notre script:
nano bkupscript.sh
Nous sommes maintenant prêts à commencer à écrire notre script de sauvegarde dans l'éditeur de texte. Au fur et à mesure que nous construirons le script, nous en expliquerons chaque partie dans l’ordre, section par section.
Initier notre script
À ce stade,bkupscript.sh
n'est qu'un fichier texte vide. Pour que notre ordinateur appelle notre fichier exécutable sous forme de commandes, nous devons commencer notre script par un hashbang. Unhashbang est une directive d'interprétation qui permet d'exécuter des scripts ou des fichiers de données en tant que commandes.
Dans notre cas, le hashbang ressemblera à ceci:
bkupscript.sh
#!/bin/bash
En incluant cela en haut du script, nous demandons au shell d’exécuter les commandes du fichier en bash.
Déclaration de variables
Ensuite, nous indiquerons à notre script les variables qu’il devra connaître pour fonctionner correctement. Nous pouvons les ajouter directement sous le hashbang en haut du fichier texte:
bkupscript.sh
...
DATETIME=`date +%y%m%d-%H_%M_%S`
SRC=$1
DST=$2
GIVENNAME=$3
Voyons ce que nous attribuons à chacune de ces variables:
-
DATETIME
: Cette variable contient un horodatage à apposer sur le nom de fichier résultant afin que chaque fichier sauvegardé dans notre espace ait un nom unique. Cet horodatage est créé en appelant la commandedate
et en formatant la sortie pour afficher les deux derniers chiffres de l'année (%y
), les deux chiffres du mois (%m
), les deux chiffres du jour (%d
), de l'heure (%H
), des minutes (%M
) et des secondes (%S
). -
SRC
: il s'agit du cheminsource du fichier ou du dossier que nous voulons sauvegarder. Le$1
indique que nous prenons cette valeur du premier paramètre passé au script. -
DST
: cette variable représente lesdestination du fichier. Dans notre cas, il s’agit du nom de l’espace sur lequel nous téléchargeons la sauvegarde. Ce nom proviendra du deuxième paramètre passé au script comme indiqué par les$2
. -
GIVENNAME
: cette variable héberge le nom choisi par l'utilisateur pour le fichier de destination. Le nom de fichier résultant commencera parGIVENNAME
et aura lesDATETIME
concaténés dessus. Ce nom provient du troisième paramètre passé au script ($3
).
Fournir de l'aide
Lors de la rédaction d’un script, il est utile d’ajouter quelques astuces ou conseils généraux qui peuvent aider les utilisateurs à résoudre les problèmes qui surviennent si leur tentative d’utilisation échoue.
Pour notre script de sauvegarde, nous ajouterons une fonction appeléeshowhelp()
sous nos variables. Ceci imprimera une série de messages pour aider les utilisateurs à résoudre les problèmes en cas d'échec du script. Lors de l'ajout d'une fonction dans bash, notre syntaxe ressemblera à ceci:
bkupscript.sh
...
showhelp(){
}
Cette fonction fournira des messages d’aide en reprenant une série d’instructions d’utilisation à l’écran. Chaque instruction doit être présentée comme une chaîne entourée de guillemets doubles. Vous remarquerez dans notre exemple ci-dessous que certaines des chaînes ont
ou
écrits à leur début ou à leur fin. Ce sont desescape characters qui fournissent des instructions spécifiques sur la manière dont la chaîne doit apparaître dans la sortie du script:
N'hésitez pas à ajouter tous les détails d'utilisation qui vous seraient utiles entre les accolades (n'oubliez pas de faire précéder toute chaîne deecho
). À des fins de démonstration, nous ajouterons les éléments suivants:
bkupscript.sh
echo "\n\n############################################"
echo "# bkupscript.sh #"
echo "############################################"
echo "\nThis script will backup files/folders into a single compressed file and will store it in the current folder."
echo "In order to work, this script needs the following three parameters in the listed order: "
echo "\t- The full path for the folder or file you want to backup."
echo "\t- The name of the Space where you want to store the backup at."
echo "\t- The name for the backup file (timestamp will be added to the beginning of the filename)\n"
echo "Example: sh bckupscript.sh ./testdir testSpace backupdata\n"<^>
La fonction finale deshowhelp
devrait ressembler à ceci:
bkupscript.sh
...
showhelp(
echo "\n\n############################################"
echo "# bkupscript.sh #"
echo "############################################"
echo "\nThis script will backup files/folders into a single compressed file and will store it in the current folder."
echo "In order to work, this script needs the following three parameters in the listed order: "
echo "\t- The full path for the folder or file you want to backup."
echo "\t- The name of the Space where you want to store the backup at."
echo "\t- The name for the backup file (timestamp will be added to the beginning of the filename)\n"
echo "Example: sh bckupscript.sh ./testdir testSpace backupdata\n"
}
Avec notre texte d'aide en place, nous pouvons passer à la collecte des fichiers que nous aimerions sauvegarder dans notre espace.
Rassembler des fichiers
Avant que notre script puisse transférer quoi que ce soit sur notre espace, il doit d'abord rassembler les bons fichiers et les regrouper dans un seul package à télécharger. Nous pouvons accomplir cela en utilisant l'utilitairetar
et une instruction conditionnelle. Comme nous utilisonstar
pour créer un fichier archive (parfois appelé fichier «zip»), nous appellerons cette fonctiontarandzip()
.
Commençons par déclarer la fonction et ajouter une autre commandeecho
pour indiquer aux utilisateurs que le script a commencé à collecter des fichiers:
bkupscript.sh
...
tarandzip(){
echo "\n##### Gathering files #####\n"
}
Sous la commandeecho
, nous pouvons ajouter une commandetar
qui fera le travail de collecte et de compression des fichiers dans un seul fichier de sortie.
bkupscript.sh
tarandzip(){
echo "\n##### Gathering files #####\n"
tar -czvf $GIVENNAME-$DATETIME.tar.gz $SRC
}
Vous remarquerez que cette commandetar
est appelée avec plusieurs options et variables:
-
c
: cet indicateur indique àtar
de compresser le fichier de sortie. -
z
: Ceci demande àtar
de compresser le fichier en utilisantgzip
. -
v
: cela signifie l'optionverbose
, qui demande àtar
d'afficher plus d'informations dans la sortie. -
f
: cet indicateur demande àtar
d'enregistrer le fichier avec le nom de fichier indiqué ensuite. -
$GIVENNAME-$DATETIME.tar.gz
: Le script appelle ces variables que nous avons déclarées au début afin de créer le nouveau nom de fichier. Il le fait en combinant les variables$GIVENNAME
et$DATETIME
et en ajoutant l'extension.tar.gz
à la fin pour former le nouveau nom de fichier. -
$SRC
: Cette variable représente les fichiers ou dossierssource que nous demandons àtar
de sauvegarder.
Cette fonction devrait maintenant être capable de faire ce que nous voulons, mais nous pouvons ajouter quelques appels de plus àecho
pour donner à l'utilisateur des informations supplémentaires sur le fonctionnement du script. Cela peut être fait en ajoutant quelques instructions conditionnelles, comme ceci:
bkupscript.sh
if tar -czvf $GIVENNAME-$DATETIME.tar.gz $SRC; then
echo "\n##### Done gathering files #####\n"
return 0
else
echo "\n##### Failed to gather files #####\n"
return 1
fi
Lorsque la clauseif
est appelée, elle exécutera la commandetar
et attendra le résultat. Si le résultat de la commande est positif (c'est-à-dire qu'elle s'est exécutée avec succès), les lignes entrethen
etelse
seront exécutées. Ceux-ci sont:
-
Faire écho à un message indiquant que le script a terminé avec succès le processus
tar
-
Renvoyer un code d'erreur de
0
pour que la partie du code qui invoque cette fonction sache que tout a fonctionné correctement.
La partieelse
de cette fonction ne sera exécutée que si la commandetar
trouve une erreur lors de l'exécution. Dans ce cas, la brancheelse
de la clause:
-
Écho un message indiquant que la commande
tar
a échoué -
Renvoie un code d'erreur de
1
, indiquant que quelque chose s'est mal passé
Enfin, nous terminons la clauseif/then/else
par unfi
, ce qui en langage bash signifie que la clauseif
est terminée.
La fonctiontarandzip()
terminée ressemblera à ceci:
bkupscript.sh
tarandzip(){
echo "\n##### Gathering files #####\n"
if tar -czvf $GIVENNAME-$DATETIME.tar.gz $SRC; then
echo "\n##### Done gathering files #####\n"
return 0
else
echo "\n##### Failed to gather files #####\n"
return 1
fi
}
Avec notre fonctiontarandzip()
en place, nous sommes prêts à configurer le script pour déplacer nos sauvegardes.
Transfert de fichiers vers un stockage d'objets
À ce stade, nous pouvons demander à notre script de sauvegarde de transférer un fichier vers notre espace en utilisant la commandes3cmd
. Comme avectarandzip
, nous pouvons aussiecho
quelques chaînes et utiliser une instructionif/then/else
pour tenir les utilisateurs au courant de la façon dont le script fonctionne pendant son exécution.
Nous allons d'abord déclarer notre fonction. Restons simple et nommez-lemovetoSpace()
:
bkupscript.sh
...
movetoSpace(){
}
Maintenant, nous pouvons utilisers3cmd
et les variables que nous avons déclarées précédemment pour construire la commande qui va pousser nos fichiers de sauvegarde dans notre espace:
bkupscript.sh
movetoSpace(){
~/s3cmd-2.0.1/s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST
}
Voici ce que chaque partie de cette commande signifie:
-
~/s3cmd-2.0.1/s3cmd
: Ceci appelles3cmd
, acommand line tool used for managing object storage buckets. -
put
: il s'agit d'une commande utilisée pars3cmd
pour télécharger des données dans un compartiment. -
$GIVENNAME-$DATETIME.tar.gz
: C'est le nom de la sauvegarde qui sera téléchargée sur notre espace. Il se compose des quatrième et première variables que nous avons déclarées, suivies de.tar.gz
, et est créé par la fonctiontarandzip()
précédemment. -
s3://$DST;
: C'est l'emplacement où nous voulons télécharger le fichier.s3://
est un schéma de type URI utilisé spécifiquement pour décrire les emplacements de stockage d'objets en ligne, tandis que$DST;
est la troisième variable que nous avons déclarée précédemment.
Nous avons maintenant une fonction qui permet de télécharger vos fichiers archivés dans notre espace. Cependant, il n’informe pas l’utilisateur de son statut. Modifions cela en faisant écho à une chaîne avant la commande pour que l’utilisateur sache qu’elle a été démarrée et, une fois la fonction terminée, pour nous indiquer si elle a abouti.
Commençons par informer l’utilisateur que le processus a commencé:
bkupscript.sh
movetoSpace(){
echo “\n##### MOVING TO SPACE #####\n”
~/s3cmd-2.0.1/s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST
}
Étant donné que la commande réussira ou échouera (ce qui signifie qu'elle téléchargera les fichiers dans notre espace ou non), nous pouvons indiquer aux utilisateurs si cela a fonctionné en faisant écho à l'une des deux chaînes contenues dans unif/then/else
déclaration, comme ceci:
bkupscript.sh
...
if ~/s3cmd-2.0.1/s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST; then
echo "\n##### Done moving files to s3://"$DST" #####\n"
return 0
else
echo "\n##### Failed to move files to the Space #####\n"
return 1
fi
Cette instruction conditionnelle dit à bash «Si notre commandes3cmd
fonctionne correctement, alors faites savoir à l'utilisateur que le script a terminé de déplacer des fichiers vers notre espace. Sinon, informez l'utilisateur que le processus a échoué. ”
Si le processuss3cmd
se termine avec succès, la fonction imprime un message à l'écran (la première chaîneecho
dans l'instructionthen
) l'indique et renvoie une valeur de0
, qui informe la fonction appelante que l'opération est terminée. Si le processus échoue, la clausethen
imprime simplement le message d'erreur (la deuxième chaîneecho
) et renvoie un1
pour que le reste du script sache qu'une erreur s'est produite.
Au total, la fonctionmovetoSpace()
devrait ressembler à ceci:
bkupscript.sh
movetoSpace(){
echo "\n##### MOVING TO SPACE #####\n"
if ~/s3cmd-2.0.1/s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST; then
echo "\n##### Done moving files to s3://"$DST" #####\n"
return 0
else
echo "\n##### Failed to move files to the Space #####\n"
return 1
fi
}
Avec la fonctionmovetoSpace()
écrite, nous pouvons passer à nous assurer que le script est configuré pour appeler les fonctions dans l'ordre attendu en utilisant des instructions conditionnelles pour le contrôle de flux.
Configuration du contrôle de flux
Bien que nous ayons configuré notre script avec des fonctions, nous n’avons pas fourni d’ordre pour que le script complète ces fonctions. À ce stade, nous pouvons introduire une fonction d’appel qui indiquera au reste du script comment et quand exécuter les autres fonctions que nous avons écrites.
En supposant que tout a été configuré correctement, lorsque nous exécutons le script, il doit lire la commande d'entrée, en attribuer les valeurs à chaque variable, exécuter la fonctiontarandzip()
, et suivre cela avec la fonctionmovetoSpace()
. Si le script échoue entre l'un de ces points, il doit imprimer la sortie de notre fonctionshowhelp()
pour aider les utilisateurs à résoudre les problèmes. Nous pouvons commander ceci et attraper les erreurs en ajoutant une série d'instructionsif/then/else
au bas du fichier:
bkupscript.sh
...
if [ ! -z "$GIVENNAME" ]; then
if tarandzip; then
movetoSpace
else
showhelp
fi
else
showhelp
fi
La première instructionif
de la section ci-dessus vérifie que la troisième variable transmise n'est pas vide. Cela se fait de la manière suivante:
-
[ ]
: les crochets indiquent que ce qui se trouve entre eux est untest. Dans ce cas, le test consiste à vérifier qu'une variable spécifique n'est pas vide. -
!
: Dans ce cas, ce symbole signifienot
. -
-z
: cette option indique unempty string. Donc, combiné avec les!, nous demandons desnot an empty string. -
$GIVENNAME
: Nous indiquons ici que la chaîne que nous ne voulons pas être vide est la valeur affectée à la variable$GIVENNAME
. La raison pour laquelle nous avons choisi cette approche est que la valeur transmise par le troisième paramètre est attribuée à cette variable lors de l'appel du script à partir de la ligne de commande. Si nous transmettons moins de 3 paramètres au script, le code n'aura pas de troisième paramètre pour attribuer la valeur à$GIVENNAME, il affectera donc une chaîne vide et ce test échouera.
En supposant que ce premier test réussit, il passera ensuite à l'instructionif
suivante et ainsi de suite. Si l'une des instructionsif
renvoie une erreur, la clausethen
appellera la fonctionshowhelp
et un texte d'aide sera affiché dans la sortie. Cela permet essentiellement de réunir toutes les fonctions précédentes que nous avons écrites et de fournir à bash les informations nécessaires pour les exécuter dans le bon ordre.
Notre script est maintenant complet! Vous pouvez vérifier que votre script ressemble au script complet que nous avons créé dans la section ci-dessous.
Le script complet
Le script de sauvegarde terminé que nous avons créé devrait ressembler à ceci:
bkupscript.sh
#!/bin/bash
DATETIME=`date +%y%m%d-%H_%M_%S`
SRC=$1
DST=$2
GIVENNAME=$3
showhelp(){
echo "\n\n############################################"
echo "# bkupscript.sh #"
echo "############################################"
echo "\nThis script will backup files/folders into a single compressed file and will store it in the current folder."
echo "In order to work, this script needs the following three parameters in the listed order: "
echo "\t- The full path for the folder or file you want to backup."
echo "\t- The name of the Space where you want to store the backup at (not the url, just the name)."
echo "\t- The name for the backup file (timestamp will be added to the beginning of the filename)\n"
echo "Example: sh bkupscript.sh ./testdir testSpace backupdata\n"
}
tarandzip(){
echo "\n##### Gathering files #####\n"
if tar -czvf $GIVENNAME-$DATETIME.tar.gz $SRC; then
echo "\n##### Done gathering files #####\n"
return 0
else
echo "\n##### Failed to gather files #####\n"
return 1
fi
}
movetoSpace(){
echo "\n##### MOVING TO SPACE #####\n"
if ~/s3cmd-2.0.1/s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST; then
echo "\n##### Done moving files to s3://"$DST" #####\n"
return 0
else
echo "\n##### Failed to move files to the Space #####\n"
return 1
fi
}
if [ ! -z "$GIVENNAME" ]; then
if tarandzip; then
movetoSpace
else
showhelp
fi
else
showhelp
fi
Une fois que vous avez vérifié votre script, assurez-vous de sauvegarder et de fermer le fichier (CTRL-x
,y
, puisENTER
) avant de quitter nano.
Test du script
Maintenant que nous avons fini de construire le script, nous pouvons maintenant le tester. Non seulement cela nous dira si nous avons écrit le script correctement, mais cela nous donnera également l'occasion de nous entraîner à utiliser le script et de le voir en action.
Lorsque vous testez un script comme celui-ci, il est généralement préférable d’utiliser des fichiers factices. Bien que nous sachions qu’il n’est pas capable de détruire ou de supprimer des données, il est judicieux de le faire en toute sécurité en le testant avec des fichiers sans importance. Nous allons d'abord créer un répertoire à l'aide de la commandemkdir
:
mkdir backupthis
Ensuite, nous allons créer deux fichiers vides dans ce répertoire en utilisanttouch
:
sudo touch backupthis/file1.txt
sudo touch backupthis/file2.txt
Nous pouvons maintenant tester le script en téléchargeant le répertoirebackupthis
et son contenu dans notre espace. C'est le format que nous devrons utiliser pour appeler le script:
sh bkupscript.sh ./backupthis name_of_your_space testrun
[.Remarque]##
Note Étant donné que la fonctionmovetoSpace()
ajoute automatiquements3://
à la variable de destination (c'est-à-dire le nom de votre espace), cette variable doit simplement être le nom de votre espace et non son URL complète. Par exemple, si l'URL de votre espace est "https: //example-space-name.nyc3.digitaloceanspaces.com", vous écrirez la commande de test comme ceci:
sh bkupscript.sh ./backupthis example-space-name testrun
La commande ci-dessus mettra le script en mouvement et vous devriez voir une sortie comme ceci:
Output
##### Gathering files #####
./backupthis/
./backupthis/file1.txt
./backupthis/file2.txt
##### Done gathering files #####
##### MOVING TO SPACE #####
upload: 'testrun-180119-15_09_36.tar.gz' -> 's3://name_of_your_space /testrun-180119-15_09_36.tar.gz' [1 of 1]
162 of 162 100% in 8s 19.81 B/s done
##### Done moving files to s3://name_of_your_space #####
Si vous rencontrez des erreurs, veuillez revoir votre script pour vous assurer qu'il correspond à notre exemple. Assurez-vous également que votre installation des3cmd
a été correctement configurée et que la clé d'accès et la clé secrète que vous utilisez sont correctes.
Automatiser les sauvegardes avec Crontab
Après avoir testé avec succès le script de sauvegarde, nous pouvons configurer un travailcron
qui utilisera le script pour effectuer des sauvegardes régulières sur notre espace. Pour les besoins de ce tutoriel, nous allons le configurer pour exécuter notre script de sauvegardes toutes les minutes.
Premièrement, nous devons rendre le script exécutable:
chmod +x bkupscript.sh
Maintenant que le script peut être exécuté en tant que commande, nous pouvons éditer le fichiercrontab
pour exécuter le script toutes les minutes:
crontab -e
La première fois que vous exécutezcrontab -e
, il vous demandera de sélectionner un éditeur dans une liste:
no crontab for root - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/ed
2. /bin/nano <---- easiest
3. /usr/bin/vim.basic
4. /usr/bin/vim.tiny
Choose 1-4 [2]:
Vous pouvez sélectionner le nano par défaut ou un autre éditeur de texte de votre choix.
Une fois danscrontab
, nous ajouterons la ligne suivante en bas des valeurs qui y sont déjà:
/tmp/crontab.example/crontab
* * * * * ~/bkupscript.sh ~/backupthis nameofyourspace cronupload
Pour enregistrer les modifications, appuyez surCTRL-x
, puis sury
, puis surENTER
.
Après environ une minute, vous verrez un nouveau fichier dans le tableau de bord de votre espace!
Si vous laissez le travail decron
en cours d'exécution sans apporter de modifications, un nouveau fichier sera copié dans votre espace toutes les minutes. Une fois que vous avez confirmé quecron
s'exécute avec succès, n'hésitez pas à reconfigurercrontab
pour sauvegarder vos fichiers à l'intervalle souhaité.
Vous avez maintenant un script qui compresse et expédie périodiquement vos sauvegardes dans un espace DigitalOcean!
Conclusion
Dans ce didacticiel, nous avons expliqué comment créer des sauvegardes hors site régulièrement planifiées de vos fichiers importants à l'aide d'un script bash, decrontab
et d'espaces DigitalOcean. Bien que le script présenté dans ce didacticiel ne soit destiné qu'à des fins de démonstration, il peut être utilisé comme base pour créer une version prête pour la production qui pourrait ultérieurement être intégrée à une solution CI / CD commeJenkins,Drone ouTravis CI.
Si vous souhaitez en savoir plus sur les outils CI / CD, vous pouvez le faire en lisant les tutoriels suivants: