Die Foren-SW läuft ohne erkennbare Probleme. Sollte doch etwas nicht funktionieren, bitte gerne hier jederzeit melden und wir kümmern uns zeitnah darum. Danke!

ESX 5.1 shutdown wenn Temp. zu hoch, wie am besten ?

Moderatoren: irix, Dayworker

Member
Beiträge: 32
Registriert: 12.09.2006, 10:42

ESX 5.1 shutdown wenn Temp. zu hoch, wie am besten ?

Beitragvon StefanS » 12.01.2015, 11:09

Hallo zusammen,
wir wollen per Temperaturfühler mehrere ESX 5.1 Server herunterfahren (Temp. zu hoch).
Ein VSphereCenter Server (BearMetal) ist vorhanden.
Wie teile ich den ESX'en mit, das die VM's und er selbst heruntergefahren werden soll. ?

Danke für jede Hilfe
Stefan

Guru
Beiträge: 3114
Registriert: 27.12.2004, 22:17

Re: ESX 5.1 shutdown wenn Temp. zu hoch, wie am besten ?

Beitragvon rprengel » 12.01.2015, 11:25

StefanS hat geschrieben:Hallo zusammen,
wir wollen per Temperaturfühler mehrere ESX 5.1 Server herunterfahren (Temp. zu hoch).
Ein VSphereCenter Server (BearMetal) ist vorhanden.
Wie teile ich den ESX'en mit, das die VM's und er selbst heruntergefahren werden soll. ?

Danke für jede Hilfe
Stefan


Hallo,
nutzt du die freie Version oder hast du Lizenzen?
Mein Vorschlag für die freie Version:
Wenn du mit einer Monitoringlösung wie OMD / check_mk oder plain Nagios an die Werte kommst kannst du beim Überschreiten eines Schwellwertes eine Aktion auslösen. Z.B. ein aus dem Host liegendes shutdown-Script aufrufen.

Gruss

Member
Beiträge: 32
Registriert: 12.09.2006, 10:42

Beitragvon StefanS » 12.01.2015, 12:16

Hi,
wir haben Lizenzen.
Welches shutdown-Script nutzt du den da ?

Guru
Beiträge: 3114
Registriert: 27.12.2004, 22:17

Beitragvon rprengel » 12.01.2015, 12:25

StefanS hat geschrieben:Hi,
wir haben Lizenzen.
Welches shutdown-Script nutzt du den da ?


Wir nutzen was selbstgestricktes mit den Standardbefehlen der ESX Console da die Reihehenfolge bei und immens wichtig ist.
Je nach VM und Aufgabe macht es ggf. auch Sinn erst die VMs auf Betriebssystemebene des Gastes sauber zu stoppen.
Was du eh noch ein zentrales Managment suchts könnte saltstack was für dich sein und Linux und Windowsbüchsen zentral zu steueren.

Gruss

Member
Beiträge: 32
Registriert: 12.09.2006, 10:42

Beitragvon StefanS » 12.01.2015, 12:37

Danke für die rasche Antwort.
Kann ich mit saltstack auch den ESX Host (5.1) selbst runter fahren ?

Guru
Beiträge: 3114
Registriert: 27.12.2004, 22:17

Beitragvon rprengel » 12.01.2015, 12:57

StefanS hat geschrieben:Danke für die rasche Antwort.
Kann ich mit saltstack auch den ESX Host (5.1) selbst runter fahren ?


Sofern du einen Client darauf an den Start bekommst aber vemutlich eher nein.
Da hiltt aber ein remote ssh Kommando weiter.
Es gibt sichere mehrere Ansätze aber es ist immer nützlich zentrale sauber Strukturen und Tools zu haben.

Gruss

Member
Beiträge: 152
Registriert: 27.02.2008, 15:10

Beitragvon monster900 » 14.01.2015, 09:20

Moin,
wir nutzen hier bei uns Zabbix um unsere Systeme zu überwachen.
Um unsere VMHosts zu überwachen bin ich auf das Projekt PySphere gestoßen http://code.google.com/p/pysphere/. Damit kann man VMWare komplett per Python steuern und auch die Messwerte von Temperatur/Lüfterdrehzahlen auslesen.

Ein Codebeispiel zum auslesen der Sensordaten des Hosts gibt es hier:

