doskias
Goto Top

Linux-VMs auf ESX via Powershell herunterfahren

Hallo zusammen,

ich bin grade dabei ein Skript zu erstellen, welches nach Auslösung gewisser Parameter unsere virtuellen Server auf dem ESX herunterfahren soll und anschließend die ESX. Wir möchten dabei gerne die VMs gezielt herunterfahren und erst wenn dies abgeschlossen die ESX-Server.

Ich habe den Beitrag hier gefunden. Nach diesem Beitrag müsste das herunterfahren der ESX im letzten Schritt mittels
pLink.exe -ssh -pw MeinKennwort myuser@192.168.0.1 poweroff -f
durchführbar sein. Ich habe derzeit leider keinen Test-ESX, so dass ich es nicht testen kann. Wir werden das ganze irgendwann außerhalb der Arbeitszeit einmal testen, dann sehe ich ob es funktioniert.

Woran es grade scheitert ist das herunterfahren der VMs. Einen Großteil der VMs kann ich einfach und bequem mittels PS-Befehl stop-computer herunter fahren. Es verbleiben noch einige wenige VMs auf denen ein Linux-System läuft. Diese Systeme stammen von Herstellern und dienen verschiedenen Zwecken. Fakt ist: Die Installation von PowerShell auf Linux ist bei diesen Geräten nicht möglich.

Gemäß des Artikels bei VMWare habe ich mich mittels SSH auf dem Server eingeloggt. der Befehl
vim-cmd vmsvc/power.shutdown 40
führt erfolgreich dazu, dass der ESX-Server die entsprechende VM herunterfährt.

Mein Gedanke war, das ganze jetzt zu kombinieren und daraus folgendes zu formen:
 plink.exe -ssh -pw [Kennwort] Benutzer@ESX-Server vim-cmd vmsvc/power.shutdown 40

Ich erhalte daraufhin jedoch folgende Meldung:
plink.exe : -- Keyboard-interactive authentication prompts from server: ------------------
In Zeile:1 Zeichen:1
plink.exe -ssh-pw [Kennwort] Benutzer@ESX-Server vim-cmd vmsvc/power.shutdo ...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : NotSpecified: (-- Keyboard-int...---------------:String) , RemoteException
FullyQualifiedErrorId : NativeCommandError
-- End of keyboard-interactive prompts from server ---------------------------


Auch nachdem ich mich jetzt mehrfach durch die PLINK.EXE-Dokumentation gequält habe, verstehe ich nicht was ich an der Stelle falsch mache. Vielleicht kann der eine oder andere mir einen Tipp geben.

Gruß
Doskias

Nachtrag: Titel von Linux-VMs auf ESX via Powershell herunterfahren auf Linux-VMs auf ESX via Powershell herunterfahren geändert

Content-ID: 4324066130

Url: https://administrator.de/forum/linux-vms-auf-esx-via-powershell-herunterfahren-4324066130.html

Ausgedruckt am: 22.12.2024 um 08:12 Uhr

kreuzberger
kreuzberger 18.10.2022 um 14:15:22 Uhr
Goto Top
Doskias
Doskias 18.10.2022 um 14:17:29 Uhr
Goto Top

Hast du meinen Beitrag überhaupt gelesen?
4091525239
Lösung 4091525239 18.10.2022 aktualisiert um 15:44:14 Uhr
Goto Top
VMware PowerCLI™ ist dein Freund
Stop-VM
Stop-VMHost

p.s. da fehlt der Parameter -batch
plink.exe -ssh -pw [Kennwort] -batch Benutzer@ESX-Server "vim-cmd vmsvc/power.shutdown 40"  
Doskias
Doskias 18.10.2022 aktualisiert um 15:54:06 Uhr
Goto Top
Zitat von @4091525239:
VMware PowerCLI™ ist dein Freund
Ein trügerischer Freund face-wink

Erstmal hat es etwas gedauert, bis ich es auf dem betroffenen Server zum Laufen bekommen habe. Grund dafür war (hatte ich nicht geschrieben), dass auf dem Server, der das ganze ausführt noch ein kleiner (mit einer VM ausgestattet HyperV) läuft. das gab dann natürlich Konflikte bei den get-vm und anderen Befehlen. Lies sich aber mit dem Parameter -allowclobber überschreiben.
Jetzt muss ich auf dem Server mit VMware.VimAutomation.Core\Get-VM bzw. Hyper-V\Get-VM arbeiten, aber damit kann ich leben. Was mich jedoch stört ist:
Ich habe mit Stop-VM und einem "unwichtigen" Windows-Server einmal rumgespielt. Während vim-cmd vmsvc/power.shutdown 40 die VM mit der ID 40 sauber herunterfährt und ich sehen kann wie das System heruntergefahren wird, so führt Stop-VM zu einem abruptem Ende des Betriebs. Sprich: Hier erfolgt kein sauberes herunterfahren, sondern ein unerwartetes Ausschalten. Nach dem Neustart der VM werde ich entsprechend auch gefragt, wieso das Gerät nicht sauber herunter gefahren wurde. Also grundsätzlich: Ja, ich kann damit die VMs ausschalten, aber wie fahre ich sie gezielt und sauber herunter?

Wie ist das hier. Wird hier auch einfach ausgeschaltet oder sauber herunter gefahren?

Gruß
Doskias

Nachtrag:
Zitat von @4091525239:
plink.exe -ssh -pw [Kennwort] -batch Benutzer@ESX-Server "vim-cmd vmsvc/power.shutdown 40"  
Fast
plink.exe -ssh -pw [Kennwort] Benutzer@ESX-Server -batch "vim-cmd vmsvc/power.shutdown 40  
Danke, so gehts.
4091525239
4091525239 18.10.2022 aktualisiert um 16:21:03 Uhr
Goto Top
Zitat von @Doskias:
Fast
plink.exe -ssh -pw [Kennwort] Benutzer@ESX-Server -batch "vim-cmd vmsvc/power.shutdown 40  
Danke, so gehts.
Nöp die Optionen gehören vor den host ...
Usage: plink [options] [user@]host [command]
Bier fehlt das Anführungszeichen am Ende und die Option gehört vor den Host, Anführungszeichen sind zwar nicht zwingend aber bei manchen Befehlen nötig.
Crusher79
Crusher79 18.10.2022 aktualisiert um 16:21:00 Uhr
Goto Top
Bin etwas schreibfaul. Aus meinen PS extrahiert.

Hier mit ppk File.

ACHTUNG: Damit den Host vertraut wird, ggf. vorher einmal Putty so starten und "Accept" anklicken. Sonst wird die Verbindung nicht zu Stande kommen.

Befehle kann man durch ";" verketten.

Ansosnten "cmd /c" weg und in die Variable schauen. Dann kannst du den String auch jederzeit so in Batch abfeuern.

# putty Connection String
[string]$puttyUser = "root@web02"  
[string]$puttyKeyFile = "C:\scripts\putty-private.ppk"  
[string]$puttyPlink = "C:\ProgramData\chocolatey\bin\plink.exe"  
[string]$puttyCommand = "systemctl restart tomcat8"  

[string]$puttyCommandString = $($puttyPlink)+" "+$puttyUser+" -batch -i "+$puttyKeyFile+" ("+$puttyCommand+")"  
cmd /c $puttyCommandString
Crusher79
Crusher79 18.10.2022 um 16:49:33 Uhr
Goto Top
Zitat von @Doskias:
Wie ist das hier. Wird hier auch einfach ausgeschaltet oder sauber herunter gefahren?

https://scriptigator.com/2020/11/22/how-to-restart-reset-shutdown-powero ...

Da sind nochmal die Befehle alle erklärt.

Hier mal ein Beispiel wenn die Tools abgeschossen wurden und man die Maschine dann automatisch rebooten möchte.

ACHTUNG: Nur fix für eine. Man kann auch den Status für die Tools, "Needs Consolidation" etc. für alle abfragen und sich einen Array alle Maschinen aufbauen:

Import-Module -Name VMware.VimAutomation.Core

$Server = "vcenter"  

Connect-VIServer -Server $Server -User root@vcenter.xy.zz -Password geheim

$vm = 'mysql01'  
$toolsStatus = (Get-VM $VM).extensiondata.Guest.ToolsStatus
if (($toolsStatus -eq "toolsNotRunning") ) { Restart-VM $vm -Confirm:$false }  

Disconnect-VIServer -Server $Server -Confirm:$false

Hier mal ein Online Example, was man durch die Schleife auch auf VMs anwenden kann, die man zvor runterfährt, etwas mit ihnen tut und dann hochfährt.

ACHTUNG: Hier fehlt die Hälfte. Zuvor wurde Consolidate abgefeuert. Man kann über Get-Task sehen, wie weit die jeweiigen Aufgaben sind. Hier wird nur von einen laufenden Task ausgegangen.


Lässt sich noch verfeinern. Nach Ende der Aktion kann man z.B. die VM wieder starten etc.

Nur ein grobes Beispiel.

$task01 = Get-Task -Server $Server | ? { $_.State -eq 'Running' -and $_.Name -eq 'ConsolidateVMDisks_Task' }  

$task01.Description
$task01.Name
$task01.PercentComplete

while('Running','Queued' -contains $task01.State){  

    Write-Progress -Activity 'Creating VM' -PercentComplete $task01.PercentComplete  
    $task01.PercentComplete
    $task01.Description
    $task01.Name

    $task01 = Get-Task -Id $task01.Id

    Start-Sleep -Seconds 5

}
em-pie
Lösung em-pie 18.10.2022 um 17:20:05 Uhr
Goto Top
Zitat von @4091525239:

VMware PowerCLI™ ist dein Freund
Stop-VM
Stop-VMHost

ALSO ich würde ja, wenn die VMware-Tools auf den VMs installiert sind, den Befehl Shutdown-VMGuest nutzen wollen..
https://vdc-repo.vmware.com/vmwb-repository/dcr-public/3de791f2-edaf-4cd ...

auf diese Weise habe ich gerade ein Debian 11 als auch einen alten Win 2008R2 sauber heruntergefahren face-wink
Crusher79
Crusher79 18.10.2022 um 17:35:33 Uhr
Goto Top
Hab mir gerade die Frage nochmal genau durchgelesen.

Was ist mit Autostart und - in reverse - Auto Shudown? Dann passiert alles in einen Rutsch.

https://www.youtube.com/watch?v=qWyuXa85AIc

https://vmguru.com/2013/06/how-to-shutdown-esxi-host-in-case-of-a-power- ...
Th0mKa
Th0mKa 19.10.2022 um 13:12:44 Uhr
Goto Top
Zitat von @Doskias:
Ich habe mit Stop-VM und einem "unwichtigen" Windows-Server einmal rumgespielt. Während vim-cmd vmsvc/power.shutdown 40 die VM mit der ID 40 sauber herunterfährt und ich sehen kann wie das System heruntergefahren wird, so führt Stop-VM zu einem abruptem Ende des Betriebs. Sprich: Hier erfolgt kein sauberes herunterfahren, sondern ein unerwartetes Ausschalten. Nach dem Neustart der VM werde ich entsprechend auch gefragt, wieso das Gerät nicht sauber herunter gefahren wurde. Also grundsätzlich: Ja, ich kann damit die VMs ausschalten, aber wie fahre ich sie gezielt und sauber herunter?

Stop-VM ist das Äquivalent zum Power Off, was du suchst ist Shutdown-VMGuest.

VG,
Thomas
Doskias
Doskias 19.10.2022 um 15:19:27 Uhr
Goto Top
So.. das wird jetzt lang face-smile

Zitat von @4091525239:
Zitat von @Doskias:
Fast
plink.exe -ssh -pw [Kennwort] Benutzer@ESX-Server -batch "vim-cmd vmsvc/power.shutdown 40  
Danke, so gehts.
Nöp die Optionen gehören vor den host ...
Usage: plink [options] [user@]host [command]
Bier fehlt das Anführungszeichen am Ende und die Option gehört vor den Host, Anführungszeichen sind zwar nicht zwingend aber bei manchen Befehlen nötig.
Komisch und jetzt nicht mehr nachvollziehbar. Ich habe gestern deinen Code getestet und es ging nicht. Dann habe ich das -batch hinter den Host und vor den Code gestellt. Damit ging es dann, inkl. des hier fehlenden Anführungszeichens. Heute geht beides.

Weiter im Text:

Zitat von @em-pie:
ALSO ich würde ja, wenn die VMware-Tools auf den VMs installiert sind, den Befehl Shutdown-VMGuest nutzen wollen..
https://vdc-repo.vmware.com/vmwb-repository/dcr-public/3de791f2-edaf-4cd ...
Danke für den Hinweis. Auch das habe ich grade einmal getestet und es funktioniert. Allerdings habe ich das ganze nun schon auf den oben genannten Befehl via ssh gebaut. Ich werde mir mal anschauen was einfacher ist. Aber auch dein Weg funktioniert, sofern die VMWarwe-Tools installiert sind, was bei uns der Fall ist.

Derzeit sieht das Skript (im Bereich des Herunterfahrens wie folgt aus.
1. Es werden alle Server ermittelt, von allen ESX, die derzeit laufen. Und natürlich wo sie jetzt grade laufen, da sich im Laufe der Zeit ja auch VMs mal bewegen können

2. Da einige Server in Abhängigkeiten stehen, gibt es bei einigen Servern eine Abschaltreihenfolge, die eingehalten werden muss. Hier werden die einzelnen Server abgeschaltet, gewartet bis sie aus sind und dann geht es erst mit dem nächsten Server weiter. Die Prüfung mach ich an der Stelle bereits mittels get-vm, das herunterfahren mit Plink.exe.
Ich schaue also jeden Server in der Liste 1 nach auf welchem ESX er läuft, verbinde mich mit diesem ESX mittels plink -shh. Wenn ich das jetzt auf stop-guestvm, muss ich die Schleife ja jedes Mal um ein connect und disconnect erweitern. Tendiere grade dazu, es zumindest vorerst so zu belassen.

3. Es werden alle anderen Server heruntergefahren, bei denen es keine Abhängigkeiten gibt.

4. zuletzt werden die DC-VMs heruntergefahren

5. auf dem physischen Server wird die HyperV-VM heruntergefahren, via
Hyper-V\Get-VM |? state -match "running" | stop-vm   

6. Es wird gewartet bis alle HyperVs den Status "off" haben. Dann fährt sich der Server selbst herunter.

Zumindest in der Theorie sieht das ganze jetzt gut aus. Praxis Test erfolgt später erstmal in kontrolliertem Zustand face-wink


Zitat von @Crusher79:
Was ist mit Autostart und - in reverse - Auto Shudown? Dann passiert alles in einen Rutsch.
Auto-Start und Auto-Shutdown seitens der ESX-Server ist nicht erwünscht. Die Systeme sollen sauber heruntergefahren werden, bevor der ESX-Server herunter fährt. Ähnliches gilt für das Starten. Wenn die ESX aus waren, soll erstmal in Ruhe geklärt werden können, was der Grund war und anschließend die Server manuell hoch gefahren werden. Grade bei den Servern, die in Abhängigkeiten stehen und auf verschiedenen ESX laufen. Hier muss sichergestellt werden, dass alle Dienste laufen, bevor die anderen Server dazu kommen. Wir hatten das schonmal probiert und die automatisch gestarteten Server waren einfach zu schnell da und konnten dann keine Verbindung mit den Partner aufbauen. Daher soll Server A gestartet werden, manuell geprüft werden ob alles läuft, und erst dann soll Server B dazu kommen.

Da jetzt alles funktioniert, verteil ich mal Sternchen face-wink

Gruß
Doskias