Création — Nicolas THOREZ 2021/08/24 12:25
Proxmox Backup Server (PBS) permet de centraliser les sauvegardes, gérer les rétentions, sauvegarder et restaurer des machines au niveau fichier, vérifier les sauvegardes, etc…
La sauvegarde de VM est assez simple à mettre en place lorsqu'on a déjà vu cette fonctionnalité sous PVE. Pour PBS, il faut :
Les sauvegardes apparaîtront alors dans PBS est pourront être gérées depuis là.
PBS_PASSWORD='P@ssW0rd'
PBS_FINGERPRINT='42:40:d4:25:a0:ed:c7:05:bf:c4:62:a7:e5:98:a6:4d:ff:82:aa:3e:37:3f:c2:92:0d:f2:8a:77:49:b5:dd:ef'
PBS_ADDRESS="1.2.3.4"
PBS_STORAGE="backup"
export PBS_FINGERPRINT
export PBS_PASSWORD
proxmox-backup-client login --repository root@pam@${PBS_ADDRESS}:${PBS_STORAGE}
PBS_ADDRESS="1.2.3.4"
PBS_STORAGE="backup"
PATH_TO_BACKUP="/"
proxmox-backup-client backup $HOSTNAME.pxar:${PATH_TO_BACKUP} --repository root@pam@${PBS_ADDRESS}:${PBS_STORAGE}
pbs-backup.sh :
#!/bin/bash
#######################################################
# #
# Script de sauvegarde de serveur via agent Proxmox #
# Par Nicolas THOREZ #
# #
#######################################################
#==========================#
# Définition des variables #
#==========================#
# Utilisateur par défaut
DEFAULT_PBS_USER="root@pam"
# Chemin du client
PBSCLIENT="/usr/bin/proxmox-backup-client"
# Chemin à sauvegarder par défaut
DEFAULT_PATH_TO_BACKUP="/"
# Regex pour l'empreinte
REGEX_FINGERPRINT="^([0-9a-f]{2}:){31}[0-9a-f]{2}$"
# Regex pour l'adresse
REGEX_ADDRESS="^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"
#==========================#
# Définition des fonctions #
#==========================#
# Fonction d'affichage de l'aide
display-help()
{
echo "Script de sauvegarde de serveur via agent Proxmox"
echo ""
echo "Usage : pbs-backup.sh [-u|--user] utilisateur [-p|--password] mot de passe"
echo " [-a|--address] adresse du serveur [-r|--repository] dépôt de sauvegarde"
echo " [-b|--backup] dossier à sauvegarder [-f|--fingerprint] empreinte du serveur"
echo " [-h|--help]"
echo ""
echo "Paramètres et arguments :"
echo ""
echo "-h, --help Affiche cette aide."
echo ""
echo "-u, --user Utilisateur autorisé sur le serveur PBS."
echo " Par défaut, l'utilisateur 'root@pam' est utilisé."
echo ""
echo "-p, --password Mot de passe pour l'utilisateur donnée."
echo " Si aucun mot de passe n'est fourni, il en sera demander un."
echo ""
echo "-a, --address Adresse du serveur PBS."
echo ""
echo "-r, --repository Dossier de stockage où sera déposé la sauvegarde."
echo ""
echo "-b, --backup Dossier à sauvegarder."
echo " Par défaut, le dossier sera la racine."
echo ""
echo "-f, --fingerprint Empreinte du certificat du serveur PBS."
echo ""
exit 2
}
# Fonction de collecte du mot de passe
get-password()
{
read -p "Veuillez saisir le mot de passe : " -s PASS
if [ -z "$PASS" ]
then
echo "CRIT - Le mot de passe est obligatoire"
exit 2
else
echo $PASS
fi
}
#=====================#
# Gestion des entrées #
#=====================#
while [[ $# -gt 0 ]]
do
PARAM="$1"
case $PARAM in
# aide
"-h"|"--help")
display-help
shift
;;
# Utilisateur
"-u"|"--user")
PBS_USER="$2"
shift
shift
;;
# Mot de passe
"-p"|"--password")
case $2 in
"-h"|"--help"|"-u"|"--user"|"-p"|"--password"|"-a"|"--address"|"-r"|"--repository"|"-b"|"--backup"|"-f"|"--fingerprint")
PBS_PASSWORD=$(get-password)
echo ""
shift
;;
*)
PBS_PASSWORD="$2"
shift
shift
;;
esac
;;
# Adresse
"-a"|"--address")
PBS_ADDRESS="$2"
shift
shift
;;
# Dépôt de sauvegarde
"-r"|"--repository")
PBS_REPOSITORY="$2"
shift
shift
;;
# Chemin à sauvegarder
"-b"|"--backup")
PATH_TO_BACKUP="$2"
shift
shift
;;
# Empreinte
"-f"|"--fingerprint")
PBS_FINGERPRINT="$2"
shift
shift
;;
# Autre
*)
display-help
shift
;;
esac
done
#==========================#
# Vérification des entrées #
#==========================#
# Utilisateur
if [ -z "$PBS_USER" ]
then
PBS_USER="$DEFAULT_PBS_USER"
fi
# Mot de passe
if [ -z "$PBS_PASSWORD" ]
then
PBS_PASSWORD=$(get-password)
echo ""
fi
# Adresse
if [[ ! $PBS_ADDRESS =~ $REGEX_ADDRESS ]]
then
echo "CRIT - L'adresse donnée est invalide."
exit 2
fi
# Dépôt de sauvegarde
if [ -z "$PBS_REPOSITORY" ]
then
echo "CRIT - Le dépôt de sauvegarde est invalide."
exit 2
fi
# Chemin à sauvegarder
if [ -z "$PATH_TO_BACKUP" ]
then
PATH_TO_BACKUP="$DEFAULT_PATH_TO_BACKUP"
else
if [ ! -d "$PATH_TO_BACKUP" ]
then
echo "CRIT - Le chemin donnée n'est par un dossier valide"
exit 2
fi
fi
# Empreinte
if [[ ! $PBS_FINGERPRINT =~ $REGEX_FINGERPRINT ]]
then
echo "CRIT - L'empreinte donnée n'est pas valide"
fi
#============#
# Traitement #
#============#
# Demande de token
export PBS_FINGERPRINT
export PBS_PASSWORD
$PBSCLIENT login --repository ${PBS_USER}@${PBS_ADDRESS}:${PBS_REPOSITORY}
# Mise en forme du nom de la sauvegarde
PATH_NAME="$(echo $PATH_TO_BACKUP | sed 's;/;-;g')"
if [ "${PATH_NAME: -1}" == "-" ]
then
PATH_NAME="${PATH_NAME:: -1}"
fi
# Sauvegarde
$PBSCLIENT backup ${HOSTNAME}${PATH_NAME}.pxar:${PATH_TO_BACKUP} --repository ${PBS_USER}@${PBS_ADDRESS}:${PBS_REPOSITORY}
# Tâche de sauvegarde 0 1 * * * root /usr/local/batch/pbs-backup.sh -u nekan@pve -p P@ssW0rd -a 1.2.3.4 -r backup -b / -f "42:40:d4:25:a0:ed:c7:05:bf:c4:62:a7:e5:98:a6:4d:ff:82:aa:3e:37:3f:c2:92:0d:f2:8a:77:49:b5:dd:ef"
~/.config/proxmox-backup/encryption-key.json et cette dernier est protégée par un mot de passe. Il est possible de spécifier un autre chemin en indiquant ce dernier après la commande create. Il est aussi possible d'ignorer la protection par mot de passe en ajoutant –kdf none à la commande :
proxmox-backup-client key create
–keyfile et pour éviter d'avoir a entrer le mot de passe de la clé si cette dernière est protégée, on peut définir et exporter la variable PBS_ENCRYPTION_PASSWORD avant de lancer la sauvegarde.
Au travers de l'interface de PBS, nous pouvons gérer la manière dont les sauvegardes sont conservées. Ainsi dans le menu correspondant à notre datastore (ici backup), onglet Délestage et GC; il est possible de définir :
La vérification des sauvegardes permet de valider leurs intégrités. Pour ce faire, toujours au niveau de l'interface de PBS, dans le menu correspondant à notre datastore (ici backup), onglet Verify Jobs, on cliquer sur Ajouter pour créer un tâche planifiée qui vérifiera l'intégrité des sauvegardes présentes dans le datastore :