Seite wählen

NETWAYS Blog

Braintower Option SMS Weiterleitung vs. Routing

Neulich stellte mir ein Kunde die Frage, ob er die Software Option „SMS Weiterleitung“ oder „Routing inkl. SMS Weiterleitung“ wählen soll. Er gab mir dazu noch die Information mit, er plane via API einen eigenen Webserver anzusprechen. Diese Anfrage nehme ich zum Anlass die besagten Software Optionen unter die Lupe zu nehmen.
Braintower Option: SMS Weiterleitung
Dieses Feature kann SMS als E-Mail Nachricht an einen oder mehrere E-Mail-Empfänger weiterleiten. Mit der Braintower Option: Empfängergruppen können dann sogar auch verschiedene
Gruppen alarmiert werden. Zusätzlich ist die Weiterleitung auch per SMS möglich.
Eine Weiterleitung kann aber auch via HTTP Request bewerkstelligt werden. Hier muss einfach die URL zum Skript hinzugefügt werden, das dann die weitere Verarbeitung der Nachricht durchführen kann.
Braintower Option: Routing inkl. SMS Weiterleitung
Um diese Möglichkeiten noch zu erweitern hat sich der Hersteller die Braintower Option: Routing inkl. SMS Weiterleitung einfallen lassen. Diese ermöglicht ein regelbasiertes Routing von SMS- und E-Mail-Nachrichten, mit dem je nach Absender, Empfänger oder Inhalt der Nachricht flexibel unterschiedliche Aktionen ausgeführt werden können. So ist es möglich Nachrichten per SMS, E-Mail, Telegram (Braintower Option: Telegram erforderlich) oder API weiterzuleiten. Via Webinterface können konfigurierbare Regeln erstellt werden, die die Art der Weiterleitung jener Nachrichten festlegen. Der Clou: Jede Regel kann mehrere „Ziele“ zur Folge haben. Hier eine Übersicht dieser möglichen Regeln:

Regel Beschreibung
Absender Angabe des Absenders, durch den diese Regel aktiviert werden soll
Beispiel :

  • 4917012345678
  • max.mustermann@braintower.de
Absender RegEx Angabe des Absenders, durch den diese Regel aktiviert werden soll (Der Absender wird als Regular Expression ausgewertet)
Beispiel:

  • ^(49|43)+\d
  • (.*)@braintower.de
Nachricht Angabe des Nachrichtentextes, durch den diese Regel aktiviert werden soll
Bei eingehenden E-Mails wird der Betreff nicht berücksichtigt
Nachricht RegEx Angabe des Nachrichtentextes, durch den diese Regel aktiviert werden soll (Der Nachrichtentext wird als Regular Expression ausgewertet)
Bei eingehenden E-Mails wird der Betreff nicht berücksichtigt
NICHT Verknüpfung Angabe eines oder mehrerer Suchmuster, durch die diese Regel ignoriert werden soll
ODER Verknüpfung Angabe einer oder einer beliebigen Anzahl von Suchmustern, die miteinander verknüpft werden sollen. Trifft eines der Suchmuster zu, wird diese Regel aktiviert
UND Verknüpfung Angabe einer oder einer beliebigen Anzahl von Suchmustern, die miteinander verknüpft werden sollen. Nur wenn alle Suchmuster zutreffen, wird diese Regel aktiviert

Übrigens: Kunden, die bereits die Braintower Option: SMS Weiterleitung besitzen, können ein Upgrade von SMS Weiterleitung auf Routing einkaufen.
Dem anfangs erwähnten Kunden habe ich also die Braintower Option: Routing inkl. SMS Weiterleitung empfohlen, denn hier ist die Ansprache eines Webservers via API möglich.

Details über einzelne Logstash Filter rausfinden

