Kategorien
Hyper-V PowerShell Windows Server

PowerShell Workflow

Heute ein kleiner Code-Schnipsel zum Thema „PowerShell Workflow“ zur Beschleunigung von PowerShell Scripten.

Das folgende PowerShell Script war der erste Ansatz um das DVD Laufwerk in allen VMs in unseren beiden Clustern zu entsorgen. Warum? Verbundene DVD Laufwerke oder auch gemountete Images können gerne Probleme verursachen. Da bei uns „lediglich“ Menschen arbeiten, wird nach einem Einsatz gerne vergessen, die DVD „zu entnehmen“ oder eben das Laufwerk aus der VM zu entfernen.

$Clusters = @("cluster01", "cluster02")
$ClusterHosts = $null

foreach($Cluster in $Clusters){
    $ClusterHosts += Get-ClusterNode -Cluster $Cluster | where { $_.State -eq "Up" }
}
foreach($ClusterHost in $ClusterHosts){
    $VMs = $(Get-VM -ComputerName $ClusterHost | where { $_.Generation -eq 2 -and $_.ReplicationMode -eq "None" -and $_.DVDDrives })
    foreach($VM in $VMs){
        Get-VMDvdDrive -ComputerName $VM.ComputerName -VMName $VM.VMName | Remove-VMDvdDrive
    }
}

Dieser PowerShell Code-Schnipsel benötigt für unsere beiden Cluster mit insgesamt 11 Hosts knapp drei Minuten (2 Minuten und 40 Sekunden, um genau zu sein) und wurde mit „Measure-Command“ gemessen:

Measure-Command -Expression {
    # Hier steht der PowerShell Code von oben :)
}

Für die Beschleunigung bedienen wir uns hier „einfach“ dem PowerShell Workflow, Parallel und ForEach Parallel:

Mit dem neuen, optimiertem Code-Ausschnitt beträgt die Laufzeit jetzt nur noch etwas mehr wie eine Minute. Und zwar 1:17:

$Clusters = @("cluster01", "cluster02")

workflow removeVMDVDDrives
{
    Param(
        [string[]]
        $HyperVHosts
    )

    parallel { 
        foreach -parallel ($HyperVHost in $HyperVHosts) {
            $VMs = Get-VM -ComputerName $HyperVHost | where { $_.Generation -eq 2 -and $_.ReplicationMode -eq "None" -and $_.DVDDrives }
                foreach -parallel ($VM in $VMs){
                    Get-VMDvdDrive -ComputerName $HyperVHost -VMName $VM.VMName | Remove-VMDvdDrive
                }
        }
    }
    return $results
}

[string[]]$ClusterHosts = @()
foreach($Cluster in $Clusters){
    $ClusterHosts += Get-ClusterNode -Cluster $Cluster | where { $_.State -eq "Up" }
}

removeVMDVDDrives -HyperVHosts $ClusterHosts

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.