Code: Alles auswählen

[url]https://groups.google.com/forum/#!searchin/pysphere/temperature/pysphere/ZTF9Z43pPPc/wgYfFiORAXUJ[/url]




Moderator
Code-Tags gesetzt, damit der Link sichtbar wird

Member
Beiträge: 152
Registriert: 27.02.2008, 15:10

Beitragvon monster900 » 14.01.2015, 09:33

Moin,
wir nutzen hier bei uns Zabbix um unsere Systeme zu überwachen. Grundsätzlich lässt sich das folgende aber mit jedem System realisieren, dass Python ausführen kann.
Um unsere VMHosts zu überwachen bin ich auf das Projekt PySphere gestoßen http://code.google.com/p/pysphere/. Damit kann man VMWare komplett per Python steuern und auch die Messwerte von Temperatur/Lüfterdrehzahlen der Hostsensoren auslesen (CIM-Provider).

Ein Codebeispiel zum auslesen der Sensordaten des VM Hosts gibt es, wenn Du als Suchbegriffe 'host sensor' im Diskussionsforum zu PySphere eingibst.
Ich habe testweise mal die Temperaturen der Ansaugluft unserer VM Hosts ausgelesen. Ist für uns eher uninteressant, da wir eh die Temperatur/Luftfeuchtigkeit im Serverraum überwachen.

Wir haben per PySphere und Zabbix den Shutdown unserer VMWare Host realisiert. Im Falle eines Stromausfalls werden alle VM's per PySphere in geplanter Reihenfolge sauber herunter gefahren und anschließend die Hosts sauber herunter gefahren.

Gruß
Dirk

Member
Beiträge: 32
Registriert: 12.09.2006, 10:42

Beitragvon StefanS » 14.01.2015, 11:22

Hi Dirk,
danke für deine Antwort, wir nutzen auch Zabbix :)
Kannst du falls möglich einmal dein shutdown Script hier posten, oder per pm an mich.

Danke und Gruß
Stefan

Member
Beiträge: 152
Registriert: 27.02.2008, 15:10

Beitragvon monster900 » 14.01.2015, 13:30

Moin,
kein Problem. Ich muss jedoch sagen, dass es sich bei dieser Programmierung um mein erstes Python-Werk handelt. Sicherlich kann ein Profi Alles noch wesentlich optimaler realisieren. ;)

Zur Realisierung unter Zabbix:
Das Script ist als Cronjob auf dem Zabbixserver hinterlegt und wird jede Minute ausgeführt. Findet das Script die Datei 'shutdown.lck' nicht im angegebenen Pfad wird es unmittelbar wieder beendet.
Ist eine Datei mit dem Namen 'shutdown.lck' vorhanden, so wird diese gelöscht und die Datei 'shutdown_running.lck' angelegt. Anschließend läuft das Script dann weiter durch.
Das Konstrukt soll verhindern, dass cron den eigentlichen Shutdown jede Minute neu startet!

Zabbix muss nur dafür sorgen, dass die 'shutdown.lck' im richtigen Pfad angelegt wird (Triggerbedingung bzw. Action), damit der Shutdown durchgeführt wird.

Das Script erklärt sich hoffentlich weitgehend selbst. :)
Das Script schreibt ein LOG.
Die Definition der Gruppen war erforderlich, da wir unbedingt eine gewisse Reihenfolge beim Shutdown einhalten wollen.

vcenter
Her muss der Name der VC VM angegeben werden. Diese darf natürlich nicht bzw. erst als letzte VM heruntergefahren werden!

VM_Group_1, VM Group_2
Hier sind die einzelnen VM's einzutragen, die heruntergefahren werden sollen.
Das Herunterfahren der VM's wird dann angestoßen. Es wird dabei geprüft, ob alle Maschinen von Gruppe1 bzw. Gruppe2 heruntergefahren wurden. Über den Timeout wird sichergestellt, dass nach max. 300s (konfigurierbar) die nächste Gruppe heruntergefahren wird.
Wenn beide Gruppen heruntergefahren wurden bzw. der Timeout erreicht wurde werden alle anderen noch laufenden VM's heruntergefahren. Die VCenter VM wird dabei natürlich nicht heruntergefahren!

Anschließend werden dann die VMHosts in den Wartungsmodus geschaltet und die Hosts abgeschaltet.

