esxi_4.1.jpg
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