Dass Logstash sehr performant ist, wissen hoffentlich alle, die ihn schon mal ausprobiert haben. Dennoch gibt es einige Kniffe, die man anwenden kann, um die Konfiguration so zu schreiben, dass Events noch schneller verarbeitet werden. Bisher war dabei nur das Problem, herauszufinden, ob das Tuning gefruchtet oder alles nur verschlimmert hat. Seit Version 5 hat Logstash nun eine eigene API bekommen, die es ermöglicht, etliche Informationen über den Logstash Dienst einzuholen. Diese ist per Default auf Port 9600 des Logstash Hosts erreichbar. (Eventuell, je nach Version, muss sie in /etc/logstash/logstash.yml aktiviert werden.)

# curl localhost:9600/_node/stats?pretty
...
  "process" : {
    "open_file_descriptors" : 79,
    "peak_open_file_descriptors" : 80,
    "max_file_descriptors" : 16384,
    "mem" : {
      "total_virtual_in_bytes" : 3390824448
    },
    "cpu" : {
      "total_in_millis" : 176030000000,
      "percent" : 3,
      "load_average" : {
        "1m" : 0.0,
        "5m" : 0.02,
        "15m" : 0.11
      }
    }
...

Neuer Versionen von Logstash 5 liefern sogar Details über einzelne Filter. Das Problem beim Anzeigen der Performancedetails ist nur, dass Logstash jedem Filter eine zufällige ID verpasst und ein Zuordnen nicht möglich ist. Wer jedoch die Logstash Issues auf Github verfolgt, erkennt, dass es sehr wohl eine Möglichkeit gibt, diese ID zu setzen – sie wurde nur noch nicht dokumentiert.
Folgende Konfiguration verpasst also dem angegebenen Filter eine ID, die nicht in Elasticsearch gespeichert und damit auch nicht in Kibana ersichtlich ist. Sehr wohl sichtbar ist sie jedoch über die Logstash API.

filter {
  if [program] == "kibana" {
    json {
      id => "kibana-json"
      source => "message"
      target => "kibana"
    }
  }
}

Die API liefert dann entsprechenden Output.

     {
        "id" : "kibana-json",
        "events" : {
          "duration_in_millis" : 908,
          "in" : 394,
          "out" : 394
        },
        "name" : "json"
      }

Wer keinen exec Input verwenden möchte, damit Logstash regelmässig seine eigene API abfragt, kann auch check_logstash verwenden, das es bereits als Checkcommand in die ITL von Icinga 2 geschafft hat. Über Feedback sowohl zum Plugin als auch zur Integration würde ich mich freuen. Und auch an dieser Stelle nochmal Danke an die, die bereits etwas beigetragen haben. Allen voran Jordan Sissel.
Vagrant Boxen, die die gezeigte Konfiguration bereits enthalten, gibt’s auch auf Github. Die sind zwar noch nicht so weit gediehen, wie ich das gern möchte, aber als Grundlage für eigene Experimente können sie durchaus dienen. Auch hier freue ich mich über Feedback.
Wer überhaupt gern mehr zu Logstash und dem Elastic Stack erfahren möchte, sollte sich für eine unserer Schulungen zu dem Thema anmelden. Wer jedoch noch nicht von Vagrant gehört hat, wird in einer anderen, unserer Schulungen fündig.

Thomas Widhalm
Thomas Widhalm
Manager Operations

Pronomina: er/ihm. Anrede: "Hey, Du" oder wenn's ganz förmlich sein muss "Herr". Thomas war Systemadministrator an einer österreichischen Universität und da besonders für Linux und Unix zuständig. Seit 2013 ist er bei der NETWAYS. Zuerst als Consultant, jetzt als Leiter vom Operations Team der NETWAYS Professional Services, das unter anderem zuständig ist für Support und Betriebsunterstützung. Nebenbei hat er sich noch auf alles mögliche rund um den Elastic Stack spezialisiert, schreibt und hält Schulungen und macht auch noch das eine oder andere Consulting zum Thema. Privat begeistert er sich für Outdoorausrüstung und Tarnmuster, was ihm schon mal schiefe Blicke einbringt...

Icinga 2 API Cheat Sheet

Zum Wochenende möchte ich euch meine fünf „most used“ API-Aufrufe in einem Blogpost verewigen:
1) Testen des Logins
Bevor ihr jetzt alle lacht weil diese Zeile in der Doku sehr gut zu finden ist, ja, ich habe die dort raus kopiert. Warum? Weil sie wichtig ist! Egal ob ihr nur ganz einfach den Icinga Director installiert oder komplexe Automatismen bauen möchtest, viele (ja, seeeeeehr viele!) scheitern schon an der sehr einfachen Grundeinrichtung der API. Deshalb: Bitte vor Verwendung testen!
/usr/bin/curl -k -s -u 'root:icinga' https://localhost:5665/v1
2) Status der Endpoints
Ein sehr beliebter Aufruf beim Betrieb von Clustern bzw. Endpoints
/usr/bin/curl -k -s -u root:icinga 'https://localhost:5665/v1/status/ApiListener' | jq
3) Anzeige der Service-Check result Details
Ihr kennt das sicher. Euer neu eingerichteter Service check macht nicht das was er soll. Ihr habt mühsam das Command zusammen gebaut und irgendetwas ist in der Definition schief gelaufen. Im Output seht ihr beim Attribut „command“ exakt auf welche Weise Icinga 2 das Command zusammen baut und ausführt 😉
/usr/bin/curl -k -s -u root:icinga 'https://localhost:5665/v1/objects/services?service=test-host-01!test-service-01&attrs=name&attrs=last_check_result'|jq
4) Filtern nach Customvars
/usr/bin/curl -k -s -u 'root:icinga' -H 'X-HTTP-Method-Override: GET' -X POST 'https://localhost:5665/v1/objects/hosts' -d '{ "filter": "host.vars.os == os", "filter_vars": { "os": "Linux" } }' | jq
5) Anzeige aller Services die unhandled sind und weder in Downtime, noch acknowledged sind
/usr/bin/curl -k -s -u 'root:icinga' -H 'X-HTTP-Method-Override: GET' -X POST 'https://127.0.0.1:5665/v1/objects/services' -d '{ "attrs": [ "__name", "state", "downtime_depth", "acknowledgement" ], "filter": "service.state != ServiceOK && service.downtime_depth == 0.0 && service.acknowledgement == 0.0" }''' | jq

