Powershell: Hyper-V hosts mit ausstehenden Neustarts (pending Reboots) erkennen, evakuieren und automatisiert Neustarten
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
}
#>
Schreibe einen Kommentar