NSClient++ und darüber hinaus

nsclient-logoFür viele verschiedene Anwendungsgebiete bringt NSClient++ schon Funktionen mit, mit Hilfe derer man direkt und ohne Probleme Dinge wie Festplattenauslastung, CPU, Memory, Services und Logs abfragen kann.
Heute soll es einmal um die Themen gehen, die der NSClient nicht “out of the box” beherrscht.  Vor allem im Bereich der Client Überwachung gibt es hier noch ungenutztes Potential:

1.) Security Center

Mit Hilfe von WMI ist es auf einfache Weise möglich auf Windows Clients ab Vista zu überprüfen wie der Antivirus Status ist. Hierfür gibt es einen namespace “root\SecurityCenter2” mit der Klasse AntiVirusProduct. Hier kann man den Schlüssel ProductState überprüfen. Die Interpretation dieses Wertes ist nun leider nicht durchgängig Dokumentiert und sollte gegen das eigene Antivirus Produkt nochmal gegen geprüft werden.
Folgende Artikel können hierbei hilfreich sein:

2.) Windows Updates

Hierfür gibt es ein Powershell Plugin, dass einem beantwortet ob Updates anstehen oder ein reboot seiner Durchführung harrt. Da es mit dem Original Plugin von Jules ein paar bekannte Performance Probleme gibt empfehle ich hier die verbesserte Version von redbranch[Jonny]

3.) GPO – Gruppenrichtlinien

Bei den Gruppenrichtlinien handelt es sich um ein Server/Client basiertes System zur Verteilung von Windows Konfigurationsobjekten. Auf dem Client sollte man daher überprüfen, ob der Service zur Umsetzung dieser Konfigurationsanweisungen überhaupt läuft. Das lässt sich bequem mit dem NSClient++ erreichen indem man den Service “gpsvc” überprüft. Ob wirklich alle Richtlinien umgesetzt wurden kann man am besten auf dem Server überprüfen. Dazu im nächsten Teil der Serie mehr.

WMI reparieren

Sollte es einmal Probleme mit dem Windows Management Intrumentarium geben und man weiß nicht wie dieses zu reparieren ist, sollte man sich mal das Diagnose- und Repair-Tool von Microsoft hierfür anschauen.
 
Im nächsten Teil dieser Serie geht es um Advanced Windows Server Monitoring. Insbesondere wird es hierbei um GPOs und Windows Updates aus der Sicht der Servers gehen.

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.

Weekly Snap: Ldirectord, WMI monitoring & OpenNebula

weekly snap16 – 20 September offered monitoring variety- with tips, presentations and the Monitorama in Berlin alongside an OpenNebula webinar and new tricks on Raspberry Pi.
On the event circuit, Bernd, Julian and Michael reported back from Monitorama EU and Eva counted 43 days to the OSMC 2013 with Erol Ülükmen’s presentation on “Monitoring IT Infrastructure with Opsi”
Christoph then showed how to monitor WMI with Perl on Windows, while Markus played with load balancing on Raspberry Pi using ldirectord,
Lastly, Christian uploaded the video of our second OpenNebula webinar to our website and Youtube channel and Nadja, our newest apprentice to the office introduced herself.

Monitor WMI mit perl unter windows

Es gibt 1000 und einen Weg Windows zu überwachen. Heute möchte ich euch zeigen wie es möglich ist mit WMI und Perl an ein Fülle von Daten zu kommen.
Zuerst einmal muss perl unter Windows installiert werden. Auf perl.org bekommt man eine Übersicht welche Versionen es für Windows gibt. Ich bevorzuge Strawberry Perl für Windows, da es zu 100% OpenSource ist.
Wenn man nsclient benutzt kann man sich auch überlegen es in ein Unterverzeichnis zu installieren. Es reicht prinzipiell es dort hin zu kopieren und die richtigen Abhängigkeiten mit zu installieren. Vor allem Modul Win32::OLE ist hierbei wichtig. Im Beispiel-Command weiter unten liegt perl unterhalb von nsclient im verzeichnis “extra”
Wenn perl installiert ist braucht man noch das plugin. Ich habe eins geschrieben, dass check_wmi_range.pl heißt und diverse Werte nach bestimmten Regeln abruft,auswertet und ausgibt. Es lässt sich auf hier von netways.org herunterladen
Da das Plugin aufgerufen werden möchte sollte man ein paar commands in die nsclient.ini eintragen.
Ein allgemeines Command zum aufruf von perl scripten sieht so aus:
call_perl=extra\Perl\bin\perl.exe -I extra\perl\lib -I extra\perl\site\lib $ARG1$
Der Aufruf von check_wmi_range.pl sieht dann folgendermaßen aus:
define command {
command_line $USER1$/check_nrpe -u -t 40 -H $HOSTADDRESS$ -c call_perl -a 'scripts/check_wmi_range.pl -w "$ARG1$" -c "$ARG2$" -C "$ARG3$" -o "$ARG4$" $ARG5$'
command_name win-wmi-range
}