Tobias Redel
Tobias Redel
Head of Professional Services

Tobias hat nach seiner Ausbildung als Fachinformatiker bei der Deutschen Telekom bei T-Systems gearbeitet. Seit August 2008 ist er bei NETWAYS, wo er in der Consulting-Truppe unsere Kunden in Sachen Open Source, Monitoring und Systems Management unterstützt. Insgeheim führt er jedoch ein Doppelleben als Travel-Hacker und renoviert, baut und bastelt als Heimwerker an allem was er finden kann.

Icinga2 API und BitBar auf MacOs

preview1Wir wollen APIs, warum? Weil sie schnell, einfach zu integrieren und zu bedienen sind. Nun hat Icinga2 eine API und es entstehen ganz viele Möglichkeiten diese zu nutzen. Wir bauen uns Dashboards mit Dashing oder zeigen den Status von Hosts in Foreman an.
Ich bin letztens über ein Tool BitBar gestolpert, dieses Tool kann mit einfachen Skripten die eigene „Mac OS X menu bar“ erweitern. Hierfür braucht es nur die richtige Formatierung der Ausgabe und BitBar generiert ein weiteres Dropdown Menu.
Ich hab mir die Icinga2 API zu nutze gemacht und eine kleine Erweiterung gebaut um mir den Status von Icinga2 in meiner Menubar anzuzeigen.
Im Menu wird dann der globale Status entweder in grün oder rot, abhängig davon ob Hosts „down“ und „unhandled“ sind, angezeigt.
Der Aufruf dafür kann der Adresszeile im Browser entnommen werden.
/icingaweb2/monitoring/list/hosts?host_state=1&sort=host_severity&host_unhandled=1
Wenn wir am Ende dann ein „&format=json“ an die URL hängen, haben wir ein gängiges Format um das Ergebnis in jeglichen Applikationen zu verwenden.
[{"host_icon_image":"","host_icon_image_alt":"","host_name":"web01","host_display_name":"web01","host_state":"1","host_acknowledged":"0","host_output":"DOWN","host_attempt":"1\/3","host_in_downtime":"0","host_is_flapping":"0","host_state_type":"1","host_handled":"0","host_last_state_change":"1474556541","host_notifications_enabled":"1","host_active_checks_enabled":"0","host_passive_checks_enabled":"1"},
Mehr dazu gibts auf Github unter icinga2_api_examples oder natürlich in der Icinga2 Dokumentation.

Thilo Wening
Thilo Wening
Manager Consulting

Thilo hat bei NETWAYS mit der Ausbildung zum Fachinformatiker, Schwerpunkt Systemadministration begonnen und unterstützt nun nach erfolgreich bestandener Prüfung tatkräftig die Kollegen im Consulting. In seiner Freizeit ist er athletisch in der Senkrechten unterwegs und stählt seine Muskeln beim Bouldern. Als richtiger Profi macht er das natürlich am liebsten in der Natur und geht nur noch in Ausnahmefällen in die Kletterhalle.

Icinga 2 Notifications manuell testen

Bei jeder Installation von Icinga 2 sollte das Notificationsystem getestet werden.
Je nach Installation werden verschiedene Gruppen eingerichtet, die abhängig vom Service beachrichtigt werden sollen. Solche Testbenachrichtigungen können in der Oberfläche von Icinga Web 2 erzeugt und losgeschickt werden. Aber dazu muss der jeweilige Host oder Service rausgesucht werden. Diese Aufgabe kann auch eleganter über die REST-API von Icinga 2 angestoßen werden.
Ein kleines Skript und schon gehts von der Kommandozeile:

#!/bin/bash
#
unset ftp_proxy
unset http_proxy
unset https_proxy
apiuser="myuser"
apipasswd="mypasswd"
server="localhost"
while getopts h:s: opt
do
  case "$opt" in
    h) host=$OPTARG ;;
    s) service=$OPTARG ;;
    h) Usage
       exit 1 ;;
    ?) echo "ERROR: invalid option" >&2
       exit 1 ;;
  esac