Bei uns läuft das als Shutdownscript bei einem Stromausfall. Zabbix schickt uns in dem Fall dann noch eine SMS, wenn der Shutdown losgeht.
Klar, das ist sicher noch nicht Alles perfekt. So gibt es z.B. keine Abbruchmöglichkeit im Script mehr so Bald der Shutdown läuft. Ist der Strom zwischenzeitlich wieder da... Pech gehabt!
Aber einen Tod muss man eben sterben.

Gruß
Dirk

Code: Alles auswählen

#!/usr/bin/python

import sys
import string
import time
import os

### Reihenfolge der VMS die durch das Script heruntergefahren werden        ###
VM_Group_1 = ["VM1", "VM2"]
VM_Group_2 = ["VM3", "VM4"]

### Name des vCenter Servers                                                ###
vcserver = "VC_VM"

### Anmeldedaten vCenter                                                    ###
sVCServer = "192.168.10.200"
sVCUser = "domain\user"
sVCPassword = "password"

### Pfad und Name zur Datei shutdown.lck und shutdown_running.lck           ###
lckfile="/usr/local/share/zabbix/externalscripts/shutdown.lck"
lckshutdown="/usr/local/share/zabbix/externalscripts/shutdown_running.lck"

### Pfad und Name der Log-Datei                                             ###
logfile = '/usr/local/share/zabbix/externalscripts/shutdown.log'

### Wenn Datei shutdown.lck nicht da, exit script                           ###
if not os.path.isfile(lckfile):
   # quit python script
   sys.exit(0)

### Wenn Datei shutdown_running.lck da, exit script                         ###
if os.path.isfile(lckshutdown):
   #ggf. shutdown.lck loeschen, exit script
   if os.path.isfile(lckfile):
      os.remove(lckfile)
      sys.exit(0)
   else:
      sys.exit(0)

### lckshutdown.lck Datei anlegen                                           ###
file = open(lckshutdown,"a")
file.close

### pySphere Module importieren                                             ###
from pysphere import VIServer, VIProperty, VIMor, VITask
from pysphere.vi_virtual_machine import VIVirtualMachine
from pysphere.resources import VimService_services as VI

### Function to save log messages to specified log file
def log(msg):
   # open the specified log file
   file = open(logfile,"a")
   # write log message with timestamp to log file
   file.write("%s: %s\n" % (time.strftime("%d.%m.%Y %H:%M:%S"), msg))
   # close log file
   file.close

def shutdown_vm(vms):
        # Wenn VM eingeschaltet herunterfahren
        if vms.get_status() == "POWERED ON":
                # Pruefung, ob VMTOOLS auf VM laufen
                try:
                        vm_tools_status = vms.wait_for_tools(timeout=5)
                        #Wenn VMTOOLS laufen, dann VM Shutdown
                        vms.shutdown_guest()
                # VMTOOLS laufen nicht, VM ausschalten
                except:
                        log("VM Tools laufen nicht! VM wird ausgeschaltet")
                        vms.power_off()
                return 0
        else:
                return -1

### Pruefen, ob alle Maschinen der uebergebenen Gruppe heruntergefahren
def check_shutdown_vmgroup(sArray_Name, VM_Array, Timer):
   bVMStatus = False
   TimeOut_Start = time.time()
   log ("Es wird geprueft ob alle VM der Gruppe: " + sArray_Name + " heruntergefahren sind (max. " + str(Timer) + " Sekunden)!")
   while bVMStatus == False:
      #Wenn Zeitlimit erreicht, while-Schleife abbrechen
      if time.time() > TimeOut_Start + Timer:
         return False
      for x in VM_Array:
         vm = server.get_vm_by_name(x)
         sVMStatus = vm.get_status()
         if sVMStatus == "POWERED OFF":
            bVMStatus = True
         else:
            log ("VM Status: " + vm.get_property('name', from_cache=False) + " " + sVMStatus)
            bVMStatus = False
            time.sleep(10)
            break
   return True

def host_mor(mor):
        if not VIMor.is_mor(mor):
                return VIMor(mor, "HostSystem")
        return mor

