Création de Snapshot automatique
Par Romain Tiennot le vendredi 21 octobre 2011, 08:50 - VMware - Lien permanent
J’ai conçu un script permettant d’effectuer des snapshots en se basant sur un fichier nommé « listSnapshot » ou il est indiqué les noms des machines virtuelles. De plus, il créé un fichier de log qui sera automatiquement envoyé par email. On peut y voir l’état des machines virtuelles, l’ID des machines virtuelles et si le snapshot s’est fait correctement.
Dans mon cas, le script va :
- Lire le fichier texte nommé listSnapshot
- Indiquer les l'ID des machines à sauvegarder dans un répertoire "vms_list" dans "/tmp"
- L'etat de la machines virtuelles
- Créer un fichier de log
- Envoi le fichier de log par email
Dans un premier temps, il faut transferer gràce à WinSCP le fichier "snapshot.sh" dans le répertoire :"/vmfs/volumes/<datastore1>/" puis le rendre exécutable en SSH : (pour activer le SSH, vous pouvez consulter mon article))
chmod +x snapshot.sh
Ensuite, il faut créer le fichier "listSnapshot" avec la commande :
vi listSnapshot
Indiquer le nom des machinves virtuelles sous la forme suivante :
VM01 VM02 VM03
Sauvegarder et quitter gràce à ":wq".
Pour effectuer la sauvegarde, il faut saisir la commande suivante en SSH :
./sauvegarde.sh
Pour automatiser l’execution des scripts, il existe sous linux « Cron » qui est l’equivalent des taches planifié sous Windows. Sous Esxi, le fichier de configuration se trouve « /var/spool/cron/crontabs/root ». J’ai rajouté deux lignes à la suite indiquant : Executer le script « snapshot.sh » en tenant compte du fichier « listSnapshot » du Lundi au Vendredi à 22h01
0 20 * * 1-4 /vmfs/volumes/4d2aed1f-7a700542-ecbc-00237d9db922/snapshot.sh
Pour que le fichier de configuration cron soit pris en compte, il faut redemarrer le service avec les commandes suivante :
Kill $(cat /vaar/run/crond.pid)
Busybox crond
Attention, lors du prochain redemarrage, le fichier de configuration cron sera reinitialisé. Pour eviter de perdre la configuration, j’ai rajouté dans le script de demarrage du serveur quatre ligne qui rajoutera automatiquement les lignes de configuration dans le fichier cron et redemarrera le service :
/bin/kill $(cat /var/run/crond.pid)
/bin/echo "0 20 * * 1-4 /vmfs/volumes/4d2aed1f-7a700542-ecbc-00237d9db922/snapshot.sh" >> /var/spool/cron/crontabs/root
/bin/busybox crond
#!/bin/sh ############################################################################# # Debut du fichier de log # ############################################################################# export jour=$(date '+%A %d %B %Y') export log=$(date +%D) export log2=$(date '+%d%m%y') export heure=$(($(date +%H)+2)) export minute=$(date '+%M:%S') echo -en "HELO ESXI\n" >> /tmp/snap_$log2 echo -en "MAIL FROM: <ESXI@tiennot.fr>\n" >> /tmp/snap_$log2 echo -en "RCPT TO: <romain@tiennot.fr>\n" >> /tmp/snap_$log2 echo -en "RCPT TO: <admin@tiennot.fr>\n" >> /tmp/snap_$log2 echo -en "DATA\n" >> /tmp/snap_$log2 echo -en "From: ESXI@tiennot.fr\n" >> /tmp/snap_$log2 echo -en "To: romain@tiennot.fr\n" >> /tmp/snap_$log2 echo -en "To: admin@tiennot.fr\n" >> /tmp/snap_$log2 echo -en "Subject: ESXI - " >> /tmp/snap_$log2 echo -en $jour" - "$heure":"$minute >> /tmp/snap_$log2 echo -en "\n" >> /tmp/snap_$log2 echo -en "\n" >> /tmp/snap_$log2 echo -en "############################## Début du SCRIPT ##############################\n" >> /tmp/snap_$log2 ############################################################################# # Boucle fichier - Création du snapshot # ############################################################################# #création de la variable du chemin vim-cmd export VMWARE_CMD=/bin/vim-cmd ${VMWARE_CMD} vmsvc/getallvms | sed 's/[[:blank:]]\{3,\}/ /g' | awk -F' ' '{print "\""$1"\";\""$2"\";\""$3"\""}' | sed 's/\] /\]\";\"/g' | sed '1,1d' > /tmp/vms_list #debut de la boucle qui lit ligne par ligne while read line do export jour=$(date '+%A %d %B %Y') export log=$(date +%D) export log2=$(date '+%d%m%y') export heure=$(($(date +%H)+2)) export minute=$(date '+%M:%S') NUM_VM=$((NUM_VM + 1)) echo -en "--------------------------------- "$NUM_VM". "$line" -------------------------------\n" >> /tmp/snap_$log2 #affiche ce qu'il y a ecrit sur la ligne:nom de la machine virtuelle echo -en $log" - "$heure":$(date '+%M:%S') || info : Nom de la machine Virtuelle : "$line".\n" >> /tmp/snap_$log2 #cherche l'ID de la machine virtuelle ${VMWARE_CMD} vmsvc/getallvms | sed 's/[[:blank:]]{3,}/ /g' | awk -F' ' '{}' | sed 's/] /]";"/g' | sed '1,1d' #création de la variable de l'ID de la machine virtuelle export VM_ID=`grep -E ""${line}"" /tmp/vms_list | awk -F ";" '{print $1}' | sed 's/"//g'` if [[ "${VM_ID}" = "" ]]; then echo -en $log" - "$heure":$(date '+%M:%S') || info : ERREUR, "$line" n'existe pas.\n" >> /tmp/snap_$log2 echo -en "\n" >> /tmp/snap_$log2 continue fi #affiche l'ID de la machine virtuelle echo -en $log" - "$heure":$(date '+%M:%S') || info : ID de la machine Virtuelle : "$VM_ID".\n" >> /tmp/snap_$log2 #création de la variable du Status de la machine virtuelle ORGINAL_VM_POWER_STATE=$(${VMWARE_CMD} vmsvc/power.getstate ${VM_ID} | tail -1) #affiche le status de la machine virtuelle if [[ "${ORGINAL_VM_POWER_STATE}" = "Powered off" ]]; then VM_ETAT="Eteint" fi if [[ "${ORGINAL_VM_POWER_STATE}" = "Powered on" ]]; then VM_ETAT="Allumé" fi if [[ "${ORGINAL_VM_POWER_STATE}" = "Suspended" ]]; then VM_ETAT="Suspendu" fi echo -en $log" - "$heure":$(date '+%M:%S') || info : Etat de la machine Virtuelle : "$VM_ETAT".\n" >> /tmp/snap_$log2 NOM_SNAP="ESXI_"$line"_"$(date +%D) echo -en $log" - "$heure":$(date '+%M:%S') || info : Création du Snapshot "$NOM_SNAP" pour "$line".\n" >> /tmp/snap_$log2 ${VMWARE_CMD} vmsvc/snapshot.create ${VM_ID} "${NOM_SNAP}" "${NOM_SNAP}" > /dev/null 2>&1 echo -en $log" - "$heure":$(date '+%M:%S') || debug : Merci de patienter durant la création du snapshot : "$NOM_SNAP".\n" >> /tmp/snap_$log2 echo -en $log" - "$heure":$(date '+%M:%S') || debug : Succès, le snapshot a été créé.\n" >> /tmp/snap_$log2 echo -en "\n" >> /tmp/snap_$log2 done < "/vmfs/volumes/4d27644c-244cadc9-7b49-000c297ad13c/listSnapshot" ############################################################################# # Fin du fichier de log # ############################################################################# echo -en "\n" >> /tmp/snap_$log2 echo -en "############################## Fin du SCRIPT ##############################\n" >> /tmp/snap_$log2 echo -en "\n" >> /tmp/snap_$log2 echo -en "\n" >> /tmp/snap_$log2 echo -en "." >> /tmp/snap_$log2 "/usr/bin/nc" "SERVEUR_SMTP" "25" < "/tmp/snap_$log2"
Voici la vidéo :
A bientôt, Romain
Il y a 11 commentaires
Salut,
Je trouve bien fichu ton tuto. J'ai par contre un petit problème avec la crontab de mon esxi.
Je kill le service crond, puis après je le réactive avec /bin/busybox crond mais je le ne vois pas dans la liste des processus (ps | grep busy ou ps | grep cron).
Je ne comprends pas d'où vient le problème. Tu aurais une idée de ton côté?
Merci,
Bonjour,
Ce n'est pas très grave. Est-ce-que ta tache se lance ?
Sinon, essaye de redémarrer ton ESXi et ça solutionnera ton problème.
Romain
Bonjour,
Non ma tache ne se lance pas en plus...
Pour le redémarrage de l'ESXi, faut que je le prévois à l'avance, j'ai quelques VM dessus
Il y a un moyen de vérifier que les scripts auto_backup.sh de vmware est bien lancé par le cron?
Dans les syslog peut-être.
Merci,
Merci,
Bonjour,
Peux-tu m'envoyer ce que tu rajoute dans le cron?
Romain
Super tuto, je l'utilise pour esxi5.
Je me demandais si c'etait possible de mettre les snapshot ailleurs, par exemple un share samba ou un dd externe!
Merci
Bonjour,
Vous pouvez monter un partage SMB mais je ne suis pas sur la possibilité de déplacer les snapshots...
Si vous y arrivez, dite le moi
Romain
Hello,
Super tuto, je l'utilise également pour esxi5.
J'ai juste une petite question, je planifie un snapshot auto de mes VM 1 fois par mois mais je souhaiterais supprimer le précédent crée avant de relancé le nouveau.
J'ai vu que tu a lancé un script pour les supprimer, quelle en ai le contenu ?
Merci,
Bonjour,
Effectivement, j'ai un script pour supprimer les snapshots :
export VMWARE_CMD=/bin/vim-cmd
${VMWARE_CMD} vmsvc/getallvms | sed 's/[[:blank:]]\{3,\}/ /g' | awk -F' ' '{print "\""$1"\";\""$2"\";\""$3"\""}' | sed 's/\] /\]\";\"/g' | sed '1,1d' > /tmp/vms_list
while read line
do
echo "VM_NAME: $line"
# get VM_ID
${VMWARE_CMD} vmsvc/getallvms | sed 's/[[:blank:]]{3,}/ /g' | awk -F' ' '{}' | sed 's/] /]";"/g' | sed '1,1d'
export VM_ID=`grep -E ""${line}"" /tmp/vms_list | awk -F ";" '{print $1}' | sed 's/"//g'`
echo "VM_ID: $VM_ID"
${VMWARE_CMD} vmsvc/snapshot.removeall $VM_ID
echo "--------------------"
done < listSauvegarde
Bonjour,
Super tuto merci.
2 questions :
-Dans le fichier de conf « /var/spool/cron/crontabs/root » tu as rajouté 2 lignes ? Je ne vois pas lesquelles.
-Dans le script de démarrage du serveur quatre lignes,
ou se trouve le script de démarrage et quelles sont les 4 lignes ? J'ai pas très bien compris.
D'avance merci de ton aide.
Bonjour,
Je rajoute dans le crontab les lignes permettant d'executer mon script :
Une fois que tu redemarre ton serveur, il va supprimer ce qu'il y a dans le crontab. C'est pour cela qu'il faut dire au serveur après avoir demarré d'ajouter les lignes dans le crontab.
Je ne me souviens plus exactement ou se trouve le script qui demarre les services après le redemarrage du serveur mais ca doit etre dans /ect/rc.local je penses.
Romain
The iPhone has Wi-Fi and cellular on the web connectivity (2G, 3G, 4G, and LTE). To gain those after android applications, there are typically actually screenshots but infrequently short movies illustrating how this type of apps or contests work. http://www.moviesafar.com/z4root.ht... z4root