Ich stand vor der Aufgabe für unseren Serverraum eine Temperaturüberwachung in Icinga2 zu integrieren. Nach kurzer Recherche nach professionellen Lösungen, die bestenfalls mit SNMP abfragbar wären,
war für mich schnell klar, dass es hier jedenfalls keine kostengünstige Lösung geben werde. Daher entschied ich mich für ein kleines Rasperry Pi Projekt.
Gebraucht werden ein Rasperry Pi 3 mit Raspian-Linux, ein DS18B20 Temperaturfühler und ein 4,7kΩ Widerstand.
Den DS18B20 schließt ihr nach folgendem Schaltbild an:
PIN 1 (3,3V) – Vdd
PIN6 (Ground) – Ground
PIN7 (GPIO4) – DQ
Danach müsst ihr auf dem Raspberry Pi unter /etc/modules folgende Einträge hinzufügen:
1 2 3 |
wire w1_gpio w1_therm |
und in unter /boot/config.txt dies hier:
1 2 |
dtoverlay=w1-gpio gpiopin=4 |
Danach startet ihr euren Pi einmal neu.
Jetzt sollte unter /sys/bus/w1/devices/ euer Temperatursensor erscheinen. Beachtet, dass dieser bei euch sicherlich anders heißen wird.
1 2 3 4 5 6 7 8 9 10 |
root@RASPI-2:/# ls /sys/bus/w1/devices/28-00043e5901ff/ insgesamt 0 drwxr-xr-x 2 root root 0 Jan 8 19:05 . drwxr-xr-x 3 root root 0 Jan 8 19:05 .. lrwxrwxrwx 1 root root 0 Jan 8 19:05 driver -> ../../../bus/w1/drivers/w1_slave_driver -r--r--r-- 1 root root 4,0K Jan 8 19:05 id -r--r--r-- 1 root root 4,0K Jan 8 19:05 name lrwxrwxrwx 1 root root 0 Jan 8 19:05 subsystem -> ../../../bus/w1 -rw-r--r-- 1 root root 4,0K Jan 8 19:05 uevent -r--r--r-- 1 root root 4,0K Jan 8 19:05 w1_slave |
Solltet ihr hier nichts ähnliches angezeigt bekommen, habt ihr vermutlich ein Problem mit eurer Schaltung, oder die Module (wire, w1_gpio, w1_therm) wurden nicht geladen. Ihr könnt dies mit lsmod prüfen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
root@RASPI-2:/# lsmod Module Size Used by arc4 1718 0 ecb 1963 0 md4 3375 0 md5 1783 1 hmac 2835 1 nfnetlink_queue 10466 0 nfnetlink_log 8391 0 nfnetlink 5165 2 nfnetlink_log,nfnetlink_queue bluetooth 317981 0 rfkill 16036 1 bluetooth xt_multiport 1636 1 iptable_filter 1245 1 ip_tables 11417 1 iptable_filter x_tables 12611 3 ip_tables,xt_multiport,iptable_filter nls_utf8 1154 2 cifs 378555 3 bcm2835_rng 1763 0 bcm2835_gpiomem 2860 0 uio_pdrv_genirq 2944 0 uio 7753 1 uio_pdrv_genirq w1_therm 3396 0 w1_gpio 3401 0 wire 24703 2 w1_gpio,w1_therm cn 4258 1 wire snd_bcm2835 19802 0 snd_pcm 73474 1 snd_bcm2835 snd_timer 18848 1 snd_pcm snd 50779 3 snd_bcm2835,snd_timer,snd_pcm fuse 80694 1 ipv6 338660 84 |
Sieht es wie bei mir aus, habt ihr alles richtig gemacht und wir können mit der Einbindung in Icinga2 beginnen.
Ich habe dazu ein kleines Python Skript geschrieben, welches ihr auf dem Raspberry Pi unter /usr/lib/nagios/plugins ablegen solltet. Hier müsst ihr noch die Sensor-ID 28-0517a25c9eff durch eure ersetzen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#!/usr/bin/python # coding=utf-8 #---------------- import os, sys, time import argparse def aktuelleTemperatur(): # 1-wire Slave Datei lesen file = open('/sys/bus/w1/devices/28-0517a25c9eff/w1_slave') filecontent = file.read() file.close() # Temperaturwerte auslesen und konvertieren stringvalue = filecontent.split("\n")[1].split(" ")[9] temperature = float(stringvalue[2:]) / 1000 # Temperatur ausgeben rueckgabewert = '%6.2f' % temperature return(rueckgabewert) temp = float(aktuelleTemperatur()) parser = argparse.ArgumentParser() parser.add_argument('-w', '--warning', type=int, help='Warning', required=True) parser.add_argument('-c', '--critical', type=int, help='Critical', required=True) args = parser.parse_args() warn = float(args.warning) crit = float(args.critical) if temp > crit: print("CRITICAL - Die Temperatur liegt bei: " + str(temp) + '° | ' + "temp=" + str(temp) + ';' + str(warn) + ';' + str(crit) + ';') sys.exit(2) elif temp > warn: print("WARNING - Die Temperatur liegt bei: " + str(temp) + '° | ' + "temp=" + str(temp) + ';' + str(warn) + ';' + str(crit) + ';') sys.exit(1) elif temp < warn: print("OK - Die Temperatur liegt bei: " + str(temp) + '° | ' + "temp=" + str(temp) + ';' + str(warn) + ';' + str(crit) + ';') sys.exit(0) else: print("UNKNOWN") sys.exit(3) |
Danach legt ihr auf dem Icinga2-Server eine Host-Konfiguration an. Die IP-Adresse, sowie den Anzeigenamen müsst ihr natürlich an eure Umgebung anpassen.
1 2 3 4 5 6 7 8 |
object Host "raspi" { import "generic-host" display_name = "raspi" address = "10.10.3.50" groups = [ "linux" ] vars.os = "Linux" vars.sla = "24x7" } |
Danach passt ihr eure services.conf und eure commands.conf folgendermaßen an:
1 2 3 4 5 6 |
apply Service "check_temp" to Host { import "generic-service" check_interval = 60s check_command = "check_temp" assign where host.name == "tedosensor01" } |
1 2 3 4 |
object CheckCommand "check_temp" { import "plugin-check-command" command = "/usr/lib/nagios/plugins/check_by_ssh -u root -H $address$ -t 60 -C \"/usr/lib/nagios/plugins/check_temp.py -w 33 -c 35\"" } |
Die Werte für Warnung (-w) und Kritisch (-c) könnt ihr in der commands.conf nach euren Wünschen anpassen. Da der Sensor bei uns direkt hinter den Servern sitzt, ist der Wert recht hoch. Euer Nagios User auf dem Icinga2 Server muss ohne Eingabe eines Kennwortes per SSH auf den Raspi zugreifen können. Dies könnt ihr mit folgenden Befehlen machen:
1 2 |
su - nagios ssh-copy-id root@IP-EURES-RASPIs |
Jetzt prüft ihr einmal die Konfiguration und ladet die Icinga2 Konfiguration neu:
1 2 3 4 |
root@be-mon01:~# service icinga2 checkconfig [ ok ] checking Icinga2 configuration. root@be-mon01:~# service icinga2 reload root@be-mon01:~# |
Im Icinga2 sollte nun euer Sensor zu sehen sein:
Solltet ihr dazu Fragen haben, schreibt sie einfach in die Kommentare.