def enter_maintenance_mode(host, timeout, evacuate_powered_off_vms=None):
        host = host_mor(host)
        request = VI.EnterMaintenanceMode_TaskRequestMsg()
        _this = request.new__this(host)
        _this.set_attribute_type(host.get_attribute_type())
        request.set_element__this(_this)
        request.set_element_timeout(timeout)
        if evacuate_powered_off_vms in [False, True]:
                request.set_element_evacuatePoweredOffVms(evacuate_powered_off_vms)
        task = server._proxy.EnterMaintenanceMode_Task(request)._returnval
        return VITask(task, server)

def shutdown_host(host, force):
        host = host_mor(host)
        request = VI.ShutdownHost_TaskRequestMsg()
        _this = request.new__this(host)
        _this.set_attribute_type(host.get_attribute_type())
        request.set_element__this(_this)
        request.set_element_force(force)
        task = server._proxy.ShutdownHost_Task(request)._returnval
        return VITask(task, server)

### Pruefen, ob die Datei shutdown.lck vorhanden                            ###
### Wenn Datei shutdown.lck vorhanden loeschen                              ###
if os.path.isfile(lckfile):
   os.remove(lckfile)

   # Eintrag in Logdatei schreiben
   log ("schutdown.lck geloescht!")

   server = VIServer()
   ### Anmelden am vCenter bzw. VM-Host
   server.connect(sVCServer, sVCUser, sVCPassword)
   log ("Anmeldung an VC")

   ### Hosts herausfinden MOR und in Liste schreiben
   aHostList = server.get_hosts().keys()
   log ("VM Hosts im VC: " + str(aHostList))

   ### Host herausfinden auf dem VCServer laeuft
   vm = server.get_vm_by_name(vcserver)
   sHost_VC = vm.properties.runtime.host._obj
   log ("Host auf dem das VC lauft: " + sHost_VC)

   ### VMS der Gruppe 1 in geplanter Reihenfolge herunterfahren
   log ("VM der Gruppe 1 werden heruntergefahren")
   for x in VM_Group_1:
      vm = server.get_vm_by_name(x)
      log ("VM herunterfahren: " + vm.get_property('name', from_cache=False))
      nRes = shutdown_vm(vm)
      
   ### Shutdown Gruppe 1 pruefen
   if check_shutdown_vmgroup("VM_Group_1", VM_Group_1, 300) == True:
      log ("Alle VM der Gruppe 1 wurden heruntergefahren!")
   else:
      log ("Das Zeitlimit zum VM-Shutdown der Gruppe 1 wurde erreicht. Der Shutdown wird fortgesetzt!")

   ### VMS der Gruppe 2 in geplanter Reihenfolge herunterfahren
   log ("VM der Gruppe 2 werden heruntergefahren")
   for x in VM_Group_2:
      vm = server.get_vm_by_name(x)
      log ("VM herunterfahren: " + vm.get_property('name', from_cache=False))
      nRes = shutdown_vm(vm)

   ### Shutdown Gruppe 2 pruefen
   if check_shutdown_vmgroup("VM_Group_2", VM_Group_2, 300) == True:
      log ("Alle VM der Gruppe 2 wurden heruntergefahren!")
   else:
      log ("Das Zeitlimit zum VM-Shutdown der Gruppe 2 wurde erreicht. Der Shutdown wird fortgesetzt!")


   ### alle uebrigen laufenden VM herunterfahren, ausser VCServer!
   vmlist = server.get_registered_vms(status='poweredOn')
   for x in vmlist:
      vm = server.get_vm_by_path(x)
      ### Nur wenn VM Name <> vCenter shutdown durchfuehren
      if vm.get_property('name', from_cache=False) <> vcserver:
         log ("VM herunterfahren: " + vm.get_property('name', from_cache=False))
         nRes = shutdown_vm(vm)

   ### Pruefen, ob alle uebrigen VM heruntergefahren
   bVMStatus = False
   TimeOut_Start = time.time()
   TimeOut = 300
   log ("Es wird geprueft ob alle uebrigen VM  heruntergefahren sind. Timeout (max. " + str(TimeOut) + " Sekunden)!")
   while bVMStatus == False:
      #Wenn Zeitlimit erreicht, while-Schleife abbrechen
      if time.time() > TimeOut_Start + TimeOut:
         break
      for x in vmlist:
        vm = server.get_vm_by_path(x)
        ### Nur wenn VM Name <> vCenter Status pruefen
        if vm.get_property('name', from_cache=False) <> vcserver:
           sVMStatus = vm.get_status()
           if sVMStatus == "POWERED OFF":
              bVMStatus = True
           else:
              log ("VM Status: " + vm.get_property('name', from_cache=False) + " " + sVMStatus)
              bVMStatus = False
              time.sleep(10)
              break

   ### Shutdown aller VM bis auf VCenter abgeschlossen
   if bVMStatus == True:
      log ("Alle VM wurden heruntergefahren!")
   else:
      log ("Das Zeitlimit zum Herunterfahren der VM wurde erreicht. Der Shutdown wird fortgesetzt!")


   ### Hosts in den Maintenancemode schalten (Host, Timeout in Sekunden, Evakuierung (True/False))
   for x in aHostList:
      if x <> sHost_VC:
         enter_maintenance_mode(x, 0, 0)
         log ("Host in Maintenance-Mode: " + str(x))

   ### Host ausschalten (Host, Force (True/False))
   for x in aHostList:
      if x <> sHost_VC:
         shutdown_host(x, -1)
         log ("Shutdown Host: " + str(x))

   ### Datei shutdown_running.lck loeschen
   if os.path.isfile(lckshutdown):
      os.remove(lckshutdown)
      log ("Datei shutdown_running.lck wurde geloescht")

   ### Host auf dem vCenter laeuft herunterfahren
   shutdown_host (sHost_VC, -1)
   log ("Shutdown VCHost: " + str(sHost_VC))

   server.disconnect()