Die Hilfe zum plugin lässt mit ./check_wmi_range.pl –help aufrufen oder hier nachlesen.

HELP
check_wmi_range.pl 0.55 - checks one wmi object per instance against a threshold
Options are:
  -c, --critical                  Enter the critical threshold
  -w, --warning                   Enter the warning threshold
  -C  --class                     Enter the WMI class
  -o  --object                    Enter the WMI object
  -e  --exclude                   Enter a regex to exclude instances
        to exclude more than one instance write -e "(instance1|instance2)"
  -i  -- include                  Enter a regex to include instances
        other Instances will be skipped
  -t  --no_Total                  hide the _Total instance
  -z  --zero                      hide zero values
  -s  --sleep                     run twice and sleep between the iterations <time to sleep>
  -I  --idle-contra-indicator     designed for proc_process. Check's if there's enough idle time left <threshold>
        It becomes critical if the real idle time of the last free core falls below threshold
  -n, --no-perf-data              no performance data
  -v  --verbose                   verbose mode
  -h, --help                      display this help and exit
      --usage                     display a short usage instruction
  -V, --version                   output version information and exit
Requirements:
 A fully qualified wmi String consists of \Class\Instance\Object\Value
 This plugin uses perl and DBD::WMI to get values from multiple WMI Instances for each object.
 A working WMI counter is for example Win32_PerfFormattedData_Tcpip_NetworkInterface\<InstanceName>\BytesTotalPersec
 In most cases you want to exclude the "_Total" instance ( -t).
Examples:
 Physical disktime:
  Class = Win32_PerfFormattedData_PerfDisk_PhysicalDisk
  Object = percentdisktime
  cmd: perl -w check_wmi_range.pl -w 10 -c 20 -C Win32_PerfFormattedData_PerfDisk_PhysicalDisk -o percentdisktime -t
 Interface Traffic:
  Class = Win32_PerfFormattedData_Tcpip_NetworkInterface
  Object = BytesTotalPersec
  cmd: perl -w check_wmi_range.pl -w 1000000 -c 1500000 -C Win32_PerfFormattedData_Tcpip_NetworkInterface -o BytesTotalPersec
 Process CPU usage:
  Class = Win32_PerfFormattedData_Perfproc_Process
  Object = PercentProcessorTime
  cmd: perl -w check_wmi_range.pl -w 10 -c 20 -C Win32_PerfFormattedData_Perfproc_Process -o PercentProcessorTime -t -e Idle -z -I 60
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.

Letzte Ausfahrt PowersHell

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.

Serie NSClient++ – Teil 10: Neues vom NSClient++

Da der letzte Teil der Serie NSClient++ schon etwas länger her ist und ich diese Woche größtenteils mit diesem kleinen Stück Software verbracht habe, möchte ich heute mal aktuelle Erfahrungen und Verbesserungen kund tun.

magical WMI module

Bei der Überwachung von Windows Maschinen hat man, wie schon mal hier im Blog geschrieben, die Auswahl zwischen dem sogenannten “agentenlosen Monitoring”, wie WMI oder SNMP oder man benutzt einen Tool wie den NSClient++. Oft liegt die Sache aber nicht so klar auf der Hand und man entscheidet sich im Nachhinein, dass man, obwohl man im Prinzip auf den Agenten setzt, doch noch WMI Abfragen machen möchte. – Und da der Agent ja schon mal drauf ist möchte man diesen auch benutzen.
NSClient++ bietet hierfür das CheckWMI Modul und hat seit Version 0.4 mächtig dazugelernt.
Mit dem folgenden Command kann man auf der CLI z.B. die vorhandenen WMI namespaces abfragen.

C:\Program Files\NSClient++> nscp.exe WMI --list-all-ns -n root
# Hilfe:
C:\Program Files\NSClient++> nscp.exe WMI -- --help

Was vorher im Prinzip auch schon funktionieren sollte, es jedoch leider nicht tat, ist diese nicht Standard-Namespaces über check_nrpe abzufragen. Als Beispiel eine Abfrage auf ClusterRessourcen in einem Windows Failover-Cluster.

# check_nrpe -H  -c checkwmi -a namespace=root/MSCluster "Query=Select * from MSCluster_NodeToActiveResource"

Real-Time Eventlog-/Logfilemonitoring

Eine weitere Neuerung seit 0.4 ist das Realtime Monitoring. Man kann logfiles und eventlog aktiv auf Änderungen Überwachen. NSClient++ nutzt hierfür den notify-Mechanismus des Kernels und bekommt einen Write so innerhalb von Null,Nix mit.
Als Targets können ein NSCA oder ein File sowie der neue NSClient-SimpleCache dienen.
Michael Medin hat die Einrichtung in seinem Blog gut beschrieben daher verzichte ich hier mal auf eine genaue Beschreibung.

Security Security

NSClient kann jetzt auch SSL mit CA und allem drum und dran. Allerdings hat Michael auch hierzu schon was viel besseres geschrieben, so dass es nicht nötig ist das hier nochmal abzuschreiben.

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.