Zabbix: Zertifikate überwachen (und die Probleme mit Zabbix external Scripts)

In meinen Vor-Zabbix-Zeiten (das ist lange her) habe ich das “Monitoring des kleinen Mannes” mit lauter Cronjobs erledigt, die mir Mails schick(t)en. So schicken mit auch noch bis heute die Skripte zum Aktualisieren der Let’s-Entcrypt-Zertifikate wöchentlich Mails, die ich nicht lese(n will). Daher war nun eine Überwachung via Zabbix naheliegend.

Hier habe gefunden, wie man das mit Zabbix macht. Leider war das nicht ganz so straight forward wie erhofft:

  1. Zext_ssl_cert.sh herunterladen
  2. Auf dem zabbix-server ins externalscripts-Verzeichnis kopieren und ausführbar machen. Bei mir ging das so, weil es in einem Dockervolume liegt:
     mv zext_ssl_cert.sh /opt/dockervolumes/zabbix-int/usr_lib_zabbix_externalscripts/
     chmod +x /opt/dockervolumes/zabbix-int/usr_lib_zabbix_externalscripts/zext_ssl_cert.sh
    
  3. Zbx export templates.xml herunterladen

  4. In Zabbix als Zabbix-Template importieren
  5. Template zuweisen (ggf. Host anlegen)
  6. Bei mehreren verschiedenen Hostnamen auf der selben IP, muss das Macro {$SNI} gesetzt werden

Natürlich hat das nicht auf Anhieb geklappt. Debugging von externen Skripts bei Zabbix (insbesondere in der Docker-Umgebung) ist zeitraubend und wenig erquicklich. Was mich weiter gebracht hat:

  • Ausführen des “fraglichen” external Scripts per Hand:
    /usr/lib/zabbix/externalscripts/zext_ssl_cert.sh -d nerdblog.steinkopf.net 443 nerdblog.steinkopf.net
    
  • Ausführen des “fraglichen” external Scripts in der bash des Docker-Containers:
    docker-compose -f docker-compose-int.yml exec zabbix-server /usr/lib/zabbix/externalscripts/zext_ssl_cert.sh -d nerdblog.steinkopf.net 443 nerdblog.steinkopf.net
    
  • Log-Ausgabe des Docker-Containers:
    docker-compose -f docker-compose-int.yml logs -f zabbix-server
    
  • Danach hat mich immer noch diese Meldung gequält:
    nerdblog.steinkopf.net:zext_ssl_cert.sh[-d,{HOST.CONN},{$SSL_PORT},{$SNI}]" became not supported: Received value [sed: couldn't flush stdout: Broken pipe55] is not suitable for value type [Numeric (float)]
    
  • Etwas Besserung hat es gebracht, im Skript oben #! /bin/sh durch #!/bin/bash zu ersetzen. Es lief immer zeitweise durch und dann wieder nicht mehr.

  • Danach habe ich oben im Skript das Debug-Log aktiviert, in dem ich den DEBUG=1 gesetzt und den Pfad angepasst habe (so dass er innerhalb des Containers existiert und schreibbar ist):

    DEBUG=1
    if [ $DEBUG -gt 0 ]
    then
        exec 2>>/usr/lib/zabbix/externalscripts//tmp.log
        set -x
    fi
    

    Dort habe ich jedoch auch nur die Meldung “sed: couldn’t flush stdout: Broken pipe” gesehen – ohne zu verstehen, wo sie her kommt.

  • Letzendlich habe ich das nur gelöst, in dem ich stderr auf /dev/null umgeleitet habe. Fehler bekomme ich zwar trotzdem mit, aber dann wieder noch umständlicher. 🙁

Besonders ärgerlich ist das Problem, dass ich noch nicht herausgefunden habe, wann Zabbix fehlgeschlagene Skripts wiederholt. Das geht offenbar nicht nach den normalen Wiederholungszeiten. Manchmal musste ich >10 Minuten warten, obwohl 30 Sekunden eingestellt waren.

Aber jetzt läufts erstmal ! 🙂

Mit Zabbix Zertifikate überwachen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.