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