Moin,
zu dem Thema APC und VM gibt es schon einige Fred's hier im Forum.
Ich habe das mit der APC-vMA hier im Unternehmen nicht hinbekommen und habe daher eine eigene etwas andere Lösung für uns gefunden (Achtung: Hat noch Betastatus!!!).
Grundsätzlich ist für uns absolut wichtig, dass im Falle des Falles die VM's in geregelter Reihenfolge herunter gefahren werden.
Wir überwachen unser Netzwerk mit Zabbix. Grundsätzlich lässt sich die Lösung aber auch mit z.B. Nagios realisieren.
Unsere 3 VM Hosts hängen jeweils an einer APC3000 und einer APC2200 (HA-Cluster). Beide APC's sind mit einer Netzwerkmanagementkarte ausgestattet. Zabbix überwacht beide APC's per SNMP.
Bei einem Stromausfall der APC (egal welcher) gibt es eine entsprechende Warnung durch Zabbix per Email und SMS.
Melden beide APC's einen Stromausfall und sinkt die Batteriekapazität
einer APC unter 45% startet Zabbix ein externes Script (Python) das mit Hilfe des Projekte 'pysphere' auf die VM-Umgebung zugreift.
1. Das Python-Skript ermittelt alle Hosts des HA-Clusters
2. Das Script ermittelt auf welchem Host der VC-Server läuft
3. Es kann eine Liste der VM's vorgegeben werden, die in genau der Reihenfolge herunter gefahren werden
4. Es werden alle übrigen VM's heruntergefahren (unabhängig von der Liste)
5. Die VM-Hosts werden herunter gefahren, so Bald die VM's heruntergefahren sind (der auf dem der VC-Server lauft als Letzter).
Der Code ist 100%ig noch deutlich verbesserungsfähig, aber ich bin nur Hobbyprogrammierer (Hauptsache es läuft...

)
Nehme aber gerne jeden Verbesserungsvorschlag an!!!
Bisher konnte ich das Ganze nur mit max. 2 Hosts und ausgewählten VM's testen, da wir hier im Augenblick auch am WE arbeiten.
Ich hoffe, dass ich über Ostern mal den kompletten Shutdown testen kann. Evtl. gibt es ja vorher noch einen Stromausfall und ich kann Euch das Ergebnis mitteilen.
Gruß
Dirk
Code: Alles auswählen
#!/usr/bin/python
from pysphere import VIServer, VIProperty, VIMor, VITask
from pysphere.vi_virtual_machine import VIVirtualMachine
from pysphere.resources import VimService_services as VI
import sys
import string
import time
### Reihenfolge der VMS die durch das Script heruntergefahren werden
### VMx = Name der virtuellen Maschine unter den VC-Optionen
vmlist = ["VM1", "VM2", "VM3", "VM4", "VM5", "VM6"]
### Name des vCenter Servers
### VMx = Name der virtuellen Maschine unter den VC-Optionen
vcserver = "VMx"
server = VIServer()
### Anmeldedaten fuer VCenter bzw. VM-Host
server.connect("xxx.xxx.xxx.xxx.", "USER", "PASSWORD")
def shutdown_vm(vms):
# Wenn VM eingeschaltet herunterfahren
if vms.get_status() == "POWERED ON":
i = 1
# 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()
# Warten bis VM heruntergefahren
while vms.get_status() == "POWERED ON":
# 10 sek. warten
time.sleep(10)
# Wenn nach 120 sek. VM nicht heruntergefahren ist abbrechen
i = i + 1
if i == 12:
break
# VMTOOLS laufen nicht, VM ausschalten
except:
vms.power_off()
i = i + 1
while vms.get_status() == "POWERED ON":
# 10 sek. warten
time.sleep(10)
# Wenn nach 60 sek. VM nicht im Status ausgeschaltet ist abbrechen
i = i + 1
if i == 6:
break
return 0
else:
return -1
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)
### Hosts herausfinden MOR und in Liste schreiben
hostlist = server.get_hosts().keys()
### Host herausfinden auf dem VCServer laeuft
vm = server.get_vm_by_name(vcserver)
host_vc = vm.properties.runtime.host._obj
### VMS in geplanter Reihenfolge herunterfahren
for x in vmlist:
vm = server.get_vm_by_name(x)
nRes = shutdown_vm(vm)
### alle uebrigen laufenden VMS 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:
print vm.get_property('name', from_cache=False)
nRes = shutdown_vm(vm)
### Hosts in den Maintenancemode schalten (Host, Timeout in Sekunden, Evakuierung (True/False))
for x in hostlist:
if x <> host_vc:
enter_maintenance_mode(x, 0, 0)
### Host ausschalten (Host, Force (True/False))
for x in hostlist:
if x <> host_vc:
shutdown_host(x, -1)
### Host auf dem vCenter laeuft herunterfahren
shutdown_host (host_vc, -1)
server.disconnect()