Horizon Networklabel Monitoring

6. August 2018 at 15:00

Öfter möchte man bestimmt mehrere Netzwerke in einem Desktoppool innerhalb von VMware Horizon verwenden. Ein Grund dafür ist zum Beispiel das die zur Verfügung stehenden Subnetze recht klein sind oder man den zur Verfügung stehenden Adressraum möglichst effektiv nutzen möchte.

Standardmäßig wird die virtuelle Portgruppe der Master-VM an die provisionierte VM vererbt. Dieses Verhalten lässt sich aber ändern. Über die PowerCLI lassen sich mehrere Netzwerke einem Pool zuordnen. Die Daten darüber lassen sich auch wieder per CLI abfragen:
PS C:\Program Files\VMware\VMware View\Server\bin> Get-Pool | Select pool_id, networkLabelSpecs | fl

pool_id : WIN10_general01
networkLabelSpecs : [nl=192.168.10.X;nic=Netzwerkadapter
1;enabled=1;max=20;usage=15]

pool_id : WIN10_finance
networkLabelSpecs : [nl=192.168.10.X;nic=Netzwerkadapter
1;enabled=1;max=15;usage=5]

pool_id : WIN10_sales
networkLabelSpecs : [nl=192.168.21.X;nic=Netzwerkadapter 1;enabled=1;
max=30;usage=15];[nl=192.168.10.X;nic=Netzwerkada
pter 1;enabled=1;max=40;usage=26]

PS C:\Program Files\VMware\VMware View\Server\bin>

Diese Daten lassen sich so aber nur schwer auswerten. Um dem Provisionierungsteam die Arbeit zu erleicherten (damit diese rausfinden können wie viele Adressen in einem Pool noch nutzbar sind und ab wann man eine Erweiterung der Netze planen muss), habe ich ein Script geschrieben, welches die Daten entsprechend aufbereitet:

$networkConfig = @{}
$parsedData = @()
$pools = Get-Pool
$pools | ForEach {
    $networkLabelSpecs = ($_ | Select networkLabelSpecs).networkLabelSpecs
    $poolID = $_.pool_id

    $networkConfig.Add($poolID, $networkLabelSpecs)
}

$networkConfig.GetEnumerator() | % {
    $poolID = $_.Key
    if($_.Value -ne "disabled" ) {
        $networkData = $_.Value -split "\]\;\["
        ForEach($networkLabel IN $networkData) {
            $networkLabelConfig = (($networkLabel -replace "\[","") -replace "\]","")
            $var1 = $networkLabelConfig -match 'nl=(.+);nic=(.+);enabled=(.+);max=(.+);usage=(.+)$'
            $poolData = @()
            $name = $Matches[1]
            $max = $Matches[4]
            $usage = $Matches[5]

            $object = New-Object System.Object;
            $object | Add-Member -type NoteProperty -name "Pool" -value $poolID
            $object | Add-Member -type NoteProperty -name "Netzwerk" -value $name
            $object | Add-Member -type NoteProperty -name "maximum" -value $max
            $object | Add-Member -type NoteProperty -name "Nutzung" -value $usage
            $object | Add-member -type NoteProperty -name "frei" -value ($max - $usage)

            $parsedData += $object
        }
    }
}

Das Script stellt die Daten in der Variable $parsedData bereit. Diese lassen sich beliebig weiterverarbeiten. Wir verwenden dies beispielsweise in Verbindung mit PRTG.
Für die Integration mit PRTG gibt es im Grunde zwei Möglichkeit.

  1. Die Einrichtung eines Custom Sensors (EXEXML) der das Powershell-Skript auf der Probe benötigt.
  2. Der Abruf der XML-Datei über einen HTTP-Sensor

In beiden Fällen muss eine entsprechende XML-Struktur generiert werden. Diese muss diesem Schema folgen: