Advertisement
Guest User

Untitled

a guest
May 24th, 2017
573
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 25.39 KB | None | 0 0
  1. ########################################################################################
  2. # #
  3. # Script de sauvegarde des Machines virtuelles pour VmWare ESXi 4 #
  4. # 2010, Alter Systems #
  5. # Vincent Magnin - vincent.magnin@gmail.com #
  6. # #
  7. ########################################################################################
  8.  
  9.  
  10.  
  11. ########################################################################################
  12. # #
  13. # I - Variables de configuration du script #
  14. # #
  15. ########################################################################################
  16.  
  17. #!!!!! NE JAMAIS METTRE "/" A LA FIN DU CHEMIN DUN DOSSIER
  18.  
  19.  
  20. # Dossier des fichiers de logs du script
  21. LOG_FILE_DIRECTORY=/opt/Sauvegardes_ESXi
  22.  
  23. # Envoi sur nas des fichiers Logs
  24. NFS_LOGS_DIR=/vmfs/volumes/VM_Client/Scripts/Logs/Sauvegardes_VMs
  25. FULL_LOGS_DIR=/`hostname -s`/Detail
  26.  
  27. # Repertoire de sauvegarde (chemin local pour ESXi)
  28. # ! Le script de réplication ne marchera plus car il dépend du niveau dans larborescence de cette variable !
  29. # ! Changer ce dossier est simple s'il conserve les 3 niveaux, sinon il faudra modifier le script de réplication !
  30. # ! pour le tri : awk -F "/" {print $5} !
  31. VM_BACKUP_VOLUME=/vmfs/volumes/VM_Client/Sauvegardes_VMs
  32.  
  33. # Utiliser le système VmWare de découpage des VM en fichiers de 2Go ? 1=oui, 0=non
  34. ENABLE_2GB_SPARSE=0
  35.  
  36. # Nombre de sauvegardes que lon souhaite conserver
  37. VM_BACKUP_ROTATION_COUNT=1
  38.  
  39. # Tenter une extinction par le systeme des machines virtuelles en cours de fonctionnement
  40. # (1 - oui , 0 -non)
  41. #
  42. # !!! ATTENTION !!!
  43. # !!! Cette fonctionnalité recquiert que les VmWare Tools soient installés sur le système virtuel
  44. POWER_VM_DOWN_BEFORE_BACKUP=0
  45.  
  46. # Autoriser l'extinction "brutale" ( 1- oui, 0- non)
  47. ENABLE_HARD_POWER_OFF=0
  48.  
  49. # Cette option permet de décider ce qu'on doit faire des VMs quand la sauvegarde est achevée (il faut avoir activé l'option POWER_VM_DOWN_BEFORE_BACKUP)
  50. # 0 - On remet la VM dans l'état dans lequel elle était lorsqu'on a lancé le script
  51. # 1 - On redémarre toutes les VMs sauvegardées
  52. # 2 - On ne redémarre pas les VMs sauvegardées
  53. VM_STATE_AFTER_BACKUP=0
  54.  
  55. # Si l'extinction "brutale" est activée, cette variable va representer le compteur d'attente de l'extinction de l'OS
  56. # avant de forcer la fermeture de la machine.
  57. # Ce nombre sera multiplié par 3 secondes, donc si on met 4, le script attendra 12secondes que l'OS s'eteigne lui-même
  58. # avant d'éteindre la machine.
  59. ITER_TO_WAIT_SHUTDOWN=40
  60.  
  61.  
  62.  
  63.  
  64. ########################################################################################
  65. # #
  66. # II - Fonction "logs" qui gère les fichiers de logs du script #
  67. # #
  68. ########################################################################################
  69.  
  70. logs() {
  71. # On récupère le mois en cours et on le traduit en français
  72. MONTH_NUMBER=`date +%m`
  73. case $MONTH_NUMBER in
  74. 01) MONTH=JANVIER;;
  75. 02) MONTH=FEVRIER;;
  76. 03) MONTH=MARS;;
  77. 04) MONTH=AVRIL;;
  78. 05) MONTH=MAI;;
  79. 06) MONTH=JUIN;;
  80. 07) MONTH=JUILLET;;
  81. 08) MONTH=AOUT;;
  82. 09) MONTH=SEPTEMBRE;;
  83. 10) MONTH=OCTOBRE;;
  84. 11) MONTH=NOVEMBRE;;
  85. 12) MONTH=DECEMBRE;;
  86. esac
  87.  
  88. # On crée le dossier de stockage des fichiers de log
  89. mkdir -p ${LOG_FILE_DIRECTORY}
  90. LOG_FILE_NAME=Sauvegarde_VMs_${MONTH}.wri
  91. LOG_FILE=${LOG_FILE_DIRECTORY}/${LOG_FILE_NAME}
  92.  
  93. # On teste si le fichier de logs précedent est encore présent
  94. if [ -e ${LOG_FILE} ]; then
  95. rm ${LOG_FILE}
  96. fi
  97.  
  98. # On le recrée
  99. touch ${LOG_FILE}
  100.  
  101. # On prépare le fichier de résultats
  102. RESULT_FILE_NAME=RESULTAT_sauvegarde_`hostname -s`_`date +%d-%m-%Y`.wri
  103. RESULT_FILE=${LOG_FILE_DIRECTORY}/${RESULT_FILE_NAME}
  104.  
  105. # On teste si le fichier de resultat précédent est encore présent
  106. if [ -e ${RESULT_FILE} ]; then
  107. rm ${RESULT_FILE}
  108. fi
  109.  
  110. # On le recrée
  111. touch ${RESULT_FILE}
  112. }
  113.  
  114.  
  115.  
  116.  
  117. ########################################################################################
  118. # #
  119. # III - Fonction "syntaxe" qui vérifie si le script est correctement execute #
  120. # #
  121. ########################################################################################
  122.  
  123. syntaxe() {
  124. # On a passé en paramètre le nombre d'arguments
  125. NUM_OF_ARGS=$1
  126. # On appele la fonction logs pour créer le fichier de log
  127. logs
  128. # On vérifie qu'il y a bien le bon nombre d'arguments
  129. if [ ! ${NUM_OF_ARGS} == 1 ]; then
  130. aide
  131. fi
  132.  
  133. # On vérifie si l'on est sous ESX ou ESXi
  134. if [ -f /usr/bin/vmware-vim-cmd ]; then
  135. VMWARE_CMD=/usr/bin/vmware-vim-cmd
  136. elif [ -f /bin/vim-cmd ]; then
  137. VMWARE_CMD=/bin/vim-cmd
  138. else
  139. echo "Ce script ne fonctionne que sous VmWare ESX et ESXi !"
  140. echo "Erreur Fatale, arrêt du script : Doit être executé sous VmWare ESX(i)"
  141. exit
  142. fi
  143.  
  144. # On teste la validité du fichier de VMs passé en paramètre
  145. if [ ! -f ${FILE_INPUT} ]; then
  146. echo "Erreur : Le fichier de liste de VMs est invalide"
  147. echo -e "Erreur Fatale, arrêt du script: ${FILE_INPUT} est un fichier non valide !" >> $LOG_FILE
  148. aide
  149. fi
  150.  
  151. # On vérifie que le script dispose bien des droits suffisants
  152. if [ ! "`whoami`" == "root" ]; then
  153. echo "Ce script doit etre execute par \"root\"!"
  154. echo "Erreur Fatale, arrêt du script : Doit impérativement être executé par root" >> $LOG_FILE
  155. exit 1
  156. fi
  157.  
  158. # On prépare les variables du jour et du mois pour le fichier de log de la baie
  159. TODAY_MONTH=`date +%b`
  160. TODAY_DAY=`date +%-d`
  161.  
  162. }
  163.  
  164.  
  165.  
  166.  
  167. ########################################################################################
  168. # #
  169. # IV - Fonction "aide" qui affiche la commande a lancer pour utiliser le script #
  170. # #
  171. ########################################################################################
  172.  
  173. aide() {
  174. # On récupère le chemin du script pour afficher l'aide d'utilisation
  175. SCRIPT_PATH=$(basename $0)
  176. echo -e "Utilisation: ${SCRIPT_PATH} [VM_FILE_INPUT]"
  177. echo "ERREUR DE SYNTAXE! Utilisation du script : ${SCRIPT_PATH} [VM_FILE_INPUT]" >> $LOG_FILE
  178. exit
  179. }
  180.  
  181.  
  182.  
  183.  
  184. ##########################################################################################
  185. # #
  186. # V - Fonction "dossiersvms" qui gère les dossiers de sauvegarde #
  187. # quotidienne des VMs #
  188. # #
  189. ##########################################################################################
  190.  
  191. dossiersvms() {
  192. # On récupère le chemin du dossier de sauvegarde de la VM et le chemin direct complet correspondant
  193. # à la sauvegarde en cours (avec le sous dossier contenant la date)
  194. local VM_BACKUPs_DIR=$1
  195. local CURRENT_BACKUP_VM_BACKUP_DIR=$2
  196.  
  197. # On vérifie la bonne présence du nombre de versions à conserver, si ce nest pas le cas on le met a 1
  198. if [ -z ${VM_BACKUP_ROTATION_COUNT} ]; then
  199. VM_BACKUP_ROTATION_COUNT=1
  200. fi
  201.  
  202. # On crée une liste classé par ordre decroissant dancienneté des dossiers de version de chaque VM, ainsi que leur nombre
  203. VM_BACKUP_DIRs_LIST=$(ls -tr ${VM_BACKUPs_DIR})
  204. # On dénombre les versions d'archives actuellement stockées
  205. VM_BACKUPs_NUMBER=$(ls ${VM_BACKUPs_DIR} | wc -w)
  206.  
  207. CPT=${VM_BACKUPs_NUMBER};
  208.  
  209. # On va passer sur chacun des répertoires des versions d'archives
  210. for DIR in ${VM_BACKUP_DIRs_LIST};
  211. do
  212. VM_BACKUPs_NUMBER=$(ls ${VM_BACKUPs_DIR} | wc -w)
  213. # Si le nombre de dossiers de versions est supérieur au nombre choisi et que le compteur l'est également, alors on supprime le dossier le plus ancien
  214. if [ ${VM_BACKUPs_NUMBER} -gt ${VM_BACKUP_ROTATION_COUNT} ] && [ ${CPT} -gt ${VM_BACKUP_ROTATION_COUNT} ]; then
  215. rm -rf ${VM_BACKUPs_DIR}/${DIR}
  216. # Si le dossier en cours a le meme nom qu'un dossier existant ou que le compteur est à 1 (donc le dernier dossier de la liste) et que le nombre de dossiers
  217. # de versions est égal au nombre choisi, alors on renomme le dossier en préparation à la suppression, qui ne s'effectuera qu'une fois la sauvegarde en cours achevée
  218. elif [ ${DIR} = ${CURRENT_BACKUP_VM_BACKUP_DIR#${VM_BACKUPs_DIR}/} ] || [ ${CPT} -eq 1 ] && [ ${VM_BACKUPs_NUMBER} -eq ${VM_BACKUP_ROTATION_COUNT} ]; then
  219. BACKUP_DIR_TO_DELETE=${VM_BACKUPs_DIR}/${DIR}_old
  220. mv ${VM_BACKUPs_DIR}/${DIR} ${BACKUP_DIR_TO_DELETE}
  221. fi
  222. CPT=$(($CPT-1))
  223. done
  224. }
  225.  
  226.  
  227.  
  228.  
  229. ########################################################################################
  230. # #
  231. # VI - Fonction "altersystemsVCB", fonction dorsale du script #
  232. # #
  233. ########################################################################################
  234.  
  235. altersystemsVCB()
  236. {
  237. VM_INPUT=$1
  238. START_TIME=`date`
  239. S_TIME=`date +%s`
  240.  
  241. echo -e "####################################################################" >> ${LOG_FILE}
  242. echo -e " ===>> Sauvegarde du `date +%d-%m-%y:%Hh%M` pour `uname -n`" >> ${LOG_FILE}
  243. echo -e "####################################################################" >> ${LOG_FILE}
  244. echo -e "####################################################################" >> ${RESULT_FILE}
  245. echo -e " ===>> Sauvegarde du `date +%d-%m-%y:%Hh%M` pour `uname -n`" >> ${RESULT_FILE}
  246. echo -e "####################################################################" >> ${RESULT_FILE}
  247. # Récupère la liste des VMs présentes sur le serveur ESX(i) - meme si leur nom contient un espace - et stocke le résultat
  248. # dans un fichier temporaire et formate l'affichage pour séparer les informations par ";" et non plus des espaces
  249. ${VMWARE_CMD} vmsvc/getallvms | sed 's/[[:blank:]]\{3,\}/ /g' | awk -F' ' '{print "\""$1"\";\""$2"\";\""$3"\""}' | sed 's/\] /\]\";\"/g' | sed '1,1d' > /tmp/vms_list
  250.  
  251. IFS='
  252. '
  253.  
  254. # On crée le répertoire de sauvegarde s'il n'existe pas
  255. if [ ! -d "${VM_BACKUP_VOLUME}" ]; then
  256. mkdir -p "${VM_BACKUP_VOLUME}"
  257. fi
  258.  
  259. # Le nom de chaque VM du fichier liste est récupéré, et le script va boucler pour chacune d'elles
  260. for VM_NAME in `cat "${VM_INPUT}" | sed '/^$/d' | sed -e 's/^[[:blank:]]*//;s/[[:blank:]]*$//'`;
  261. do
  262. # On récupère l'id de la VM dans le fichier temporaire que l'on vient de créer, en cherchant la ligne correspondant au nom du fichier liste
  263. VM_ID=`grep -E "\"${VM_NAME}\"" /tmp/vms_list | awk -F ";" '{print $1}' | sed 's/"//g'`
  264.  
  265. # On récupère le nom du datastore dans lequel est stocké le disque virtuel de la machine
  266. VMFS_VOLUME=`grep -E "\"${VM_NAME}\"" /tmp/vms_list | awk -F ";" '{print $3}' | sed 's/\[//;s/\]//;s/"//g'`
  267. # On récupère le dossier et le nom du fichier de configuration de la machine
  268. VMX_CONF=`grep -E "\"${VM_NAME}\"" /tmp/vms_list | awk -F ";" '{print $4}' | sed 's/\[//;s/\]//;s/"//g'`
  269. VMX_PATH="/vmfs/volumes/${VMFS_VOLUME}/${VMX_CONF}"
  270. VMX_DIR=`dirname "${VMX_PATH}"`
  271.  
  272. # Pour gérer la configuration souhaitée sur l'extinction des machines, on récupère leur état d'execution au début du script
  273. if [ "${POWER_VM_DOWN_BEFORE_BACKUP}" -eq 1 ]; then
  274. if "${VMWARE_CMD}" vmsvc/power.getstate ${VM_ID} | sed '1d' | grep "Powered off" > /dev/null 2>&1; then
  275. ETAT_VM="off"
  276. else
  277. ETAT_VM="on"
  278. fi
  279. fi
  280.  
  281. # On essaie d'obtenir l'ID de la machine virtuelle
  282. if [ -z "${VM_ID}" ]; then
  283. echo "Erreur: Impossible de récupérer l'ID de ${VM_NAME}!"
  284. echo "Erreur Fatale : Impossible de récupérer l'ID de ${VM_NAME}, sa sauvegarde est annulée" >> "$LOG_FILE"
  285. echo "Impossible de récupèrer l'id de ${VM_NAME} [ECHEC]" >> "$RESULT_FILE"
  286.  
  287. # Vérifie si la VM ne dispose pas déjà d'un snapshot
  288. elif ls "${VMX_DIR}" | grep -q delta > /dev/null 2>&1; then
  289. echo "Instantane trouve pour ${VM_NAME}, la sauvegarde est annulee'"
  290. echo "${VM_NAME} utilise un disque snapshot, sa sauvegarde est annulée" >> $LOG_FILE
  291. echo "${VM_NAME} utilise un disque snapshot [ECHEC]" >> $RESULT_FILE
  292.  
  293. # Verifie que la machine virtuelle n'utilise pas de RawDeviceMapping
  294. elif ${VMWARE_CMD} vmsvc/device.getdevices ${VM_ID} | grep "RawDiskMapping" > /dev/null 2>&1; then
  295. echo "Le RawDeviceMapping est actif sur ${VM_NAME}, la sauvegarde est annulee"
  296. echo "${VM_NAME} utilise le RawDeviceMapping, sa sauvegarde est annulée" >> $LOG_FILE
  297. echo "${VM_NAME} utilise un disque RDM [ECHEC]" >> $RESULT_FILE
  298.  
  299. # Verifie que le fichier de conf vmx est bien présent
  300. elif [[ -f "${VMX_PATH}" ]] && [[ ! -z "${VMX_PATH}" ]]; then
  301. BACKUP_DIR="${VM_BACKUP_VOLUME}/${VM_NAME}"
  302. if [[ -z "${VM_BACKUP_VOLUME}" ]]; then
  303. echo "Impossible d'atteindre le chemmin de sauvegarde, verifiez les variables saisies"
  304. echo "Erreur d'accès au datastore ${VM_BACKUP_VOLUME}, vérifiez la configuration" >> $LOG_FILE
  305. echo "Erreur d'accès au datastore ${VM_BACKUP_VOLUME} [ECHEC]" >> $RESULT_FILE
  306. exit 1
  307. fi
  308.  
  309. # On crée le répertoire de sauvegarde de la VM s'il n'existe pas
  310. if [ ! -d "${BACKUP_DIR}" ]; then
  311. mkdir -p "${BACKUP_DIR}"
  312. fi
  313.  
  314. # Nom de répertoire de sauvegarde de la VM
  315. VM_BACKUP_DIR="${BACKUP_DIR}/${VM_NAME}"
  316.  
  317. # On passe par la fonction dossiersvms pour la gestion de l'archivage des VMs
  318. dossiersvms "${BACKUP_DIR}" "${VM_BACKUP_DIR}"
  319. mkdir -p "${VM_BACKUP_DIR}"
  320.  
  321. # On copie le fichier de configuration de la VM dans son dossier de sauvegarde
  322. cp "${VMX_PATH}" "${VM_BACKUP_DIR}"
  323.  
  324. # On récupère tous les disques virtuels trouvés dans le fichier de configuration
  325. VMDKS_FOUND=`grep scsi "${VMX_PATH}" | grep fileName | awk -F " " '{print $1}'`
  326.  
  327. # Teste chaque VMDK trouvé dans le vmx et s'il est valide on le garde
  328. for DISK in "${VMDKS_FOUND}";
  329. do
  330. # On récupère l'ID SCSI de chaque disque pour vérifier qu'il est bien valide
  331. SCSI_ID=`echo "${DISK%%.*}"`
  332. grep "${SCSI_ID}.present" "${VMX_PATH}" | grep -i "true" > /dev/null 2>&1
  333. # Si oui, on stocke le vmdk valide
  334. if [ $? -eq 0 ]; then
  335. DISK=`grep "${SCSI_ID}".fileName "${VMX_PATH}" | awk -F "\"" '{print $2}'`
  336. VMDKS="${DISK}":"${VMDKS}"
  337. fi
  338. done
  339.  
  340. # Cette partie du script va chercher à éteindre le systeme de la machine virtuelle, et si cela ne répond pas
  341. # la machine est éteinte "brutalement", si on l'a autorisé au début du script
  342. if [ "${POWER_VM_DOWN_BEFORE_BACKUP}" -eq 1 ]; then
  343. START_ITERATION=0
  344. echo "Système en cours d'extinction sur ${VM_NAME}, la sauvegarde sera lancée une fois l'opération achevée..."
  345. echo "${VM_NAME} en cours d'extinction, la sauvegarde sera lancée une fois l'operation achevée" >> $LOG_FILE
  346. ${VMWARE_CMD} vmsvc/power.shutdown "${VM_ID}" > /dev/null 2>&1
  347. # Le script va attendre la durée prévue au début du script et va forcer l'arret si la machine reste allumée a la fin du compteur
  348. while ${VMWARE_CMD} vmsvc/power.getstate "${VM_ID}" | grep "Powered on" > /dev/null 2>&1;
  349. do
  350. # Si le système ne parvient pas à s'éteindre assez rapidement, on lance la fermeture de la machine
  351. if [ "${ENABLE_HARD_POWER_OFF}" -eq 1 ]; then
  352. START_ITERATION=$((START_ITERATION + 1))
  353. if [ "${START_ITERATION}" -gt "${ITER_TO_WAIT_SHUTDOWN}" ]; then
  354. echo "Extinction forcée de ${VM_NAME}, après attente de $((ITER_TO_WAIT_SHUTDOWN*3)) secondes"
  355. echo "${VM_NAME} éteinte brutalement après $((ITER_TO_WAIT_SHUTDOWN*3)) secondes d'attente" >> $LOG_FILE
  356. ${VMWARE_CMD} vmsvc/power.off "${VM_ID}" > /dev/null 2>&1
  357. # Cette pause est obligatoire sous ESXi sinon le système n'a pas le temps de prendre en compte que la VM est éteinte
  358. sleep 5
  359. break
  360. fi
  361. fi
  362. echo "La machine est encore en marche. Tentative : ${START_ITERATION} - Attendre l'extinction encore 3 secondes..."
  363. sleep 3
  364. done
  365. echo "La machine est éteinte"
  366. echo "${VM_NAME} s'est correctement éteinte" >> $LOG_FILE
  367. fi
  368.  
  369. # Cette partie concerne le cas où l'on ne souhaiterait pas éteindre les VM avant sauvegarde, ce qui impose de passer par des snapshots
  370. # notamment pour pouvoir déverrouiller et donc copier le disque virtuel en cours d'execution.
  371. if [ ! "${POWER_VM_DOWN_BEFORE_BACKUP}" -eq 1 ]; then
  372. echo "################## Prise d'un snapshot pour ${VM_NAME} ... ###################"
  373. echo "################## Prise d'un snapshot pour ${VM_NAME} ... ###################" >> $LOG_FILE
  374. ${VMWARE_CMD} vmsvc/snapshot.create "${VM_ID}" vcb_snap VCB_BACKUP_"${VM_NAME}"_`date +%F` > /dev/null 2>&1
  375. else
  376. echo "################## Sauvegarde de ${VM_NAME} en cours ... #####################"
  377. echo "################## Sauvegarde de ${VM_NAME} en cours ... #####################" >> $LOG_FILE
  378. echo -e "### Sauvegarde de ${VM_NAME}" >> ${RESULT_FILE}
  379. fi
  380.  
  381. # Selon le type de stockage du systeme de fichier définit au début du script les disques virtuels sont copiés sur le partage de sauvegarde
  382. OLD_IFS=${IFS}
  383. IFS=":"
  384. for j in ${VMDKS};
  385. do
  386. VMDK="${j}"
  387. # On lance le clonage du disque
  388. if [ "${ENABLE_2GB_SPARSE}" -eq 1 ]; then
  389. /sbin/vmkfstools -i "${VMX_DIR}"/"${VMDK}" -d 2gbsparse "${VM_BACKUP_DIR}"/"${VMDK}"
  390. else
  391. /sbin/vmkfstools -i "${VMX_DIR}"/"${VMDK}" "${VM_BACKUP_DIR}"/"${VMDK}"
  392. fi
  393. # On vérifie que le clonage s'est déroulé avec succès, si c'est le cas on supprime le dossier (sil y a lieu) de la plus ancienne sauvegarde
  394. if [ ! $? -eq 0 ]; then
  395. echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
  396. echo "XXXXXXXXXXXXXXXXX !!! La copie du disque ${VMDK} a échoué !!! XXXXXXXXXXXXXXXX"
  397. echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
  398. echo "!!! Verifiez l'espace disque disponible et le bon fonctionnement du tri des dossiers !!!"
  399. echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" >> $LOG_FILE
  400. echo "XXXXXXXXXXXXXXXXX !!! La copie du disque ${VMDK} a échoué !!! XXXXXXXXXXXXXXXX" >> $LOG_FILE
  401. echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" >> $LOG_FILE
  402. echo "!!! Verifiez l'espace disque disponible et le bon fonctionnement du tri des dossiers !!!" >> $LOG_FILE
  403. echo -e ">> Sauvegarde du disque ${VMDK} de ${VM_NAME} [ECHEC]" >> ${RESULT_FILE}
  404. else
  405. echo -e ">> Sauvegarde du disque ${VMDK} de ${VM_NAME} [REUSSIE]" >> ${RESULT_FILE}
  406. if [ ! -z "${BACKUP_DIR_TO_DELETE}" ]; then
  407. echo "=> Suppression de la plus ancienne version de sauvegarde de ${VM_NAME}"
  408. rm -rf "${BACKUP_DIR_TO_DELETE}"
  409. fi
  410. fi
  411. done
  412.  
  413. IFS="${OLD_IFS}"
  414.  
  415. # Concerne uniquement les VMs non éteintes
  416. if [ ! "${POWER_VM_DOWN_BEFORE_BACKUP}" -eq 1 ]; then
  417. ${VMWARE_CMD} vmsvc/snapshot.remove "${VM_ID}" > /dev/null 2>&1
  418. # Le script ne continue pas tant que tous les instantanés ne sont pas supprimés
  419. echo "Suppresion des instantanés de ${VM_NAME} ..."
  420. echo "Suppression du snapshot crée pour la sauvegarde de ${VM_NAME}..." >> $LOG_FILE
  421. while ls "${VMX_DIR}" | grep -q delta;
  422. do
  423. sleep 3
  424. done
  425. else
  426. #Prise en charge de l'état de la VM avant le script, et remise en l'état selon configuration
  427. #Voir variable VM_STATE_AFTER_BACKUP en debut de script
  428. if [ "${VM_STATE_AFTER_BACKUP}" -eq 0 ]; then
  429. if [ "${ETAT_VM}" != "off" ]; then
  430. echo "Remise en route de ${VM_NAME}"
  431. echo "Remise en route de ${VM_NAME}" >> $LOG_FILE
  432. ${VMWARE_CMD} vmsvc/power.on "${VM_ID}" > /dev/null 2>&1
  433. # Le script attend que la VM soit correctement redémarrée pour poursuivre
  434. echo "Attente de redémarrage de ${VM_NAME}......"
  435. echo "Attente de redémarrage de ${VM_NAME}......" >> $LOG_FILE
  436. sleep 20
  437. if "${VMWARE_CMD}" vmsvc/power.getstate "${VM_ID}" | sed '1d' | grep "Powered off"; then
  438. echo -e "=======> ERREUR ${VM_NAME} n'a pas redémarré dans les temps !!!!!!"
  439. echo -e "=======> ERREUR ${VM_NAME} n'a pas redémarré dans les temps !!!!!!" >> $LOG_FILE
  440. echo -e "=======> ERREUR ${VM_NAME} n'a pas redémarré dans les temps !!!!!!" >> ${RESULT_FILE}
  441. fi
  442. fi
  443. elif [ "${VM_STATE_AFTER_BACKUP}" -eq 1 ]; then
  444. echo "Remise en route de ${VM_NAME}"
  445. echo "Remise en route de ${VM_NAME}" >> $LOG_FILE
  446. ${VMWARE_CMD} vmsvc/power.on "${VM_ID}" > /dev/null 2>&1
  447. echo "Attente de redémarrage de ${VM_NAME}......"
  448. echo "Attente de redémarrage de ${VM_NAME}......" >> $LOG_FILE
  449. sleep 20
  450. if "${VMWARE_CMD}" vmsvc/power.getstate "${VM_ID}" | sed '1d' | grep "Powered off"; then
  451. echo -e "=======> ERREUR ${VM_NAME} n'a pas redémarré dans les temps !!!!!!"
  452. echo -e "=======> ERREUR ${VM_NAME} n'a pas redémarré dans les temps !!!!!!" >> $LOG_FILE
  453. echo -e "=======> ERREUR ${VM_NAME} n'a pas redémarré dans les temps !!!!!!" >> ${RESULT_FILE}
  454. fi
  455. fi
  456. fi
  457.  
  458. VMDKS=""
  459. echo -e "#################### Sauvegarde achevée pour ${VM_NAME}! #####################\n"
  460. echo -e "#################### Sauvegarde achevée pour ${VM_NAME}! #####################\n" >> $LOG_FILE
  461. else
  462. echo "Erreur : La VM ${VM_NAME} est introuvable !"
  463. echo "Erreur fatale: La VM ${VM_NAME} est introuvable" >> $LOG_FILE
  464. echo " > ERREUR : ${VM_NAME} est introuvable, vérifier le fichier liste de VMs" >> ${RESULT_FILE}
  465. fi
  466. done
  467.  
  468. unset IFS
  469.  
  470. END_TIME=`date`
  471. E_TIME=`date +%s`
  472. echo "Heure de début : ${START_TIME}"
  473. echo "Heure de fin : ${END_TIME}"
  474. DURATION=`echo $((E_TIME - S_TIME))`
  475.  
  476. # Affichage du calcul de la durée totale d'execution du script
  477. if [ "${DURATION}" -le 60 ]; then
  478. echo "Durée : ${DURATION} Secondes"
  479. echo "Durée : ${DURATION} Secondes" >> $LOG_FILE
  480. echo -e "\nDurée : ${DURATION} Secondes" >> ${RESULT_FILE}
  481. else
  482. echo "Durée : `awk 'BEGIN{ printf "%.2f\n", '${DURATION}'/60}'` Minutes"
  483. echo "Durée : `awk 'BEGIN{ printf "%.2f\n", '${DURATION}'/60}'` Minutes" >> $LOG_FILE
  484. echo -e "\nDurée : `awk 'BEGIN{ printf "%.2f\n", '${DURATION}'/60}'` Minutes" >> ${RESULT_FILE}
  485. fi
  486.  
  487. echo -e "\nSauvegarde achevée pour les VMs sélectionnées\n"
  488. echo -e "\n===>>Fin d'execution de la tache de sauvegarde ${END_TIME}\n\n\n\n\n\n\n" >> $LOG_FILE
  489. echo -e "####################################################################" >> ${RESULT_FILE}
  490. echo -e " <<=== Fin de la tache de sauvegarde le `date +%d-%m-%y:%Hh%M`" >> ${RESULT_FILE}
  491. echo -e "####################################################################\n\n\n\n\n\n\n\n" >> ${RESULT_FILE}
  492.  
  493. # On envoie les fichiers de logs générés sur le dossier de logs centralisé, et on le crée s'il n'existe pas
  494. if [ ! -d ${NFS_LOGS_DIR}/${FULL_LOGS_DIR} ]; then
  495. mkdir -p ${NFS_LOGS_DIR}/${FULL_LOGS_DIR}
  496. fi
  497.  
  498. # On copie le fichier de logs et de résultat en cours sur le NFS
  499. cat ${LOG_FILE} >> ${NFS_LOGS_DIR}/${FULL_LOGS_DIR}/${LOG_FILE_NAME}
  500. cat ${RESULT_FILE} > ${NFS_LOGS_DIR}/${RESULT_FILE_NAME}
  501.  
  502. }
  503.  
  504.  
  505.  
  506.  
  507. ########################################################################################
  508. # #
  509. # VII - Lancement du script #
  510. # #
  511. ########################################################################################
  512.  
  513.  
  514. # Verifie le nombre d'arguments passés en paramètres et si le fichier passé est bien valide
  515. syntaxe $#
  516.  
  517. # Lance la fonction dorsale du script
  518. altersystemsVCB $1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement