Aktionen

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.


1 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.


2 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!


3 Vorraussetzungen

  1. Einen Rechner/Server mit Installierten USV Shutdown-Programm welches unser Script ausführt (Bare-Metall bevorzugt)
  2. Installierte VMware Remote CLI (z.B. VMware-vSphere-CLI-5.5.0-1384587.exe)
  3. 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.



3.1 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();




3.2 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%



3.3 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)



Ozryel

40 Monaten zuvor
Punktzahl 0++

Sehr schönes Tutorial, aber wie sieht es aus, wenn nicht alle ESX-Maschinen das gleiche Passwort haben?

Muss man dann auch mit ; getrennt Username und Passwort auflisten? Oder ist die Nutzung einer Credstore dann nicht besser, da die Passwörter dann nicht im Klartext gespeichert werden? Hierfür müsste man wahrscheinlich alles in Perl halten.

BLinz

40 Monaten zuvor
Punktzahl 0++

man könnte vor jedem Aufruf der einzelnen Server an passender Stelle ein neues

set PASSWORD_ESX=passwort

einfügen :-)

Das dieses hier unter Windows läuft / entwickelt wurde ist Absicht.

fischervitaly@gmail.com

18 Monaten zuvor
Punktzahl 0++

Bei mir funktioniert nicht. Könnt ihr nachvollziehen, was ich falsch getan?

Startzeit: 07.07.2017 --- 11:16:29,82 Setzte Variablen .... Ermittle die vorhandenen VMs auf den ESXi Servern, es werden alle Windows und Linux VMs ermittelt. . Bin in Schleife "VMeinlesen" Frage Host ab: 192.168.101.17 Das System kann den angegebenen Pfad nicht finden. loesche alte, eventuell vorhandene Merk-Dateien (welche VM's erfolgreich herunte gefahren wurden) Nachfolgende "Datei nicht gefunden" Meldungen sind KEIN Fehler! Bin in Schleife "Merkdateienloeschen" l÷sche Datei: shutdown_192.168.101.17.txt Das System kann die angegebene Datei nicht finden. Fahre nun alle gefundenen VMs herunter Bin in Schleife "VMsHerunterfahren" Die Datei "C:\Scripts\192.168.101.17_vm.txt" kann nicht gefunden werden. Zwischenzeit: 07.07.2017 --- 11:16:29,85 Herunterfahren der VM's abgeschlossen. Warte vor dem Herunterfahren der ESXi-Hosts fuer 60 Sekunden

...
Kommentar hinzufügen
znilwiki freut sich über alle Kommentare. Sofern du nicht anonym bleiben möchtest, trage deinen Namen oder deine Email-Adresse ein oder melde dich an. Du kannst das Feld auch einfach leer lassen.