check_mk – Nagios ganz einfach

Mit check_mk wird das Monitoring mit nagios zum Kinderspiel. Durch eine einfache Konfigurationsdatei steuert man ein Konfigurationswerkzeug, dass dann nahezu alleine die Konfiguration für nagios erstellt.

Die Konfiguration von check_mk erfolgt in der Datei main.mk. Ein sehr umfassendes Beispiel dazu:

# -*- encoding: utf-8; py-indent-offset: 4 -*-
# Liste der zu Prüfenden Geräte (PC, Server, Switch, Router ...)
# Entweder nur 'name' oder mit Tag: 'name|win'
all_hosts = [
	'server|win|nodhcp',
	'lancom1721|lcos',
]

# Prüfung auf neue Checks all X Minuten
inventory_check_interval = 120

# Verhindern von unnötigen Fehlmeldungen durch Anpassungen der Dienste
extra_service_conf["max_check_attempts"] = [
	("3", ALL_HOSTS, "PING"),
	("2", ALL_HOSTS, "Check_MK"),
]

# IP Adressen von Geräten ohne DNS A Eintrag
ipaddresses = {
	"server" : "192.168.7.2",
	"lancom1721" : "192.168.7.1",
}

# SNMP Communities
snmp_communities = [
	# Bei Lancom Routern ist eine SNMP Abfrage nur mit dem Passwort als Community moeglich
	( "LANCOMPASSWORT", [ "lcos" ], ALL_HOSTS ),
]

# Welche Geräte hängen von einander ab
parents = [
	# Alle haengen vom Router ab
	( "lancom1721", ALL_HOSTS ),
]

# Ignorienen von checks
#ignored_checks = [
#	(["check_mk-win_dhcp_pools.stats"], ["nodhcp"], ALL_HOSTS),
#]

# Hostgruppen
define_hostgroups = True

host_groups = [
	( "SERVER", [ 'win' ], ALL_HOSTS ),
]

# Dienstgruppen
define_servicegroups = True

service_groups = [
	( 'Dateisysteme_Win', [ 'win' ], ALL_HOSTS, [ "fs_" ] ),
	( "ExchangeDienste", [ 'win' ], ALL_HOSTS, ["service_MSExchange"] ),
	( "SwyxDienste", [ 'win' ], ALL_HOSTS, ["service_IpPbx"] ),
	( "SwyxFaxDienste", [ 'win' ], ALL_HOSTS, ["service_IpPbxFax", "!service_IpPbx"] ),
]

# Alias
extra_host_conf["alias"] = [
        ( "lancom1721", [ "Lancom 1721 Router" ] ),
]

# Bilder
extra_host_conf["icon_image"] = [
	( "base/win40.png", ["win"], ALL_HOSTS ),
	( "base/lancom-lcos.png", ["lcos"], ALL_HOSTS ),
	( "base/switch40.png", ["switch"], ALL_HOSTS ),
	( "base/hpux.png", ["ilo"], ALL_HOSTS ),
	( "base/hp-printer40.png", ["printer"], ALL_HOSTS ),
]

extra_host_conf["icon_image_alt"] = [
	( "Windows", ["win"], ALL_HOSTS ),
	( "LCOS", ["lcos"], ALL_HOSTS ),
	( "Switch", ["switch"], ALL_HOSTS ),
	( "HP ILO", ["ilo"], ALL_HOSTS ),
	( "HP Drucker", ["printer"], ALL_HOSTS ),
]

extra_host_conf["vrml_image"] = [
	( "base/win40.png", ["win"], ALL_HOSTS ),
	( "base/lancom-lcos.png", ["lcos"], ALL_HOSTS ),
	( "base/switch40.png", ["switch"], ALL_HOSTS ),
	( "base/hpux.png", ["ilo"], ALL_HOSTS ),
	( "base/hp-printer40.png", ["printer"], ALL_HOSTS ),
]

extra_host_conf["statusmap_image"] = [
	( "base/win40.png", ["win"], ALL_HOSTS ),
	( "base/lancom-lcos.png", ["lcos"], ALL_HOSTS ),
	( "base/switch40.png", ["switch"], ALL_HOSTS ),
	( "base/hpux.png", ["ilo"], ALL_HOSTS ),
	( "base/hp-printer40.png", ["printer"], ALL_HOSTS ),
]

