Come tutti sappiamo avere un UPS (Uninterruptable Power Supply – ovvero – Gruppo di Continuità) in un contesto di Server è indispensabile.

Ma se non si ha alcun tipo di automatismo che spenga in tempo utile le macchine virtuali presenti in un server prima che le batterie esauriscano la loro carica, tutto ciò risulta inutile, sarebbe comunque come staccare la spina o semplicemente non avere l’UPS.

Per riuscire quindi a dare un senso alla presenza dell’UPS occorre :

  • Monitorare il livello di carica delle batterie
  • Spegnere (Shutdown) le macchine virtuali
  • Spegnere la piattaforma di virtualizzazione (Esxi)

Avere un Gruppo di continuità collegato ad un server fisico o virtuale non ha alcun senso se il livello di carica non viene monitorato e specialmente non avrebbe senso se non vi fossero automatismi che spengono il server se il livello di carica delle batterie è basso.

Immaginiamo un server che viene alimentato da UPS ma senza alcun monitoraggio e automatismo per lo spegnimento. Durante il weekend potrebbe venire a mancare la corrente e quindi una volta terminata l’autonomia di carica delle batterie il server si spegnerebbe a malo modo rendendo inutile la presenza dell’UPS stesso.

Fatta questa doverosa premessa arriviamo alla soluzione.

Parlando nello specifico di ambiente virtuale con Vmware Esxi possiamo riassumere tutte le fasi come segue :

  • Copiare nel Datastore il nostro script di spegnimento
  • Copiare in una delle macchine virtuali lo script che lancia a sua volta lo script che abbiamo messo nel datastore
  • Installare sulla macchina che lancia lo script del Datastore il programma di gestione dell’UPS

Premessa:

Abilitare la modalità SSH sul server Esxi.

Copiate (tramite interfaccia Vsphere o Putty) il file shutdownvm.sh nel Datastore e successivamente assegnateli i permessi di esecuzione tramite il comando chmod +x shutdownvm.sh

Per assegnare i permessi di esecuzione potete collegarvi al Server Esxi tramite Putty.

Create una cartella in C:\tools sulla macchina virtuale che userete per effettuare il controllo del livello di carica e l’esecuzione del comando di spegnimento.

In tale cartella copiare il file Plink.exe ed il file spegniserver.bat

Spiegazione di funzionamento:

Il software dell’UPS ha solitamente una sezione dove puoi specificare quali azioni devono essere eseguite nel momento in cui la carica delle batterie non è più sufficiente per mantenere acceso tutto.

Tra le azioni che si possono scegliere c’è quella di eseguire un programma. Noi specificheremo che dovrà eseguire il programma c:\tools\spegniserver.bat

Il programma (batch) spegniserver.bat richiamerà il file Plink.exe che sarà in grado di richiedere alla piattaforma di virtualizzazione di mandare in esecuzione il file shutdownvm.sh che si trova nel Datastore.

Il programma shutdownvm.sh eseguirà due cicli di istruzioni : Il primo cercherà l’elenco delle macchine virtuali presenti nel server ed una alla volta le spegnerà in modo corretto facendo lo shutdown e non il poweroff!

Il secondo ciclo verificherà che effettivamente tutte le macchine sono state spente correttamente e che quindi il loro stato è Powered Off.

Una volta che avrà trovato tutte le macchine in PowerOff spegnerà la piattaforma di virtualizzazione stessa (Esxi).

NB: Prima di poter utilizzare gli script di questo articolo, dovete modificare il file spegniserver.bat dove dovete inserire i vostri parametri di accesso al server Esxi.

Sembra strano poter spegnere una macchina virtuale e tutte le altre lanciando il comando dalla stessa macchina che vogliamo spegnere ma come abbiamo potuto constatare in realtà la macchina virtuale che vogliamo spegnere non fa altro che dire al server esxi “esegui lo script di spegnimento” quindi non è la VM a dire “come fare” ma solo “cosa fare“.

File shutdownv.sh (attenzione agli apici, mantenerli tali quali e usare un editor compatibile Unix e ricordarsi di dare i permessi di esecuzione a questo file dopo averlo copiato nel datastore)

#!/bin/sh
#Lista macchine virtuali e relativo spegnimento
#in ordine di ID, non tiene conto nel spegnere un DC per ultimo
#Testato su ESX 6.0.0

PATH=$PATH:/bin:/usr/bin:/usr/sbin

#Elenca le macchine presenti e passa solo l’id


for i in `vim-cmd vmsvc/getallvms | grep -v Vmid | awk '{print $1}' | sort -n`
do
echo "Spegnimento macchina virtuale numero $i"
vim-cmd vmsvc/power.shutdown $i
done

#attende 40 secondi dopo aver spento tutte le vm
sleep 40

#spegnimento ESXi dopo aver verificato che non ci siano piu’ VM accese
#ciclo identico al precedente con una funzione while che attende lo stato della macchina

for i in `vim-cmd vmsvc/getallvms | grep -v Vmid | awk '{print $1}' | sort -n`
do
STATUS=”Powered on”
while [ "$STATUS" == "Powered on" ]
do
STATUS=`vim-cmd vmsvc/power.getstate $i | sed ’id’`
sleep 5
done
done

#attende per 2 minuti
sleep 120
#spegne l'esxi
poweroff

File spegniserver.bat (da modificare prima dell’uso)

rem Per sapere il percorso delle vostre macchine dovete collegarvi con Putty al server Esxi
rem digitare cd nome_del_datastore
rem digitare cd vmfs/volumes
rem digitare ls e premere invio
rem Identificare il percorso dov si trovano le VM

"C:\tools\plink.exe" -batch nomeutente_del_esxi@indirizzo_ip_del_server_esxi -pw password_del_esxi "/vmfs/volumes/5ad34014-367a21ba-0fff-7446a0feb568/shutdownvm.sh"

pause

Istruzioni.txt

abilitare ssh in esxi

copiare il file shutdownvm.sh nel datastore nel volume dove si trovano le macchine

da putty eseguire comando seguente per rendere eseguibile il file

chmod +x shutdownvm.sh

copiare il file Plink.exe nella cartella c:\tools
copiare il file spegniserver.bat nella cartella c:\tools di una delle vm (quella dove hai installato il sw dell’ups che lancerà il comando spegniserver.bat)