Questa settimana ho tirato fuori la soluzione ad un problema che spesso affronto…e che mi fa sempre perdere parecchio tempo.
Si tratta dello Shutdown su Server VMWARE (ESX o ESXi), non mi addentrerò su quale UPS, in quanto è assolutamente indifferente, ciò che spiego sono le operazioni da eseguire per permettere lo Shutdown tanto dei Guest quanto del server VMWARE stesso.
Il tutto può essere fatto sia da una macchina virtuale all’interno dello stesso server VMWARE, sia da una macchina esterna, unica cosa fondamentale è la ricezione del segnare di Shutdown da parte della macchina che dovrà lanciare i comandi di Shutdown, questo può avvenire sia per collegamento diretto con l’UPS (seriale / USB /Network), sia per segnale ricevuto da macchina collegata all’UPS.
la cosa che appare strana, è che lo shutdown possa essere eseguito anche da una macchina all’interno del VMWARE stesso, in realtà è estremamente semplice, in quanto il comando di Shutdown avviene eseguendo uno script nello stesso server, ed una volta lanciato la procedura continua anche se la macchina che l’ha eseguita si spegne, quindi, di fatto il guest può eseguire il comando di shutdown che farà spegnere anche se stesso.
Ma vediamo come avviene tutto questo,
è necessario creare il file di script all’interno del Server virtuale (provato con VMWARE ESXi 4.1) è fondamentale crearlo all’interno di uno dei Datastore, in altri percorso della macchina verrebbe cancellato al riavvio stesso del server.
altro aspetto fondamentale è abilitare il server all’accesso remoto in SSH, con la versione 4.1 si fà direttamente dalla pagina di configurazione di Vmware, con le precedenti versioni esisteva una procedura.
Fatto questo create un file, (Shutdown.sh ad esempio) e inserite quanto riporto
=================
==============================
E’ poi necessario configurare il server stesso (solitamente da Bios) per far si che in caso di arrivo di tensione, lo stesso si accenda, in questo modo le macchine torneranno attive senza necessità di intervento umano.
“C:XXXXXXXXXXXXXXXXXXXXplink.exe” 192.168.0.XXX -l root -pw xxxxxxxxx /vmfs/volumes/4be44cf6-27200d83-9788-xxxxxxxxxxx/shutdown.sh
ecco due aspetti che piaceranno poco (anche a me) è necessario che la password di Root, o comunque la password di un’utenza che abbia diritti di SSH/accesso allo store/diritti di shutdown, sia esposta in chiaro nello script.
è anche vero che è possibile nascondere il comando di shutdown da occhi indiscreti proteggendolo sotto directory abilitate da utenze con diritti elevati.
se ben calibrato il tutto (è necessario fare le relative prove per essere certi che l’eventuale UPS abbia sufficiente autonomia per tenere su le macchine fino a loro shutdown, ma questo forse era inutile dirlo), il server eseguirà lo shutdown appena tutte le macchine virtuale si saranno spente.
Con quanto sopra vi evitate, complesse procedure di integrazione software UPS all’interno di Vmware stesso, ed il comando non richiede neanche grandi competenze tecniche, è tutto scritto sopra quindi è estremamente semplice
In caso di problemi chiedete pure sarò disponibile a eventuali chiarimenti
Buon Shutdown a tutti!
14 Giugno 2012 @ 14:29
salve,complimenti per la guida,
non mi è molto chiaro come configurare il plink in modo che parta quando l’UPS è in batteria.
grazie
20 Giugno 2012 @ 4:32
cosa non ti è chiaro ?
se posso darti una mano, volentieri
5 Luglio 2012 @ 9:47
Mi interessa questa soluzione. ma la macchina che deve lanciare lo script in base a quale segnale lo manda; e inoltre funziona anche con esxi 5.0.0.1? Grazie
27 Luglio 2012 @ 11:27
La macchina che deve lanciare lo script (quindi esterna da VMWARE) è lei che è collegata all’UPS via Seriale, e quindi sarà il software dell’UPS che eseguirà lo script.
si funziona anche su ESXI 5, il principio è identico
25 Luglio 2012 @ 17:37
Complimenti per la soluzione. Non mi è chiaro però come l’UPS riesca a comunicare con una delle VM da cui verra successivamente eseguito plink.
O meglio non mi è chiaro cosa intendi quando parli di “…sarà quindi necessario eseguire il comando tramite uno script lanciato dall’UPS con all’interno la seguente stringa ….”.
Ti ringrazio anticipatamente se vorrai spendere qualche parola in più per spiegare questa parte.
Grazie.
Raffaele
27 Luglio 2012 @ 11:28
l’UPS deve comunicare con una macchina esterna…tecnicamente anche da una interna, ma avrebbe meno senso,
dovrà essere collegato all’ups tramite USB o seriale, ora anche VMWARE è in grado di inoltrare il traffico seriale o usb alla macchina virtuale.
Lo script viene eseguito dalla macchina collegata all’UPS (o virtuale o fisica..consiglio per logica che sia fisica)
3 Gennaio 2014 @ 17:56
Ciao,
la soluzione è buona. Mi stavo immaginando… cosa succede se torna la corrente dopo che lo script è partito?
Mi spiego, imposto lo shutdown dopo 5 minuti, quindi dopo 5 minuti parte il mio script che comincia a spegnere tutte le macchine e poi il virtualizzatore stesso…
ma se al minuto 6, o cmq in qualsiasi momento dopo il lancio dello scrpt, mi torna la corrente…mi resta il server spento per sempre, giusto??
grazie,R.
29 Novembre 2014 @ 15:57
Grazie mille 🙂
Io finora lanciavo lo spegnimento sempre tramite plink del server stesso, dopo aver impostato lo shutdown guest delle macchine, pero’ sinceramente vedendo il tempo impiegato mi da l’impressione che ESXi si spenga prima che tutte le VM siano completamente chiuse.
Mi confermi questa cosa??
2 Dicembre 2014 @ 6:52
dipende molto dalla versione di vmware usata, ormai siamo a versioni più avanzate e questa cosa è leggermente cambiata
io in seguito agli sleep (devi calcolare il tempo opportuno degli sleep a seconda delle macchine)
uso questo:
esxcli system maintenanceMode set -e true -t 0
esxcli system shutdown poweroff -d 10 -r “Power Line”
esxcli system maintenanceMode set -e false -t 0
in questo modo mando prima in maintenance mode il sistema..e non ci va se prima le macchine non sono spente,
poi mando il comando di shutdown e subito dopo tolgo il maintenance (altrimenti quando riavvio le macchine non vanno su)
ed ho risolto un pò di problemi dei nuovi vmware,
comunque a giorni rivedo l’articolo
23 Dicembre 2014 @ 14:51
macchiavellico 😛
21 Gennaio 2015 @ 14:55
Grazie a te ho avuto l’ispirazione su come essere sicuro che tutte le macchine siano spente prima di tirar giu’ ESX.
Ho creato il seguente batch e l’ho inserito nel datastore, richiamato al solito tramite plink (non so perchè, ma se lo metto sotto /bin al riavvio scompare, protezione di esx? )
________________________________________________________________________
#!/bin/sh
#Lista macchine virtuali e relativo spegnimento
#in ordine di ID, non tiene conto nel spegnere un DC per ultimo
#Testato su ESX 5.0.0 e 5.5.0
PATH=$PATH:/bin:/usr/bin:/usr/sbin
#Elenca le macchine presenti e passa solo l’id
for i in `vim-cmd vmsvc/getallvms | sed ‘1d’ | awk ‘{print $1}’`
do
vim-cmd vmsvc/power.shutdown $i
done
#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 | sed ‘1d’ | awk ‘{print $1}’`
do
STATUS=”Powered on”
while [ “$STATUS” == “Powered on” ]
do
STATUS=`vim-cmd vmsvc/power.getstate $i | sed ‘1d’`
sleep 5
done
done
poweroff
______________________________________________________________________
Ho isolato i due cicli per velocizzare la procedura, le macchine tenderanno a spegnersi insieme.
la stringa PLINK sarà più o meno la seguente:
echo y | plink.exe root@192.168.0.1 -pw miapassword “/vmfs/volumes/549954a5-e517a003-3c45-00215aebeb3e/bin/TotalShutdown.sh” >log.txt 2>&1
TotalShutdown.sh è ovviamente lo script di cui sopra.
Spero possa essere di aiuto a qualcuno.
PS
era la prima volta che mi cimentavo nella shell di un sistema posix, sono dicentato matto a capire che c’erano gli apici invertiti 😛
7 Agosto 2015 @ 9:42
Ciao a tutti , a me non funziona nessuno dei due script.
Il primo mi da
“shutdown.sh not foundes/55c36e9c-97e75272-9790-001f2963fb14/shutdown.sh: line 3: date
/vmfs/volumes/55c36e9c-97e75272-9790-001f2963fb14/shutdown.sh: line 6: syntax error: unexpected word (expecting “do”)
Il secondo:
“shutdown.sh: not found”
Qualcuno può aiutarmi?
10 Agosto 2015 @ 5:50
mancano molti dati, versione di VMWARE in primis, poi posso provare ad aiutarti