Member
Beiträge: 32
Registriert: 12.09.2006, 10:42

Beitragvon StefanS » 14.01.2015, 13:53

supi, nochmals vielen Dank !

King of the Hill
Beiträge: 13041
Registriert: 02.08.2008, 15:06
Wohnort: Hannover/Wuerzburg
Kontaktdaten:

Beitragvon irix » 14.01.2015, 13:58

Die Liste der Gruppen und deren Members wuerde ich dynamisch auslesen in dem ich entweder
1. Die VM Notes *
2. Custom Fields **
3. Tags ***
verwende wo die Infos hinterlegt sind. Diese dann zyklisch auslesen und abspeichern.
Das laesst sich dann auch wunderbar in einem Monitoring Script ueberwachen in dem man VMs sucht welche man noch nicht kategorisiert hat.

* Haengen an der VM und werden mitgesichert bzw. wenn die VM sich bewegt/clont wandern die Infos mit
** Ein Feature des vCenters und depricated seit 5.5
*** Koennen erst seit kurzem ueber die API erreicht werden. Haengen am Inventory Service und werden dort gespeichert.

Dirk,
du siehst es gibt noch optimierungspotential und es kommen ja noch ein paar Dunkle und Kalte Wochenenden ;)


Gruss
Joerg

Member
Beiträge: 152
Registriert: 27.02.2008, 15:10

Beitragvon monster900 » 14.01.2015, 14:11

Moin Jörg,
bin ja auch kein Programmierer. :oops:
Natürlich bin ich für Verbesserungsvorschläge immer zu haben. Hoffe, dass ich Sie auch umsetzten kann. ;)
Klingt interessant, dass über ein Tag bzw. Custom Field zu machen. Dann könnte man die Gruppe komplett im VCenter pflegen... :idea:

Das hätte auch den Vorteil, dass bei einem Schreibfehler des Namens der VM das Script nicht aussteigt!

Gruß
Dirk

PS: Die langen Abende sind eigentlich für meine Frau reserviert. 8)

King of the Hill
Beiträge: 13041
Registriert: 02.08.2008, 15:06
Wohnort: Hannover/Wuerzburg
Kontaktdaten:

Beitragvon irix » 14.01.2015, 14:18

monster900 hat geschrieben:Moin Jörg,
bin ja auch kein Programmierer. :oops:
Natürlich bin ich für Verbesserungsvorschläge immer zu haben. Hoffe, dass ich Sie auch umsetzten kann. ;)


Es muss ja nicht bei Version 1.0 bleiben.

Klingt interessant, dass über ein Tag bzw. Custom Field zu machen. Dann könnte man die Gruppe komplett im VCenter pflegen... :idea:

Das hätte auch den Vorteil, dass bei einem Schreibfehler des Namens der VM das Script nicht aussteigt!


Korrekt. Das man nach dem anlegen einer VM da noch auf dem Monitoringserver "frickeln" muss sollte nicht sein. Nicht kategorisierte VMs wuerde dein Script dann automatisch in die letzte Gruppe schmeissen.

Gruß
Dirk

PS: Die langen Abende sind eigentlich für meine Frau reserviert. 8)


Na die 30sek. .... :D

Gruss
Joerg

Member
Beiträge: 152
Registriert: 27.02.2008, 15:10

Beitragvon monster900 » 27.01.2015, 13:40

Moin,
nach etwas herumprobieren habe ich mein PySphere-Shutdownscript etwas überarbeitet. Das Script liest nun ein benutzerdefiniertes Attribut aus den VM aus (Custom Field).
Das Benutzerdefinierte Attribut muss 'VM_SHUTDOWN_GROUP' heißen. Als Wert kommt entweder eine '1' für VM Gruppe 1 oder eine '2' für VM Gruppe 2 hinein.
Beim virtuellen vCenter Server muss das Attribut mit 'VCENTER' gefüllt werden.
Beim hinzufügen/ändern von VM muss dass Script somit nicht mehr angepasst werden. :grin:

Ansonsten funktioniert das Script wie die Vorversion.
Es werden zunächst die VM der Gruppe 1 heruntergefahren. Nach einer Wartezeit (im Script max. 300 Sekunden) werden dann die VM der Gruppe 1 heruntergefahren.
Nach der Wartezeit (300 Sekunden) werden dann alle übrigen noch laufenden VM heruntergefahren (bis auf die vCenter VM, Wartezeit auch wieder max. 300 Sekunden).

Anschließend werden dann die Hosts in den Wartungsmodus geschaltet und anschließend heruntergefahren. Der Host auf dem das vCenter läuft wird als letztes heruntergefahren. Dabei wird die vCenter VM dann 'hart' ausgeschaltet. Das ist noch etwas unschön. Aber das Script ist ja auch für den Notfall gedacht...

Achtung:
Der Einsatz des Scripts erfolgt auf eigene Gefahr!


Mal so zur Info:
Am letzten Wochenende haben wir unsere UPS-Notfallabschaltung getestet.
Beide APC UPS vom Netztstrom getrennt -> nach 5 Minuten UPS Batteriebetrieb wurde der Shutdown eingeleitet -> nach 12,5 Minuten waren unsere 3 VM Hosts (mit ca. 40 VM) sauber heruntergefahren.
Natürlich gab es auch schöne Desaster-SMS von unserem Zabbix! :D
Insgesamt knapp 18 Minuten bis das komplette System nach einem Stromausfall sauber herunterfährt.
Die APC UPS hatten am Ende noch eine Batterielaufzeit von knapp 10 Minuten.

Ach ja, das Wiederanfahren der gesamten Umgebung hat dann schon etwas länger gedauert...

Code: Alles auswählen

#!/usr/bin/python

import sys
import string
import time
import os

### Definition der Shutdowngruppen und vCenter
VM_Group_1 = []
VM_Group_2 = []
VM_No_Group = []
VCServer = ""

### Anmeldedaten vCenter                                                    ###
sVCServer = "192.168.10.200"
sVCUser = "domain\user"
sVCPassword = "password"

### Pfad und Name zur Datei shutdown.lck und shutdown_running.lck           ###
lckfile="/usr/local/share/zabbix/externalscripts/shutdown.lck"
lckshutdown="/usr/local/share/zabbix/externalscripts/shutdown_running.lck"

### Pfad und Name der Log-Datei                                             ###
logfile = '/usr/local/share/zabbix/externalscripts/shutdown.log'

### Wenn Datei shutdown.lck nicht da, exit script                           ###
if not os.path.isfile(lckfile):
   # quit python script
   sys.exit(0)

### Wenn Datei shutdown_running.lck da, exit script                         ###
if os.path.isfile(lckshutdown):
   #ggf. shutdown.lck loeschen, exit script
   if os.path.isfile(lckfile):
      os.remove(lckfile)
      sys.exit(0)
   else:
      sys.exit(0)

### lckshutdown.lck Datei anlegen                                           ###
file = open(lckshutdown,"a")
file.close