done
shift $((OPTIND - 1))
if [ -n "${service}" ] ; then
  # Bitte in eine Zeile zusammenfassen
  curl -k -s -u "${apiuser}:${apipasswd}" -H 'Accept: application/json'
  -X POST 'https://'${server}':5665/v1/actions/send-custom-notification'
  -d '{ "type": "Service", "service" : "'${host}"!"${service}'", "author": "icingaadmin",
  "comment": "This is a testmessage", "force": true }' | python -m json.tool
  exit
fi
if [ -n "${host}" ] ; then
  # Bitte in eine Zeile zusammenfassen
  curl -k -s -u "${apiuser}:${apipasswd}" -H 'Accept: application/json'
  -X POST 'https://'${server}':5665/v1/actions/send-custom-notification'
  -d '{ "type": "Host", "host" : "'${host}'", "author": "icingaadmin",
  "comment": "This is a testmessage", "force": true }' | python -m json.tool
  exit
fi
root@icinga-node1:$ ./send_icinga2_message -h srv04 -s ping4
{
    "results": [
        {
            "code": 200.0,
            "status": "Successfully sent custom notification for object 'srv04!ping4'."
        }
    ]
}

In Icinga Web 2 sieht das ganze dann so aus 🙂 Wenn ihr mehr über Icinga 2 wissen möchtet, kommt einfach auf uns zu.
bildschirmfoto_2016-09-16_16-27-16bildschirmfoto_2016-09-16_16-28-28
Die Notification-Scripts für die in den Screenshots gezeigten Notifications basieren auf den Blogpost „Icinga 2 + Director + Notifications = <3“ von Marianne Spiller.