# Arbeitsspeicher Level
memory_win_default_levels = {
   "memory"   : (95, 98.0), # alert at 80%/90% usage
   "pagefile" : (512, 256), # alert, if less then 2/1 GB free
}

# Dateisystem Level
# Vorsicht - je nach check_mk Version anders!
filesystem_default_levels["levels"] = (95, 98)

# Anpassungen an Checks
#check_parameters = [
#	Dateisystem Fuellstand Warnung 95%, Fehler 98% beim Tag win
#	( (95, 98), [ "win" ], ALL_HOSTS, [ "fs_" ] ),
#	Alle anderen Warnung 95%, Fehler 97%
#	( (95, 97), ALL_HOSTS, [ "fs_" ] ),
#]

# Anpassungen am Log
logwatch_patterns = {
	'System': [
		( 'I', 'PlugPlayManager Beim Senden der Benachrichtigung der Zielger.*' ),
		( 'I', 'TermServDevices.*' ),
		( 'I', '.*Der Drucker.*' ),
		( 'I', '.*schen des Druckers .*' ),
		( 'I', 'Der Redirectordienst konnte den Verbindungstyp nicht erkennen.' ),
		( 'I', 'W3SVC Bei einem Prozess .* Anwendungspool "DefaultAppPool" hat .* des Herunterfahrens ein Zeitlimit .*' ),
	],
	'Application': [
		( 'I', 'Windows_Server_Update_Services Clientcomputer installieren Updates mit einer Fehlerrate von mehr als.*' ),
	],
	'Security': [
		( 'I', '.*nnimann OC Anmeldetyp: 3.*' ),
		( 'I', '.*192.168.70.116.*' ),
	]
}

# Ignorieren von Diensten
ignored_services = [
	# Kein DHCP bei Tag nodhcp
	(["nodhcp"], ALL_HOSTS, "DHCP Stats"),
]

Man kann Windows Dienste überwachen – dafür muss man check_mk nur mitteilen, welche Dienste interessant sind. Hierfür ist die Konfigurationsanweisung inverntory_services. Um diese einfach mit Leben zu füllen kann man sich wie folgt die Dienste auf einem Windows Rechner ausgeben lassen (HOSTNAME  bitte durch den Gerätenamen ersetzen):

check_mk -d HOSTNAME | grep running | awk '{print $1}'

Für Tippfaule auch komplett:

echo -e "inventory_services = [\n"; check_mk -d HOSTNAME | grep running | awk '{printf "\t\"%s,\"\n",$1}'; echo -e "]\n"

In der main.mk werden diese dann wie folgt eingetragen – und nur aktivierte Dienste werden auch geprüft:

inventory_services = [
   'Browser',
   'Dfs',
   'Dhcp',
   'RpcSs',
   'Schedule'
]

Wenn man die Konfiguration fertig hat, lässt man check_mk die Geräte inventarisieren, erzeugt die nagios Konfiguration und lädt nagios neu mit den Befehlen:

check_mk -I
check_mk -O

Nachtrag:

Für die ganz eiligen – mit diesem Skript erzeugt man eine Liste aller Dienste der in check_mk eingetragenen Geräte:

#!/bin/sh
echo "Sammeln von Windows Dienst Namen aus check_mk Hosts..."
rm -f dienste.mk
rm -f dienste_temp

# Alle check_mk Hosts durchgehen
for host in `check_mk --list-hosts`; do
        echo "Durchsuche Host=${host}"
        check_mk -d $host | grep running | awk '{printf "\t\"%s\",\n",$1}' >> dienste_temp
done

# Sortieren und Duplikate entfernen
echo "inventory_services = [" >> dienste.mk
cat dienste_temp | sort | uniq >> dienste.mk
echo "]" >> dienste.mk
rm -f dienste_temp >> dienste.mk
cat dienste.mk
# Liste der zu Prüfenden Geräte (PC, Server, Switch, Router …)
# Entweder nur ’name‘ oder mit Tag: ’name|win‘
all_hosts = [
’server|win|nodhcp‘,
‚lancom1721|lcos‘,
]# Pruefung auf neue Checks all X Sekunden
inventory_check_interval = 120# Verhindern von unnoetigen Fehlmeldungen durch Anpassungen der Services
extra_service_conf[„max_check_attempts“] = [
(„3“, ALL_HOSTS, „PING“),
(„2“, ALL_HOSTS, „Check_MK“),
]

# IP Adressen von Geräten ohne DNS A Eintrag
ipaddresses = {
„server“ : „192.168.7.2“,
„lancom1721“ : „192.168.7.1“,
}

# SNMP Communities
snmp_communities = [
# Bei Lancom Routern ist eine SNMP Abfrage nur mit dem Passwort als Community moeglich
( „LANCOMPASSWORT“, [ „lcos“ ], ALL_HOSTS ),
]

# Welche Geräte haengen von einander ab
parents = [
# Alle haengen vom Router ab
( „lancom1721“, ALL_HOSTS ),
]

# Ignorienen von checks
#ignored_checks = [
#    ([„check_mk-win_dhcp_pools.stats“], [„nodhcp“], ALL_HOSTS),
#]

# Create all needed host groups
define_hostgroups = True

host_groups = [
( „SERVER“, [ ‚win‘ ], ALL_HOSTS ),
]

# Alias
extra_host_conf[„alias“] = [
( „lancom1721“, [ „Lancom 1721 Router“ ] ),
]

# Bilder
extra_host_conf[„icon_image“] = [
( „base/win40.png“, [„win“], ALL_HOSTS ),
( „base/lancom-lcos.png“, [„lcos“], ALL_HOSTS ),
( „base/switch40.png“, [„switch“], ALL_HOSTS ),
( „base/hpux.png“, [„ilo“], ALL_HOSTS ),
( „base/hp-printer40.png“, [„printer“], ALL_HOSTS ),
]

extra_host_conf[„icon_image_alt“] = [
( „Windows“, [„win“], ALL_HOSTS ),
( „LCOS“, [„lcos“], ALL_HOSTS ),
( „Switch“, [„switch“], ALL_HOSTS ),
( „HP ILO“, [„ilo“], ALL_HOSTS ),
( „HP Drucker“, [„printer“], ALL_HOSTS ),
]

extra_host_conf[„vrml_image“] = [
( „base/win40.png“, [„win“], ALL_HOSTS ),
( „base/lancom-lcos.png“, [„lcos“], ALL_HOSTS ),
( „base/switch40.png“, [„switch“], ALL_HOSTS ),
( „base/hpux.png“, [„ilo“], ALL_HOSTS ),
( „base/hp-printer40.png“, [„printer“], ALL_HOSTS ),
]

extra_host_conf[„statusmap_image“] = [
( „base/win40.png“, [„win“], ALL_HOSTS ),
( „base/lancom-lcos.png“, [„lcos“], ALL_HOSTS ),
( „base/switch40.png“, [„switch“], ALL_HOSTS ),
( „base/hpux.png“, [„ilo“], ALL_HOSTS ),
( „base/hp-printer40.png“, [„printer“], ALL_HOSTS ),
]

# Anpassungen an Checks
check_parameters = [
# Dateisystem Fuellstand Warnung 95%, Fehler 98% beim Tag win
( (95, 98), [ „win“ ], ALL_HOSTS, [ „fs_“ ] ),
# Alle anderen Warnung 95%, Fehler 97%
( (95, 97), ALL_HOSTS, [ „fs_“ ] ),
]

# Anpassungen am Log
logwatch_patterns = {
‚System‘: [
( ‚I‘, ‚PlugPlayManager Beim Senden der Benachrichtigung der Zielger.*‘ ),
( ‚I‘, ‚TermServDevices.*‘ ),
( ‚I‘, ‚.*Der Drucker.*‘ ),
( ‚I‘, ‚.*schen des Druckers .*‘ ),
( ‚I‘, ‚Der Redirectordienst konnte den Verbindungstyp nicht erkennen.‘ ),
( ‚I‘, ‚W3SVC Bei einem Prozess .* Anwendungspool „DefaultAppPool“ hat .* des Herunterfahrens ein Zeitlimit .*‘ ),
],
‚Application‘: [
( ‚I‘, ‚Windows_Server_Update_Services Clientcomputer installieren Updates mit einer Fehlerrate von mehr als.*‘ ),
],
‚Security‘: [
( ‚I‘, ‚.*nnimann OC Anmeldetyp: 3.*‘ ),
( ‚I‘, ‚.*192.168.70.116.*‘ ),
]
}

# Ignorieren von Diensten
ignored_services = [
# Kein DHCP bei Tag nodhcp
([„nodhcp“], ALL_HOSTS, „DHCP Stats“),
]

Nachtrag zu SSH:

Eine gute Anleitung zur Verwendung von check_mk mit SSH: https://ostlogd.spenneberg.net/wordpress/?p=726