Icinga2 Ampelanbindung

Mit dem Dashboard für Icinga2 hat man ja schon eine schöne Möglichkeit sich eine gute Übersicht über den Systemstatus der überwachten Systeme zusammenzustellen.

Ich wollte jedoch eine weiteres Benachrichtigungssystem über eine Straßenampel realisieren.

Keine Angst diese Ampel fehlt jetzt nicht auf der Straße sondern wurde während des Studiums aus einem Müllcontainer bei Siemens gerettet. Die Lampen können über ein Relais das an einem Raspberry Pi angeschlossen ist über eine Web Anwendung individuell geschaltet werden und sind zusätzlich noch über einen Dimmer in der Helligkeit reguliert.

Dabei sollten nicht pauschal jeder “Alert” mit Rot/Gelb auf der Ampel angezeigt werden sondern es sollten nur bei bestimmten Alerts einer der Leuchten angehen.

  • Ampel Rot Dauerleuchten = Fehler mit sofortige Benachrichtigung

  • Ampel Rot Blinken => Fehler auf die man schauen sollte

  • Ampel Gelb = Warnungen bei denen man mal beizeiten drauf schauen sollte

Bei den Kommandos und Befehlen kann man noch etwas optimieren aber bis das mal passiert …..

Das Perl Programm das die Ampelleuchten schaltet basiert auf dieser Lösung ist so aufgebaut

  #!/usr/bin/env perl
  use version; our $VERSION = qv("1.0");
  use HTTP::Request::Common qw(POST);
  use LWP::UserAgent;
  use strict;
  use warnings; 
  my $api_url    = 'http://pi:8080/';
  my $api_path   = '0/';
  my $timeout = 180;
  my ($status) = @ARGV;
  my $kommando = do {
                      if( $status eq "OK" ) { 'Off' }
                          else         { 'On' }
                     };
  my $server_endpoint = ($api_url . $api_path .$kommando );
  my $req = HTTP::Request->new(GET => $server_endpoint);
  my $ua = LWP::UserAgent->new;
  $ua->timeout($timeout);
  my $resp = $ua->request($req);
  exit 0;

Der “API Path” ist die Leuchte (Rot:0 - Gelb:1 - Grün:2)

Dann die Definition des Icinga Kommandos

object NotificationCommand "ampel-red-notification" {
  command = [ "/opt/c/ampel-red-notification.pl" ]
  arguments = {
             "-X" = {
                           skip_key = true
                           value = "$alertops_state$"
                     }}}

Das Notification Template sieht dann so aus:

template Notification "c-red-service-notification" {
  command = "ampel-red-notification"
  states = [ OK, Critical, Unknown ]
  types = [ Problem, Acknowledgement, Recovery, Custom,
            FlappingStart, FlappingEnd,
            DowntimeStart, DowntimeEnd, DowntimeRemoved ]
  period = "24x7"
}

Dieses Template wird in einer Notification Definition “AmpelRed” für Services definiert die eine bestimmte Variable gesetzt haben:

  apply Notification "AmpelRed" to Service {
    import "c-red-service-notification"
    user_groups = host.vars.notification.mail.groups
    users = host.vars.notification.mail.users
    vars.alertops_state = "$service.state$"
    assign where service.vars.notification_red == true
  }

Dann nur noch die Variable bei den “wichtigen” Services setzen

  vars.notification_red = true