### pySphere Module importieren                                             ###
from pysphere import VIServer, VIProperty, VIMor, VITask
from pysphere.vi_virtual_machine import VIVirtualMachine
from pysphere.resources import VimService_services as VI

### Function to save log messages to specified log file
def log(msg):
   # open the specified log file
   file = open(logfile,"a")
   # write log message with timestamp to log file
   file.write("%s: %s\n" % (time.strftime("%d.%m.%Y %H:%M:%S"), msg))
   # close log file
   file.close


def shutdown_vm(vms):
        # Wenn VM eingeschaltet herunterfahren
        if vms.get_status() == "POWERED ON":
                # Pruefung, ob VMTOOLS auf VM laufen
                try:
                        vm_tools_status = vms.wait_for_tools(timeout=5)
                        #Wenn VMTOOLS laufen, dann VM Shutdown
                        vms.shutdown_guest()
                # VMTOOLS laufen nicht, VM ausschalten
                except:
                        log("VM Tools laufen nicht! VM wird ausgeschaltet")
                        vms.power_off()
                return 0
        else:
                return -1

### Pruefen, ob alle Maschinen der uebergebenen Gruppe heruntergefahren
def check_shutdown_vmgroup(sArray_Name, VM_Array, Timer):
   bVMStatus = False
   TimeOut_Start = time.time()
   log ("Es wird geprueft ob alle VM der Gruppe: " + sArray_Name + " heruntergefahren sind (max. " + str(Timer) + " Sekunden)!")
   while bVMStatus == False:
      #Wenn Zeitlimit erreicht, while-Schleife abbrechen
      if time.time() > TimeOut_Start + Timer:
         return False
      for x in VM_Array:
         vm = server.get_vm_by_path(x)
         sVMStatus = vm.get_status()
         if sVMStatus == "POWERED OFF":
            bVMStatus = True
         else:
            log ("VM Status: " + vm.get_property('name', from_cache=False) + " " + sVMStatus)
            bVMStatus = False
            time.sleep(10)
            break
   return True

def host_mor(mor):
        if not VIMor.is_mor(mor):
                return VIMor(mor, "HostSystem")
        return mor

def enter_maintenance_mode(host, timeout, evacuate_powered_off_vms=None):
        host = host_mor(host)
        request = VI.EnterMaintenanceMode_TaskRequestMsg()
        _this = request.new__this(host)
        _this.set_attribute_type(host.get_attribute_type())
        request.set_element__this(_this)
        request.set_element_timeout(timeout)
        if evacuate_powered_off_vms in [False, True]:
                request.set_element_evacuatePoweredOffVms(evacuate_powered_off_vms)
        task = server._proxy.EnterMaintenanceMode_Task(request)._returnval
        return VITask(task, server)

def shutdown_host(host, force):
        host = host_mor(host)
        request = VI.ShutdownHost_TaskRequestMsg()
        _this = request.new__this(host)
        _this.set_attribute_type(host.get_attribute_type())
        request.set_element__this(_this)
        request.set_element_force(force)
        task = server._proxy.ShutdownHost_Task(request)._returnval
        return VITask(task, server)

