Shutdown oder herunterfahren von VMs und ESX Hosts bei Stromausfall
Aus znilwiki
Dieser Artikel ist eine neuere Version des folgendes Artikel: Herunterfahren von VMs bei Stromausfall
Ich habe die Konfiguration vereinfacht - und eingebaut das man die ESX/ESXi Hosts gleich mit herunterfahren kann.
Vorwort
Wie verhalten bei Stromausfall? Natürlich sollten alle Server, das SAN und natürlich die auch die Switche (Netzwerk- und SAN-Switche) an eine Unterbrechungsfreie Stromversorgung (USV) angeschlossen werden.
Schnellste Lösung
Sie wollen das, auch wenn der Strom ausgefallen war, alles von alleine wieder hochkommt?
Dann machen Sie doch einfach - Nichts!
Der Strom fällt aus ... die USV läuft so lange sie kann - und geht auch aus.
Alle Server / Systeme etc sind somit auch auf einen Schlag ausgeschaltet.
Der Strom kommt wieder - die Server starten wieder von allein (Typisches Verhalten), SAN und Switche kommen wieder hoch.
Nachdem der erste ESX Server wieder hochgekommen ist, stellt VMware HA die Situation fest und was passiert ist - und startet alle VM's gemäß Plan wieder.
15 bis 30 Minuten nachdem der Strom wieder da ist, läuft alles wieder wie vorher.
Zu unsicher? Ok, dann fangen wir den Stromausfall ab und fahren alles geordnet herunter! Aber dann müssen wir auch von hand alles wieder hochfahren!
Vorraussetzungen
- Einen Rechner/Server mit Installierten USV Shutdown-Programm welches unser Script ausführt (Bare-Metall bevorzugt)
- Installierte VMware Remote CLI (z.B. VMware-vSphere-CLI-5.5.0-1384587.exe)
- Unten stehende Pearl-Datei und Script-Datei
Nach der Installation müsst Ihr unbedingt noch den folgenden Pfad zur Umgebungsvariable PATH
hinzufügen:
C:\Program Files\VMware\VMware vSphere CLI\bin
oder
C:\Program Files (x86)\VMware\VMware vSphere CLI\bin
Je nach Serverbetriebssystem müsst Ihr den Pfad wählen / anpassen. Wenn unter anderem die Datei
vicfg-hostops.pl
dort liegt ist es der richtige Pfad. Und ja, in der PATH
ist der schon vorhanden ... nein ist er nicht, das ist der Pfad zur Pearl.exe
Ausserdem kopiert Ihr die
C:\Program Files\VMware\VMware vSphere CLI\Perl\samples\vm\powerops.pl
oder
C:\Program Files (x86)\VMware\VMware vSphere CLI\Perl\samples\vm\powerops.pl
in das Verzeichnis in dem dann euer späteres Script liegen soll - es muss im gleichen Pfad wie die shutdown-vm.bat
liegen.
allvm.pl
Folgendes Script speichert Ihr euch ebenfalls im Pfad der shutdown-vm.bat
und dem Namen:
allvm.pl
#!/usr/bin/perl -w
#
# Copyright 2006 VMware, Inc. All rights reserved.
#
# This script prints names of all VM's with Windows guest
use strict;
use warnings;
use VMware::VIRuntime;
# read/validate options and connect to the server
Opts::parse();
Opts::validate();
Util::connect();
# get views of all VM's
my $vm_views =
Vim::find_entity_views(view_type => 'VirtualMachine',
filter => { 'guest.guestFullName' => qr/.*/ });
foreach (@$vm_views) {
print $_->name . "\n";
}
# disconnect from the server
Util::disconnect();
shutdown-vm.bat
Und hier die eigentliche Batch:
@echo off
REM **************************************************************************
REM VMware Shutdown
REM 2014 von Bernhard Linz / Bernhard.Linz@datagroup.de
REM 0172 / 41 91 338
REM **************************************************************************
REM notwendige Variablen #####################################################
REM ESXi Server - IP-Adressen der vorhandenen ESXi Server
Set IP_ESX=192.168.0.1;192.168.0.2;192.168.0.3
REM Benutzername + Passwort für ESXi Server
set USER_ESX=root
set PASSWORD_ESX=passwort
REM Wartezeit definiert wie lange zwischen dem Anstossen des Herunterfahrens der VM's und der ESX Host gewartet werden soll
REM Zeit entspricht ca. Sekunden.
Set WARTEZEIT=300
REM **************************************************************************
REM AB HIER NICHTS ÄNDERN ****************************************************
REM **************************************************************************
REM **************************************************************************
REM **************************************************************************
echo Startzeit: %DATE% --- %TIME%
echo Setzte Variablen ....
set SCRIPTPFAD=C:\Scripts
REM Teil 1 - Listen der VMs ermitteln
echo Ermittle die vorhandenen VMs auf den ESXi Servern, es werden alle
echo Windows und Linux VMs ermittelt.
echo .
call :SCHLEIFE1 "%IP_ESX%"
REM Teil 2 - ggf. Merklisten löschen
echo loesche alte, eventuell vorhandene Merk-Dateien (welche VM's erfolgreich heruntegefahren wurden)
echo Nachfolgende "Datei nicht gefunden" Meldungen sind KEIN Fehler!
call :SCHLEIFE2 "%IP_ESX%"
REM Teil 3 - VMs herunterfahren
echo Fahre nun alle gefundenen VMs herunter
call :SCHLEIFE3 "%IP_ESX%"
echo Zwischenzeit: %DATE% --- %TIME%
echo Herunterfahren der VM's abgeschlossen.
REM Teil 4 - ESXi Hosts herunterfahren
echo Warte vor dem Herunterfahren der ESXi-Hosts fuer %WARTEZEIT% Sekunden
echo ...
ping 127.0.0.1 -n %WARTEZEIT% >NUL
echo Fahre nun ESXi-Hosts herunter
call :SCHLEIFE4 "%IP_ESX%"
echo Zwischenzeit: %DATE% --- %TIME%
echo Herunterfahren der ESXi-Hosts abgeschlossen.
goto :ENDE
REM ###########################################################################################################
REM ###########################################################################################################
REM ###########################################################################################################
REM ###########################################################################################################
:SCHLEIFE1
setlocal
set list=%1
set list=%list:"=%
FOR /f "tokens=1* delims=;" %%a IN ("%list%") DO (
if not "%%a" == "" call :VMeinlesen %%a
if not "%%b" == "" call :SCHLEIFE1 "%%b"
)
endlocal
goto :EOF
:VMeinlesen
setlocal
echo Bin in Schleife "VMeinlesen"
echo Frage Host ab: %1
%SCRIPTPFAD%\allvm.pl --server %1 --username %USER_ESX% --password %PASSWORD_ESX% >%SCRIPTPFAD%\%1_vm.txt
endlocal
goto :EOF
:SCHLEIFE2
setlocal
set list=%1
set list=%list:"=%
FOR /f "tokens=1* delims=;" %%a IN ("%list%") DO (
if not "%%a" == "" call :Merkdateienloeschen %%a
if not "%%b" == "" call :SCHLEIFE2 "%%b"
)
endlocal
goto :EOF
:Merkdateienloeschen
setlocal
echo Bin in Schleife "Merkdateienloeschen"
echo lösche Datei: shutdown_%1.txt
del %SCRIPTPFAD%\shutdown_%1.txt
endlocal
goto :EOF
:SCHLEIFE3
setlocal
set list=%1
set list=%list:"=%
FOR /f "tokens=1* delims=;" %%a IN ("%list%") DO (
if not "%%a" == "" call :VMsHerunterfahren %%a
if not "%%b" == "" call :SCHLEIFE3 "%%b"
)
endlocal
goto :EOF
:VMsHerunterfahren
setlocal
echo Bin in Schleife "VMsHerunterfahren"
for /F "eol=#" %%i in (%SCRIPTPFAD%\%1_vm.txt) do call :SHUTDOWN_VM "%%i" %1 %SCRIPTPFAD%\shutdown_%1.txt %USER_ESX% %PASSWORD_ESX%
endlocal
goto :EOF
:SHUTDOWN_VM
echo Fahre auf Server %2 die VM %1 herunter ...
powerops.pl --operation shutdown --vmname %1 --username %4 --password %5 --server %2 >%SCRIPTPFAD%\shutdown.tmp
echo Prüfe ob Antoßen des Herunterfahrens erfolgreich war ...
find "is poweredOff" %SCRIPTPFAD%\shutdown.tmp
if %ERRORLEVEL%==1 echo %1 >> %3
echo Schreibe Maschine %1 in Datei %3 ...
goto :EOF
:SCHLEIFE4
setlocal
set list=%1
set list=%list:"=%
FOR /f "tokens=1* delims=;" %%a IN ("%list%") DO (
if not "%%a" == "" call :ESXiHerunterfahren %%a
if not "%%b" == "" call :SCHLEIFE4 "%%b"
)
endlocal
goto :EOF
:ESXiHerunterfahren
setlocal
echo Bin in Schleife "ESXiHerunterfahren"
echo Fahre Host %1 herunter
vicfg-hostops.pl --server %1 --username %USER_ESX% --password %PASSWORD_ESX% --operation shutdown --force
endlocal
goto :EOF
REM **************************************************************************************************************
:ENDE
echo Script beendet um: %DATE% --- %TIME%
Konfiguration
Ist ganz einfach - Ihr müsst nur 3 Zeilen anpassen:
Zunächst die Liste der DNS Namen oder der IP-Adressen der ESXi-Server (nicht des vCenters!)
Die Einträge einfach hintereinander mit ;
getrennt.
REM ESXi Server - IP-Adressen der vorhandenen ESXi Server Set IP_ESX=192.168.0.1;192.168.0.2;192.168.0.3
und noch die Zugangsdaten zum Server:
REM Benutzername + Passwort für ESXi Server set USER_ESX=root set PASSWORD_ESX=passwort
Das ist alles!
--Bernhard Linz 14:48, 7. Feb. 2014 (CET)