Versetzt Hyper-V hosts mit pending reboots in den Wartungsmodus, startet diese neu und deaktiviert anschließend den Wartungsmodus wieder
Damit einher geht die Evakuierung der VMs vor dem Reboot und eine abschließende Clusteroptimierung:
<#——————————————————————————— Reboot-PendingBootSCVMHosts Skript Versetzt Hyper-V hosts mit pending reboots in den Wartungsmodus, startet diese neu und deaktiviert anschließend den Wartungsmodus wieder Damit einher geht die Evakuierung der VMs vor dem Reboot und eine abschließende Clusteroptimierung Ersteller: Oliver Sommer ———————————————————————————#> Clear-Host $VMHostNoClusters = $null $VMHostNoClusters =@() $VMHosts = $null $VMHosts =@() <# ---- Start Auskommentieren bei Verwendung der automatischen Hostliste weiter unten. ----- ## ---- Bei Verwendung der auto Hostliste einfach das in der nächsten Zeile am Ende nach # folgende > entfernen! ----- # $VMHosts += "Host012" $VMHosts += "Host023" <# ---- Ende Auskommentieren bei Verwendung der Auto Hostliste weiter unten -----#> <# ---- Start Auskommentieren bei Verwendung der manuellen Hostliste weiter oben. ----- ## ---- Bei Verwendung der manuellen Hostliste einfach das in der nächsten Zeile am Ende nach # folgende > entfernen! ----- #> # Automatisiertes Bestimmen welche Hosts 'Pending Reboots' haben: Write-Host "Alle Host der Domäne auf pending Reboot prüfen:" -ForegroundColor Green $AllVMHosts = Get-SCVMHost foreach ($AllVMHost in $AllVMHosts) { Write-Host Write-Host "Bestimme pending Reboot für: " $AllVMHost $PendingHost = Invoke-WmiMethod -ComputerName $AllVMHost -Namespace "ROOT\ccm\ClientSDK" -Class CCM_ClientUtilities -Name DetermineIfRebootPending If ($PendingHost.RebootPending -eq $true) { write-Host "Pending reboot: " $PendingHost.RebootPending -ForegroundColor Yellow $VMHosts += $PendingHost.__SERVER Write-Host "Füge" $PendingHost.__SERVER "der abzuarbeitenden Hyper-V Host Liste hinzu!" } Else { write-Host "Pending reboot: " $PendingHost.RebootPending -ForegroundColor Green } } <# ---- Ende Auskommentieren bei Verwendung der manuellen Hostliste weiter oben ----- #> Write-Host Write-Host "Hyper-V Hosts mit Pending reboot:" -ForegroundColor Yellow foreach ($VMHost in $VMHosts) { Write-Host $VMHost # Hole Hostobjekt zu jedem Host mit Pending Reboot, der Clustermitglied ist $VMHostobject = Get-SCVMHost -ComputerName $VMHost if ($VMHostobject.HostCluster -eq $null) { $VMHostNoClusters += $VMHost } } # Warnung ausgeben, falls nicht geclusterte Hosts erkannt wurden: If ($VMHostNoClusters -ne $null) { Write-Host Write-Host "Hosts die nicht Teil eines Hyper-V Clusters sind werden Fehler beim Wartungsmode Job erzeugen!" -ForegroundColor Red Write-Host "Die nicht geclusterten Server lauten:" -ForegroundColor Yellow Write-Host $VMHostNoClusters -ForegroundColor Yellow Write-Host } # Cluster array variable init, für späteres ClusterOptimizing $VMHostClusters = $null $VMHostClusters =@() #Write-Host ------------------------------------------------ Write-Host Write-Host "Start der Abarbeitung:" -ForegroundColor Yellow ForEach ($VMHost in $VMHosts) { $VMHostobject = Get-SCVMHost -ComputerName $VMHost Write-Host write-host Durchlauf für $VMHost : -ForegroundColor Green $MModeHost = $false Write-Host Bestimmen ob Host $VMHost bereits im MaintenanceMode ist... If ($VMHostobject.Overallstate -eq "MaintenanceMode") { $MModeHost = $true Write-Host $VMHost ist bereits im MaintenanceMode! -ForegroundColor Yellow } Else { Write-Host $VMHost bisher NICHT in MaintenanceMode! } If ($VMHostobject.HostCluster.Name -ne $null) { Write-Host write-host $VMHost ist Node im Cluster $VMHostobject.HostCluster.Name $VMHostClusters += $VMHostobject.HostCluster.Name <# Falls der Host durch Netbackup oder anderes VMs im (locked) mode haben sollte, hilft die folgende # Kill VMMs und start VMMs Routine ggf. dabei die VMs doch verschieben zu können # # Kill Prozess Virtual Maschine Management Service Write-Host Write-Host Kill Prozess VMMs auf $VMHost Invoke-Command -ScriptBlock {Stop-Process -name vmms -Force} -ComputerName $VMHost # Start Prozess VMMs Write-Host Write-Host Start Prozess VMMs auf $VMHost Invoke-Command -ScriptBlock {Start-Process vmms} -ComputerName $VMHost Write-Host Write-Host 10 Sekunden Pause zum Start des VMMs Service und Erkennen in SCVMM Start-Sleep -Seconds 10 # # Refresh Host, damit die SCVMM Verbindung wieder hergestellt ist bevor # Maintenance Mode aktiviert wird Write-Host Write-Host Führe Refresh-VMHost aus um die SCVMM Verbindung nach Kill VMMs sicherzustellen Read-SCVMHost -VMHost $VMHost >$null #> # Maintenance Mode im Cluster Write-Host write-Host Evakuierung und Wartungsmode von $VMHost wird eingeleitet.... -ForegroundColor Yellow If ($MModeHost -eq $false) { Disable-SCVMHost -VMHost $VMHost -MoveWithinCluster >$null } If ($VMHostobject.Overallstate -eq "MaintenanceMode") { Write-Host write-Host Neustart von $VMHost wird eingeleitet.... -ForegroundColor Yellow Restart-SCVMHost -VMHost $VMHost -Confirm:$false >$null # Härteres Herunterfahren via iRMC/iLO mit -UseOutOfBandChannel ggf. wie folgt: # Restart-SCVMHost -VMHost $VMHost -UseOutOfBandChannel -RunAsynchronously } If ($MModeHost -eq $false) { # Maintenance Mode beenden Write-Host write-Host Wartungsmode von $VMHost wird beendet.... -ForegroundColor Yellow Write-Host Enable-SCVMHost -VMHost $VMHost -RunAsynchronously >$null } Else { Write-Host $VMHost "befand sich vor dem Skritplauf schon im Maintenancemode, daher wird dieser nicht beendet..." -ForegroundColor Yellow } } else { Write-Host write-host $VMHost ist nicht geclustered!! -ForegroundColor Red } write-host ------------------------------ } # Cluster array variable sortieren und mehrfache Einträge entfernen, für anschließendes ClusterOptimizing $Clusters2Optimize = $VMHostClusters | Sort-Object -Unique Write-Host Write-Host "Alle Cluster der Hyper-V Hosts mit Pending Reboots:" Write-Host $Clusters2Optimize ForEach ($VMHostcluster in $Clusters2Optimize) { Write-Host Write-Host Opimierung für $VMHostcluster starten... -ForegroundColor Yellow $hostCluster = Get-SCVMHostCluster -Name $VMHostcluster Start-SCDynamicOptimization -VMHostCluster $hostCluster >$null } #>