### Pruefen, ob die Datei shutdown.lck vorhanden                            ###
### Wenn Datei shutdown.lck vorhanden loeschen                              ###
if os.path.isfile(lckfile):
   os.remove(lckfile)

   # Eintrag in Logdatei schreiben
   log ("schutdown.lck geloescht!")

   server = VIServer()
   ### Anmelden am vCenter bzw. VM-Host
   server.connect(sVCServer, sVCUser, sVCPassword)
   log ("Anmeldung an VC")

   ### Hosts herausfinden MOR und in Liste schreiben
   aHostList = server.get_hosts().keys()
   log ("VM Hosts im VC: " + str(aHostList))

   ### Shutdowngruppen und VCServer ermitteln
   log ("Shutdowngruppen und vCenter Server auslesen...")
   props = VIProperty(server, server._do_service_content.CustomFieldsManager)
   custom_fields = dict((cf.key, cf.name) for cf in props.field)
   vmlist = server.get_registered_vms(status='poweredOn')
   for x in vmlist:
      vm = server.get_vm_by_path(x)
      for cv in vm.properties.customValue:
         if custom_fields.get(cv.key) == "VM_SHUTDOWN_GROUP":
            if cv.value == "1":
               VM_Group_1.append(x)
            if cv.value == "2":
               VM_Group_2.append(x)
            if cv.value == "VCENTER":
               VCServer = x

   log ("Shutdowngruppe 1:")
   log (VM_Group_1)
   log ("Shutdowngruppe 2:")
   log (VM_Group_2)
   log ("vCenter VM:" + VCServer)

   ### Host ermitteln auf dem VCServer laeuft
   vm = server.get_vm_by_path(VCServer)
   sHost_VC = vm.properties.runtime.host._obj
   log ("Host auf dem das VC lauft: " + sHost_VC)

   ### VMS der Gruppe 1 in geplanter Reihenfolge herunterfahren
   log ("VM der Gruppe 1 herunterfahren")
   for x in VM_Group_1:
      vm = server.get_vm_by_path(x)
      log ("VM herunterfahren: " + vm.get_property('name', from_cache=False))
      nRes = shutdown_vm(vm)

   ### Shutdown Gruppe 1 pruefen
   if check_shutdown_vmgroup("VM_Group_1", VM_Group_1, 300) == True:
      log ("Alle VM der Gruppe 1 wurden heruntergefahren!")
   else:
      log ("Das Zeitlimit zum VM-Shutdown der Gruppe 1 wurde erreicht. Der Shutdown wird fortgesetzt!")

   ### VMS der Gruppe 2 in geplanter Reihenfolge herunterfahren
   log ("VM der Gruppe 2 herunterfahren")
   for x in VM_Group_2:
      vm = server.get_vm_by_path(x)
      log ("VM herunterfahren: " + vm.get_property('name', from_cache=False))
      nRes = shutdown_vm(vm)

   ### Shutdown Gruppe 2 pruefen
   if check_shutdown_vmgroup("VM_Group_2", VM_Group_2, 300) == True:
      log ("Alle VM der Gruppe 2 wurden heruntergefahren!")
   else:
      log ("Das Zeitlimit zum VM-Shutdown der Gruppe 2 wurde erreicht. Der Shutdown wird fortgesetzt!")

   ### alle uebrigen laufenden VM ermitteln und ausser VCServer in VM_No_Group aufnehmen
   log ("Uebrige laufende VM ermitteln...")
   vmlist = server.get_registered_vms(status='poweredOn')
   for x in vmlist:
      vm = server.get_vm_by_path(x)
      ### Nur wenn aktuelle VM <> vCenter in Gruppe aufnehmen
      if x <> VCServer:
         VM_No_Group.append(x)

   ### VMS ohne Shutdowngruppe herunterfahren
   log ("Uebrige laufende VM werden heruntergefahren")
   for x in VM_No_Group:
      vm = server.get_vm_by_path(x)
      log ("VM herunterfahren: " + vm.get_property('name', from_cache=False))
      nRes = shutdown_vm(vm)

   ### Shutdown der uebrigen VM pruefen
   if check_shutdown_vmgroup("VM ohne Shutdown-Gruppe", VM_No_Group, 300) == True:
      log ("Alle VM ohne Gruppenzugehoerigkeit wurden heruntergefahren!")
   else:
      log ("Das Zeitlimit zum Herunterfahren der VM wurde erreicht. Der Shutdown wird fortgesetzt!")

   ### Hosts in den Maintenancemode schalten (Host, Timeout in Sekunden, Evakuierung (True/False))
   for x in aHostList:
      if x <> sHost_VC:
         enter_maintenance_mode(x, 0, 0)
         log ("Host in Maintenance-Mode: " + str(x))

   ### Host ausschalten (Host, Force (True/False))
   for x in aHostList:
      if x <> sHost_VC:
         shutdown_host(x, -1)
         log ("Shutdown Host: " + str(x))

   ### Datei shutdown_running.lck loeschen
   if os.path.isfile(lckshutdown):
      os.remove(lckshutdown)
      log ("Datei shutdown_running.lck wurde geloescht")

   ### Host auf dem vCenter laeuft herunterfahren
   shutdown_host (sHost_VC, -1)
   log ("Shutdown VCHost: " + str(sHost_VC))

   server.disconnect()    


Zurück zu „vSphere 5 / ESXi 5 und 5.1“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste