Nachdem ich mich diese Woche mal wieder etwas mit einem meiner “Lieblingsthemen” beschäftigt habe möchte ich euch die neuesten Erkenntnisse natürlich nicht vorenthalten.
Also . . . Was bringt dir dieser Blogpost?
– Zeitersparnis beim Austüfteln der richtigen Powershell Syntax. Das war’s. Mehr nicht.
Reicht aber auch. Ich hätte mich gefreut wenn ich das so irgendwo gelesen hätte.
Kurze Erklärung: Ich war dabei ein Plugin zu schreiben, dass WMI-Tabellen abfragt, diese Auswertet und ein Ergebnis MIT Performancedaten an Icinga übergibt. Dazu schreibe ich verschiedene Dinge in ein Array und gebe sie am Ende des Plugins aus. An und für sich nicht schwer. Aber wie macht man es mit Powershell?
1.) Deklariere das Array RICHTIG, sonst geht’s nicht:
$perf_list = new-object 'System.Collections.Generic.List[string]'
2.) Schreibe die Daten hinein. Als erstes eine pipe, die die Perfdaten einleitet.
if ($perf) {$perf_list.add(@("`|"))} -> Pipe Zeichen ausgeben ist nicht einfach . . .
3.) Als nächstes dann die Performancedaten selber. Es geht hier um 3 Festplatten, denen jeweil drei Werte zugeordnet sind. Freier Platz, Warn- und kritischer Schwellwert. Die Ausgabe sollte dann so aussehen:
icinga@monitor0815:/usr/lib/nagios/plugins# ./check_nrpe -H 192.168.67.21 -p 5666 -c check_stuff -a “scripts\testps.ps1 -diskwarn 40 -diskcrit 30 -perf”
OK: |’DiskFree_Y:’=3025MB;1227.2;920.4 ‘DiskFree_X:’=3006MB;1227.2;920.4 ‘DiskFree_Q:’=467MB;203.2;152.4

4.) Und wird folgendermaßen korrekt ins Array geschrieben.
if ($perf) {$perf_list.add(@("DiskFree_"+$i.path+"="+$i.FreeSpace+"MB`;"+($i.TotalSize*$diskWarn/100)+"`;"+($i.TotalSize*$diskCrit/100)+" "))}
5.) Und so am Ende ausgegeben.
foreach ($i in $perf_list) {
#write-host "l"
write-host -NoNewLine $i
}

Doch leider hat es ziemlich lange gedauert bis ich zu diesem Ergebnis gekommen bin und mich vermutlich 5 Jahre meines lebens und 153 graue Haare gekostet.
Also spielen wir mal eine kurze Runde Fehlersuche: Wo ist der Unterschied zu oben ?
So hat’s nicht geklappt
icinga@monitor0815:/usr/lib/nagios/plugins# ./check_nrpe -H 192.168.67.21 -p 5666 -c check_stuff -a “scripts\testps.ps1 -diskwarn 40 -diskcrit 30 -perf”
OK: |’DiskFree’=0 ‘Y:’=3025MB;1227.2;920.4 ‘DiskFree’=0 ‘X:’=3006MB;1227.2;920.4 ‘DiskFree’=0 ‘Q:’=467MB;203.2;152.4

if ($perf) {$perf_list.add(@("DiskFree "+$i.path+"="+$i.FreeSpace+"MB`;"+($i.TotalSize*$diskWarn/100)+"`;"+($i.TotalSize*$diskCrit/100)+" "))}
Und so auch nicht . . .
icinga@monitor0815:/usr/lib/nagios/plugins# ./check_nrpe -H 192.168.67.21 -p 5666 -c check_stuff -a “scripts\testps.ps1 -diskwarn 40 -diskcrit 30 -perf”
OK: |’DiskFree_Y:’=3025MB;1227.2;920.4;1227.2;920.4

if ($perf) {$perf_list.add(@("DiskFree_"+$i.path+"="+$i.FreeSpace+"MB`;"+($i.TotalSize*$diskWarn/100)+"`;"+($i.TotalSize*$diskCrit/100)))}
Und so erst recht nciht . . . .
icinga@monitor0815:/usr/lib/nagios/plugins# ./check_nrpe -H 192.168.67.21 -p 5666 -c check_stuff -a “scripts\testps.ps1 -diskwarn 40 -diskcrit 30 -perf”
OK: |’DiskFree’=0 ‘Y:’=3025MB;1227.2;920.4 ‘X:’=3006MB;1227.2;920.4 ‘Q:’=467MB;203.2;152.4

if ($perf) {$perf_list.add(@("DiskFree "+$i.path+"="+$i.FreeSpace+"MB`;"+($i.TotalSize*$diskWarn/100)+"`;"+($i.TotalSize*$diskCrit/100)))}
Es gab noch mehr verrückte Formatierungen, auf die ich gestoßen bin. Aber ich will euch nicht langweilen . . .
Letztendlich war ich positiv überrascht, das man mit etwas Aufwand doch recht angenehm unter Windows scripten kann.

Christoph Niemann
Christoph Niemann
Senior Consultant

Christoph hat bei uns im Bereich Managed Service begonnen und sich dort intensiv mit dem internen Monitoring auseinandergesetzt. Seit 2011 ist er nun im Consulting aktiv und unterstützt unsere Kunden vor Ort bei größeren Monitoring-Projekten und PERL-Developer-Hells.