plexi87
Goto Top

Hyper-V Cluster und APC PowerChute Network Shutdown 4.3

Liebe IT-Kollegen

Wir haben 2 Hostsysteme, welche zu einem Hyper-V Cluster verbunden sind. Darauf sind ca. 20 virtuelle Maschinen (Server 2012 - 2019).
Soweit so gut.

Nun zu meiner Aufgabe:
Sicheres Herunterfahren der virtuellen Maschinen in einer vorgegebenen Reihenfolge, bevor die Hostsysteme später ebenfalls heruntergefahren werden.

Anscheinend gibt es bei Hyper-V keine Möglichkeit, die Reihenfolge beim Herunterfahren zu steuern wie dies bei VMware der Fall ist.
Im Internet gibt es zwar schöne Anleitungen zum Thema, aber wie es scheint, interessiert es niemanden, in welcher Reihenfolge sie heruntergefahren werden.


Was ich gemacht habe:
  • Meine Suche hat ergeben, dass man bei Hyper-V wohl mit Skripten arbeiten muss, um mein Ziel zu erreichen??!
  • Nach PowerShell-Befehlen gesucht, mit denen man eine virtuelle Maschine herunterfahren kann.
  • Ein CMD erstellt, welches ein PowerShell Skript starten soll, da die USV Software nur CMD oder BAT-Files umgehen kann.

Ich habe mich natürlich ein wenig an die Sache herangetastet und mit der manuellen Ausführung nachfolgenden Codes in PowerShell begonnen (Auf dem Host 1):
Stop-VM "SERVER1" -ComputerName 192.168.1.11  --> Funktioniert --> Host 1 war der OwnerNode  der VM 

Stop-VM "SERVER1" -ComputerName 192.168.1.12  --> Funktioniert --> Host 2 war der  OwnerNode der VM 


Danach habe ich mir die Frage gestellt, wie ich SERVER1 herunterfahren kann, wenn ich nicht weiss auf welchem Host er gerade läuft? Bei Stromausfall ja auch nicht bekannt. Somit habe ich das hier versucht:
Stop-VM "SERVER1" -ComputerName 192.168.1.11, 192.168.1.12  --> Funktioniert   


Durch das mitgeben beider Host-IPs, wird auf Host 1 zwar nichts gefunden (sofern Server1 auf Host 2 ist), was ein Fehler generiert, die zweite IP ist jedoch erfolgreich und fährt das System herunter.

Voller Vorfreude habe ich also alle meine VMs erfasst und einen manuellen Test durchgeführt. Perfekt. Alle VMs werden richtig heruntergefahren, egal ob sich diese gerade auf dem Host 1 oder Host 2 befinden, da ich ja jeweils beiden Hosts den Befehl gebe.


Mein Problem:
Führe ich den Shutdown Test mit der PowerChute Software durch, werden nur Server heruntergefahren, welche sich auf dem Host 1 befinden.
Zuerst dachte ich an ein Berechtigungsproblem, weswegen ich den PowerChute Service sogar als Domänen Administrator laufen liess. Leider auch ohne Erfolg.
Danach habe ich gedacht, es liegt an einer Einschränkung in PowerShell, wonach das Skript vielleicht auch mit zu wenig Rechten ausgeführt wird. Also habe ich mein CMD-File wie folgt erweitert:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""C:\Repository\Shutdown.ps1""' -Verb RunAs}"  

Manuelle Ausführung = Funktioniert --> Server auf Host 1 UND Host 2 werden sauber heruntergefahren.
Automatische Ausführung = Nur Server auf Host 1 werden heruntergefahren.

Keine Ahnung ob ich mich auf dem totalen Holzweg befinde, aber ich weiss wirklich nicht mehr weiter und bitte um Erfahrungswerte oder Lösungen. Habe schon viel zu viel Zeit damit verbraten!

Besten Dank im Voraus!

Content-Key: 570133

Url: https://administrator.de/contentid/570133

Printed on: April 19, 2024 at 06:04 o'clock

Member: jsysde
Solution jsysde May 07, 2020 updated at 19:26:28 (UTC)
Goto Top
N'Abend.

Du musst dein Cluster erstmal fragen, auf welchem Node die VM grad "lebt":
https://social.technet.microsoft.com/Forums/en-US/e60d32d9-3f8a-4bd9-928 ...

$a = Get-ClusterGroup | Where-Object {$_.Name -like "server1" -and $_.State -eq 'Online'}  
$b = $a.OwnerNode
Stop-VM -Name "vm1" -ComputerName $b  

Cheers,
jsysde
Member: DerWoWusste
DerWoWusste May 07, 2020 at 19:32:37 (UTC)
Goto Top
Hi.

Erlaube die Frage, wozu Du die Maschinen herunterfahren möchtest.
Wenn die USV den Host runterfährt, suspendiert dieser (per default) die Maschinen - das funktioniert sehr gut und nach Ende des Stromausfalls machen sie automatisch nach dem Neustart des Hosts weiter, wo sie aufgehört haben. Dass dabei Dinge aus dem Tritt kommen, habe ich noch nie erlebt - Ihr hingegen schon? Wenn Du magst, sag mal an, wo's dabei denn Probleme gibt.
Member: Plexi87
Plexi87 May 08, 2020 updated at 15:44:02 (UTC)
Goto Top
Hallo Zusammen

@jsysde
Vielen Dank für den Lösungsvorschlag. Ich werde diesen ausprobieren und Rückmeldung geben. Aber noch zur Info: Ich hatte ja mein Skript so angepasst, dass der Befehl 2 mal gesendet hätte werden müssen. Also einmal an Host 1 und einmal an Host 2 und das hat ja in der manuellen Ausführung bestens funktioniert. Nur die Ausführung über das PowerChute von APC funktionierte nicht. Alle Server auf Node 2 blieben ON egal was ich machte. Selbst wenn ich im nachschaue wo der Server ist und nur diesen einen Befehl herausgebe, Node 2 interessierts nicht.

Kann man das Skript auch so gestalten, dass ich irgendwo eine Aufstellung aller Server machen kann (am besten in der gewünschten Stop-Reihenfolge) und das der Stop-VM Befehl diese Liste aus einem Array als Variable in einer Schlaufe abarbeitet?

PS: Sorry Skripten ist nicht gerade meine Stärke, deswegen die Frage.

@DerWoWusste
Zu deiner Frage... Angeblich kam es schon vor, dass Systeme nicht sauber suspendiert werden konnte, weil ein Programm oder Dienst auf der VM das verhindert hatte. Ein konkretes Beispiel habe ich da nicht. Meistens war es sehr Kundenspezifisch.

ABER:
Wir haben kundenspezifische Applikationen welche auf eine Datenbank zugreifen. Wenn diese nicht sauber heruntergefahren werden, kann es passieren, dass einige Tabellen danach korrupt sind. Deswegen muss ich zuerst den Client-Server herunterfahren und erst dann den Datenbank-Server. Nur so gibt es keine nachträglichen Schäden. Man kann natürlich auch auf den Hersteller losgehen und behaupten, seine Software sei ### programmiert aber dazu habe ich keine Zeit.

Grüsse
Plexi87
Member: DerWoWusste
DerWoWusste May 08, 2020 at 18:08:08 (UTC)
Goto Top
Das sind Gerüchte. Suspend ist der Default aus gutem Grund. Unsere Datenbanken machen das seit Ewigkeiten mit.

Nicht sauber suspendiert? Hab ich in >10 Jahren Hyper-V noch nie erlebt.
Member: Plexi87
Plexi87 May 11, 2020 at 13:55:08 (UTC)
Goto Top
Hallo Zusammen

@DerWoWusste
Nun ich glaube dir, nur ist es wohl schwierig meine Vorgesetzten davon zu überzeugen... Werde es aber gerne nochmals so kommunizieren.

Auch wenn deine Lösung wohl üblich ist, ich verstehe trotzdem nicht, warum ich von Host 1 aus keine VM herunterfahren kann, welche sich gerade auf Host 2 befindet. Auch mit dem oben genannten Skriptaufbau funktioniert es nur "manuell" und nicht während der Shutdown-Phase.

Das Problem muss irgendwo bei APC PowerChute liegen, denn ich weiss nicht was ich da sonst noch machen könnte.

Host 1 = PowerChute drauf --> Shutdownbefehl des Hosts nach 8 Minuten ohne Strom --> Das Skript wird bereits bei 4 Minuten ohne Strom ausgeführt. Das bedeutet, die VMs haben 4 Minuten Zeit über das Skript heruntergefahren zu werden. 2 Minuten Später geht es bei Host 2 weiter.
Host 2 = PowerChute drauf --> Shutdownbefehl des Hosts 2 nach total 10 Minuten ohne Strom --> Kein Skript hinterlegt
Host 3 = PowerChute drauf --> Shutdownbefehl des Hosts 3 nach total 12 Minuten ohne Strom --> Kein Skript hinterlegt

Wie bereits gesagt, funktioniert das ganze ohne Probleme, wenn ich mein Skript manuell auf dem Host 1 ausführe. Keine Berechtigungsfehler oder sonst was. Die VMs werden anstandslos heruntergefahren, egal wo sich diese befinden. Deswegen hatte ich auch versucht den PowerChute Dienst mit höheren Berechtigungen auszuführen statt "System". Hat keine Änderung gebracht.

Kann das irgendjemand nachstellen und bestätigen oder sonst noch eine Idee?

Vielen Dank im Voraus für jede Hilfe!

Grüsse
Plexi87
Member: DerWoWusste
DerWoWusste May 11, 2020 at 14:28:05 (UTC)
Goto Top
Ich habe nicht alles gelesen, trotzdem vermute ich, dass das Systemkonto des PCs, der die anderen runterfahren soll, nicht als dazu berechtigt eingetragen ist bei den anderen PCs. Öffne dort secpol.msc und geh zu Zuweisen von Benutzerrechten und trag runterfahrpcname$ ein unter "Herunterfahren des Systems" ein.
Member: Plexi87
Plexi87 May 11, 2020 updated at 14:57:34 (UTC)
Goto Top
Kannst du mir das nochmals etwas klarer erklären? Also auf Host 2 secpol.msc öffnen und Host 1 als berechtigter Servername eintragen? Aber wo genau hab ich nicht verstanden.

EDIT: Lokale Richtlinien --> Zuweisen von Benutzerrechten --> Herunterfahren des Systems richtig?


Grüsse
Member: DerWoWusste
DerWoWusste May 11, 2020 at 15:04:47 (UTC)
Goto Top
Dein Edit ist richtig.
Member: Plexi87
Plexi87 May 11, 2020 at 18:10:19 (UTC)
Goto Top
Hatte leider auch keinen Erfolg. Wenn ich als Domänen-Administrator nicht die nötigen Rechte hätte, müsste doch die manuelle Ausführung auch nicht funktionieren. Ich müsste dann eine Meldung erhalten, dass der Befehl Netzwerkübergreifend nicht funktioniert.

Ich muss wohl mal schauen, ob es Bezüglich "Stop-VM" hostübergreifende Einschränkungen gibt. Kann doch nicht so schwer sein... face-sad

Der Eintrag beim Herunterfahren des Systems hängt wohl eher mit dem Hostsystem zusammen und nicht mit den darauf laufenden VMs welche über den Hyper-V Cluster Manager verwaltet werden nicht?

Grüsse
Plexi87
Member: DerWoWusste
DerWoWusste May 11, 2020 updated at 18:27:35 (UTC)
Goto Top
Du verwirrst mich nun.

Was hat Dein Domänenadminkonto, welches Du für die manuelle Ausführung nutzt, welche erfolgreich läuft, damit zu tun?
Du kannst diesen Befehl entweder als Nutzer von remote absetzen, oder als Systemkonto, ebenso von remote.
Auf dem Zielsystem (ja, auf der VM), muss dann eben dieses Konto das Recht zum Runterfahren haben und ich kann dir garantieren, dass es auch funktioniert - wir machen es so.

Wo startest Du denn das Skript?
Member: Plexi87
Plexi87 May 12, 2020 at 09:44:20 (UTC)
Goto Top
OK Sorry für die Unklarheiten. Ich versuche es nochmals:

1.
Wenn ich das Skript manuell teste, dann bin ich als Domänenadministrator auf Host 1 eingeloggt. Ich starte das CMD-File durch einfachen Doppelklick ohne "Run As", da ich ja schon als Domänenadministrator angemeldet bin. Nun kann ich im Cluster Manager sehen, wie die einzelnen VMs heruntergefahren werden, egal ob diese gerade auf dem Host 1 oder Host 2 laufen (Owner Host).

So, bis dahin alles ok! Habe ich ja mehrmals geschrieben.

2.
Den PowerChute Dienst von APC (unter Services.msc) habe ich ebenfalls so geändert, dass dieser unter dem Domänenadministrator-Konto läuft und nicht als lokaler Systemdienst.

3.
Wenn mein Skript nun automatisch von der PowerChute Software auf HOST 1 nach 30 Sekunden Stromausfall ausgeführt wird, werden nur VMs von HOST 1 heruntergefahren, während VMs welche auf dem Host 2 laufen vom Skript einfach ignoriert werden.

Also:
Skript Befehl 1 = Shutdown VM 1 = Auf Host 1 = Shutdown
Skript Befehl 2 = Shutdown VM 2 = Auf Host 2 = Nichts passiert --> Skript läuft aber weiter
Skript Befehl 3 = Shutdown VM 3 = Auf Host 3 = Shutdown

4.
Auf den restlichen Host führe ich keine Skripte aus. Diese werden einfach mit genug Verzögerung heruntergefahren, dass sicher alle VMs aus dem Skript heruntergefahren werden konnten.

Soweit alles klar?

Besten Dank für deine Geduld!
Member: DerWoWusste
Solution DerWoWusste May 12, 2020 at 11:40:15 (UTC)
Goto Top
Kannst Du zur Laufzeit des Skriptes, also genau dann, wenn Die APC-Software es startet mal prüfen, unter welchem Nutzer es ausgeführt wird?
Member: Plexi87
Plexi87 May 12, 2020, updated at May 15, 2020 at 08:28:31 (UTC)
Goto Top
Das kann ich gerne machen sobald ich wieder in der Firma bin. Aktuell ist gerade Home-Office angesagt und ohne direkten Kontakt zur USV kann ich die Ausführung nicht auslösen.

EDIT und LÖSUNG:

Mensch...Ich könnt mich glatt selbst in die Tonne schmeissen... Den Wald vor lauter Bäume nicht mehr gesehen...


1. Es muss zu Beginn meiner Tests mehrere Fehler gegeben haben, die zum Misserfolg führten.

2. Aus unerklärlichen Gründen, hat eine Überprüfung der PowerChute Berechtigungen ergeben, dass das Skript als Lokaler Systemdienst ausgeführt wird und doch nicht wie behauptet als Administrator. Ich habe den Dienst nochmals gestoppt, den Administrator nochmals sauber eingetragen und den Dienst nochmals neu gestartet. Danach funktionierte es!

Kurze Zusammenfassung:


1. PowerChute Dienst so konfigurieren, dass dieser auch sicher als Administrator oder mit vergleichbaren Rechten läuft.

2. Mein Skript wird wie folgt gestartet:
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""C:\Repository\APC_Shutdown_Script\Shutdown.ps1""' -Verb RunAs}"  

3. Ich habe im PowerShell Skript eine Zeile hinzugefügt, welche den aktuellen Benutzer ausgibt und in ein TXT File schreibt:
[Security.Principal.WindowsIdentity]::GetCurrent() > C:\Temp\APCSkript.txt

4. Ich fahre alle meine virtuellen Maschinen mit folgendem Befehl herunter:
$a = Get-ClusterGroup | Where-Object {$_.Name -like "Server 1" -and $_.State -eq 'Online'}  
$b = $a.OwnerNode
Stop-VM -Name "Server 1" -ComputerName $b  

$a = Get-ClusterGroup | Where-Object {$_.Name -like "Server 2" -and $_.State -eq 'Online'}  
$b = $a.OwnerNode
Stop-VM -Name "Server 2" -ComputerName $b  

usw...


Endlich funktioniert es! Vielen Dank! Man kann das ganze noch weiter verbessern und ausschmücken, aber ich bin Happy so!
Member: Plexi87
Plexi87 May 16, 2020 at 12:50:17 (UTC)
Goto Top
NACHTRAG:

Mittlerweile ist klar, warum der Dienst nicht mehr als Administrator eingetragen war. Zwischen den ganzen Beiträgen wurde die PowerChute Software von V.4.2 auf V.4.3 aktualisiert. Dies hat dazu geführt, dass der Dienst wieder unter dem Default System Account lief.

Nochmals vielen Dank für die Hilfe! Hoffe mein Nachtrag hilft jemandem, der den Fehler auch nicht so schnell bemerkt.
Member: freili
freili Aug 05, 2020 at 11:23:08 (UTC)
Goto Top
Hallo!

Es reicht völlig per Powershut die Hosts sauber herunter zu fahren. Ändere die Einstellungen der VM's, wenn Du diese ebenfalls sauber herunterfahren möchtest. Letzeres bevorzuge ich ebenfalls, da es mir bereits passiert ist, dass in Umgebungen mit Exchange der Exchange nach wieder hochfahren nicht sauber funktionierte.

Daher

get-vm | Set-VM -AutomaticStopAction Shutdown

und alle Maschinen stehen auf herunterfahren.

Gruß Freili
Member: Plexi87
Plexi87 Aug 07, 2020 at 12:22:39 (UTC)
Goto Top
Hallo Freili

Danke für die Info. Dein Vorschlag wurde bereits am Anfang des Themas erwähnt. Nur wollten meine Vorgesetzten, dass wir eine Möglichkeit finden, die Server in einer bestimmten Reihenfolge herunterzufahren.

Keiner will glauben, dass die Datenbanken kein Problem mehr damit haben.... Naja egal...

Grüsse
Plexi87