Perl Script für eigenen Check taucht nicht auf

Hallo Leute,
ich versuche vorgefertigte perl-scripte in mein checkmk einzubauen.

Installiert ist de RAW 1.6.0p17, ich habe schon einige Hosts hinzugefügt und erwarte eigentlich, dass die Checks unter “Manuelle Checks” auftauchen.

Die Perl-Scripte habe ich auf dem Server unter /omd/sites/meinsitename/local/lib/nagios/plugins abgelegt.

Müssen die Perl-Scripte noch angepasst werden zB. mit einem <<>> oder was muss ich tun, damit sie in CheckMK auftauchen? Ist es richtig, dass ich sie eigentlich unter Manelle Checks sehen müsste? Wo kann ich die Commands und Services für die Checks definieren?

OS Version ist Ubuntu 20.04.1 LTS.

Vielen Dank schon mal für Eure Hilfe,
Gruss
Martin

Hier eins der Scripte:
#!/usr/bin/perl -w

use strict;
use IO::Socket::INET;

sub pexit($) {
$_ = shift;
my $retcode = 3; # UNKNOWN
SWITCH: {
m/OK/ && do {$retcode = 0; last SWITCH;};
m/WARNING/ && do {$retcode = 1; last SWITCH;};
m/CRITICAL/ && do {$retcode = 2; last SWITCH;};
}
print $_ . “\n”;
exit $retcode;
}

if ($#ARGV != 2) {
pexit “UNKNOWN: Hostname, port number, and/or server ID argument is missing.”;
}

my $socket = new IO::Socket::INET(
PeerHost => “$ARGV[0]”,
PeerPort => “$ARGV[1]”,
Proto => ‘tcp’,
);
pexit “UNKNOWN: failed to connect: $!” unless $socket;

my $msgStr = sprintf("%03dDo a ping, please, for server %s", length("$ARGV[2]"), “$ARGV[2]”);
$socket->send("$msgStr");
$socket->shutdown(1);

my $response = “”;
pexit “UNKNOWN: failed to read: $!” unless defined $socket->recv($response, 4096);
pexit “UNKNOWN: received empty response” unless $response ne “”;

$socket->close();

pexit $response;

Hi,

Manuelle Checks haben nichts mit den alten Nagios Checks zu tun, sonder basieren auf Check_MK Plugins. Möchtest du deine Check ausführen, so muss du diesen via Datasource Program ausführen.

Viele Grüße,
Christian

1 Like

Danke für die Info, dann hab ich mit Datasource Program einen Begriff den ich scuhen kann.

Für mich klingt das auch ein bisschen nach einem “Special Agent”, aber vielleicht täusche ich mich. Wobei ein Datasource Program ja auch ein Special Agent ist.

Vielleicht hilft dir folgendes:

Normalerweise macht checkmk ja im Prinzip nichts anderes als netcat -N $HOSTADDRESS$ 6556, um an den Agent-Output zu kommen. Mit einem Datasource Program sagst du, dass du lieber auf anderem Weg an die Daten kommen willst, z.B. mit ssh root@$HOSTADDRESS$ check_mk_agent oder eben über ein selbst geschriebenes Skript (oder binary). Der Output muss identisch mit dem des normalen Agents sein, d.h. mit <<<sections>>> usw.

Dieses selbst geschriebene Skript legt man am einfachten unter ~/local/bin des site-Nutzers ab (dann ist es im Suchpfad), aber es taucht nicht in irgendwelchen Listen/Übersichten von checkmk auf. Du musst vielmehr mit folgender Regel

image

festlegen, dass es aufgerufen werden soll.

Wenn Du es auf die Spitze treiben willst, kannst Du aber auch einen “richtigen” Special Agent schreiben statt den mitgelieferten “Datasource”-Special-Agent zu benutzen. Der ist dann richtig über die GUI konfigurierbar mit allem Pipapo, macht aber natürlich mehr Arbeit.


[EDIT]

Eben fällt mir auf, dass ein Datasource-Program ja nur die halbe Miete ist, denn das ist ja nur dafür da, die Daten zu beschaffen und nicht, um die Prüfungen durchzuführen. Du bräuchtest also noch ein passendes Check-Plugin dafür.

Also Kommando zurück und statt eines Datasource-Programs lieber einen “Active Check”. Mann, ist das kompliziert. Ein “Active Check” ist im Prinzip ein Skript, das Daten beschafft (z.B. via curl) und gleichzeitig auch auswertet und dann nur das Ergebnis der Auswertung nach stdout schreibt. In etwa so, wie ein local check, nur dass er auf dem Server läuft.

Hallo Dirk, vielen Dank für Deine Hinweise!

Hi,
du kannst auch “Datasource Program -> Individual program call …” nehmen und die Ausgabe auf Local Check umbauen:

<<<local>>>
0 MyService - My Test

oder mit Performance Daten

<<<local>>>
1 MyService count=1 My Test

Dann brauchst du keine weiteren check Module schreiben.

Viele Grüße,
Christian

1 Like

Neben den Vorschlägen von @ChristianM und @Dirk würde ich mir als erstes anschauen was meine Scripte tun sollen.
Dein Perl Beispiel macht ja nix anderes als einen TCP Connect auf einen bestimmten Port.
Dafür sind halt klassische Checks schon enthalten im System und müssen nicht neu “erfunden” werden. (check_tcp unter Classic Active and Passiv Nagios Checks)
Damit sparst dir auf jeden Fall eine Menge Arbeit.

Wenn alle die Scripte ausgesiebt sind welche eh schon an Funktion vorhanden sind dann würde ich für den Rest schauen ob ich diese weiterhin als Classic Checks ausführen will oder aber wie @ChristianM aufgezeigt hat dies als “Datasource Program” tun will.

Es gibt hier nur einen kleinen “Pferdefuß” bei der Regel “Individual program call instead of agent access”. Sobald diese Regel gesetzt ist wird dies auch wirklich behandelt wie ein CMK Agent und nicht wie ein xbeliebiges Datasource Program - bedeutet es gibt pro Host immer nur ein Script was mit dieser Regel ausgeführt wird. Dies ist noch ein Bug aus alten Zeiten. Die Regel sollte genau so behandelt werden wie jedes andere Datasource Program, da kann ich beliebig viele definieren und alle werden ausgeführt.

1 Like

Die Check-Scripts die mir vorliegen stammen von Siemens und sind eigentlich für Nagios gedacht.

Siemens hat für diese Scripte einen extra Proxy auf dem System wo auch CheckMK läuft installiert.

Es werden verschiedene Werte des PDM-Systems überwacht, mal sehen wie weit wir kommen.
Danke jedenfalls schon mal für alle Antworten!

Hi,
wenn es ein nagios check ist, dann kannst du auch “Classical active and passive monitoring checks” probieren. Hier kannst du die nagios checks mit aufrufen.

Viele Grüße,
Christian