Icinga2 und director

aus PUG, der Penguin User Group
Wechseln zu: Navigation, Suche

Icinga2; Icinga-web2; Director und Graphite

Da es mich ewig Zeit gekostet hat Icinga2, den Director und Graphite zum Laufen zu bekommen, schreibe ich hier wieder einmal meine Notizen auf. Das Ganze natürlich unter Debian Jessie.

Ein paar Worte vorab: Icinga2 benötigt selbst keine Datenbank um zu funktionieren (was mir verdammt wichtig ist), allerdings die ganzen Tools die das Monitoring abrunden sowie die Webseiten. Da seien erwähnt:

  • Icinga-Web2 -> Weniger aufdringliche Oberfläche mit mehr "Fancy" Gedöns
  • Icinga2 Director -> Die neue Möglichkeit Icinga2 über die Webseite Hosts, Services und Notifications zu konfigurieren
  • Ido -> Datenquelle über die Zustände von Hosts und Services für Drittprogramme (inkl. Icinga-web2)
  • Graphite -> Alternative zu pnp4nagios
  • Grafana -> Die richtige Oberfläche für Graphite :-)

Das Gute daran ist, dass man im Unternehmen den ganzen graphischen Kram auf anderen Servern installieren kann, um den eigentlichen Monitoring Host zu entlasten. Dies dürfte sich vor allem beim I/O bemerkbar machen.

Was den Werbserver angeht, so gehe ich davon aus, dass der Apache2(.4) vorinstalliert ist. Nginx und Co funktionieren zwar auch, aber der steht hier nicht im Fokus.

Quellen

Normalerweise stehen die Quellen unten, da ich aber ohne diese Quellen die Notizen für mich nicht hätte erstellen können, nehmen sie in diesem Fall einen Sonderstatus ein.

Meine wichtigste Quelle:

Dann kommen noch:

Daher großen Dank an meine Quellen :-)

Icinga2

Installation von Icinga2

Aller Anfang ist einfach:

  • Pakete kommen vom Icinga Repository direkt:
Debian-term.png
# echo 'deb http://packages.icinga.org/debian icinga-jessie main' >> /etc/apt/sources.list.d/icinga2.list
# wget -O - http://packages.icinga.org/icinga.key | apt-key add -
# apt-get update
  • Icinga2, ido und Mariadb-Server installieren
Debian-term.png
# apt-get install mariadb-server icinga2 icinga2-ido-mysql
  • Debconf Fragen:
    • MariaDB Root Kennwort -> Kennwort ausfüllen
    • Enable Icinga 2's ido-mysql feature? -> Yes
    • Configure database for icinga2-ido-mysql with dbconfig-common? -> Yes
    • Password of the database's administrative user: -> MariaDB Root Kennwort
    • MySQL application password for icinga2-ido-mysql -> Kennwort ausfüllen

Installation von Icingaweb2

Man kann auch noch icinga2-classicui parallel installieren, falls die Datenbank wirklich ein Problem hat, lässt sich diese als Fallback Oberfläche verwenden.

Jetzt aber kommt zuerst Icingaweb2.

Debian-term.png
# apt-get install icingaweb2 php5-xcache php5-intl php5-imagick

Wenn, wie eingangs erwähnt, der Apache2 vorinstalliert war, muss nun die Webseite http(s)://example.com/icingaweb2/setup aufgerufen werden:

Icingaweb2-Setup-1.png

Also führen wir wie gewünscht die Kommandos aus:

Debian-term.png
# addgroup --system icingaweb2
# usermod -a -G icingaweb2 www-data
# icingacli setup config directory --group icingaweb2
# icingacli setup token create

The newly generated setup token is: a0f9cc9bdd78550b

Das Token muss dann in das "Setup Token" Feld eingefügt werden. Nach einem Klick auf "Next" wählen wir die Module aus, die wir benötigen. Das sind im Augenblick nur Doc und Monitoring:

Icingaweb2-Setup-2.png

Auf der nachfolgenden Seite sollte nachgeschaut werden, ob alles "grün" ist. Ausnahmen bilden Module die ohnehin nicht zum Einsatz kommen, wie für PostgreSQL.

Auf meinem System war zu erledigen:

  • Zeitzone in /etc/php5/apache2/php.ini festlegen (Europe/Berlin)

Icingaweb2-Setup-3.png

Bei der Authentifizierung verwende ich als Quelle die Datenbank. Man hat auch die Wahl den Apache davor zu schalten, wenn ich mich nicht irre ...

Icingaweb2-Setup-4.png

  • Für die Datenbank gelten folgende Parameter:
    • Resource Name: icingaweb_db
    • Database Type: MySQL
    • Host: localhost
    • Port:
    • Database Name: icingaweb_db
    • Username: icingaweb_db
    • Password: das-ist-Ein-Wirkliches-GEheimniss!!
    • Character Set: utf8

Icingaweb2-Setup-5.png

Das nachfolgende Bild spare ich mir. Es wird das MySQL Root Kennwort angefragt, um die Datenbank zzgl. User zu erzeugen. Folgt nur noch die Frage nach dem Backend Namen: icingaweb2

Icingaweb2-Setup-6.png

  • Jetzt folgt der erste User:
    • Username: admin
    • Password: Uuuuuultraaageheim
    • Repeat password: Uuuuuultraaageheim

Icingaweb2-Setup-7.png

Einstellungen der Benutzer sollen in der gleichen Datenbank abgelegt werden: Icingaweb2-Setup-8.png

Folgt nur noch die obligatorische Zusammenfassung. ... Denkt euch bitte das Bild hier.

Nach der Konfiguration fragt der Wizard die Parameter für das Monitoring Modul ab.

  • Als Backend Name nehmen wir:
    • Backend Name: "icinga2"
    • Backend Type: IDO

Icingaweb2-Setup-9.png

Bei den Parametern werden die Daten eingegeben, die Debconf bei der Installation von icinga2-ido-mysql angefragt hat (hat man die vergessen: dpkg-reconfigure icinga2-ido-mysql).

Icingaweb2-Setup-10.png

Als nächstes teilen wir dem Wizard mit, dass wir Kommandos per lokaler Datei mitgeben können wollen:

Icingaweb2-Setup-11.png

Felder die vor allzu neugierigen Augen zu schützen sind, können hier angegeben werden. Einige von euch werden vor allem SNMP Felder wieder erkennen ;-)

Icingaweb2-Setup-12.png

Fehlt nur noch wieder die Zusammenfassung .... Endlich fertig ...

Icingaweb2-Setup-13.png

Icingaweb2-Login.png

Ist das alles geschafft, führt ein erster Login zu diesem Bild:

Icingaweb2.png

Installation von Icingaweb2 Director

Gleich eine Sache vorab: es gibt derzeit kein Debian Paket, was allerdings nicht weiter tragisch ist. Wir holen uns das Modul gleich per Git.

Zuvor sind noch ein paar Voraussetzungen zu erfüllen, wie das Aktivieren der API Schnittstelle und das Erstellen der Datenbank.

  • Noch ein PHP Modul:
Debian-term.png
# apt-get install php5-curl
  • Dann das Modul selbst:
Debian-term.png
# cd /usr/share/icingaweb2/modules
# git clone https://github.com/Icinga/icingaweb2-module-director.git director
  • Die Datenbank erstellen und befüllen:
Debian-term.png
# mysql -u root -p
mysql> CREATE DATABASE icinga2director CHARACTER SET 'utf8';
mysql> GRANT ALL ON icinga2director.* TO 'icinga2director'@'localhost' IDENTIFIED BY 'das ist alles nur geklaut';
Debian-term.png
# mysql -u icinga2director -p icinga2director < /usr/share/icingaweb2/modules/director/schema/mysql.sql
  • Die API aktivieren:

Wer sich eventuell schon ein wenig näher mit Icinga2 und dem Director beschäftigt hat, wird sicherlich schon über die durchgehende Verschlüsselung mittels TLS/CA gestolpert sein. Mit dem Aktivieren der API Schnittstelle, erzeugt Icinga2 eine CA die dann die Grundlage bildet für die Zertifikatskette bildet:

Debian-term.png
# icinga2 api setup
information/cli: Generating new CA.
information/base: Writing private key to '/var/lib/icinga2/ca/ca.key'.
information/base: Writing X509 certificate to '/var/lib/icinga2/ca/ca.crt'.
information/cli: Generating new CSR in '/etc/icinga2/pki/icinga.example.com.csr'.
information/base: Writing private key to '/etc/icinga2/pki/icinga.example.com.key'.
information/base: Writing certificate signing request to '/etc/icinga2/pki/icinga.example.com.csr'.
information/cli: Signing CSR with CA and writing certificate to '/etc/icinga2/pki/icinga.example.com.crt'.
information/pki: Writing certificate to file '/etc/icinga2/pki/icinga.example.com.crt'.
information/cli: Copying CA certificate to '/etc/icinga2/pki/ca.crt'.
information/cli: Adding new ApiUser 'root' in '/etc/icinga2/conf.d/api-users.conf'.
information/cli: Enabling the 'api' feature.
Enabling feature api. Make sure to restart Icinga 2 for these changes to take effect.
Done.

Now restart your Icinga 2 daemon to finish the installation!

Vor dem Neustart von Icinga2 müssen wir noch einen API User für den Director anlegen, über den dieser dann zugreifen kann:

  • /etc/icinga2/conf.d/api-users.conf:
Ascii.png
object ApiUser "director" {
  password = "bloss,niemandem,verraten"
  permissions = [ "*" ]
}

Damit später die Zertifikate für den Icinga2 Agent korrekt erzeugt werden, bedarf es noch einer Überarbeitung der constants.conf:

  • /etc/icinga2/constants.conf:
Ascii.png
[...]
/* Secret key for remote node tickets */
const TicketSalt = "1112223334445556667788999000"
}

Würden wir den TicketSalt nicht setzen, gäbe es später Fehlermeldungen wie zum Beispiel:

Debian-term.png
# bash icinga-agent-script.sh
information/base: Writing private key to '/etc/icinga2/pki/www.pug.org.key'.
information/base: Writing X509 certificate to '/etc/icinga2/pki/www.pug.org.crt'.
information/pki: Writing certificate to file '/etc/icinga2/pki/trusted-master.crt'.
critical/cli: Ticket salt is not configured.

Um später irritierende Fehlermeldungen beim Erstellen von Kommandos vorzubeugen, erweitern wir die zone.conf:

  • /etc/icinga2/zone.conf:
Ascii.png
object Zone "director-global" {
        global = true
}

Dann kann der Icinga2 Daemon neugestartet werden:

Debian-term.png
#  service icinga2 restart

Damit Icingaweb2 etwas von der neuen Datenbank weiß, müssen wir eine neue (Datenbank) Ressource hinzufügen:

Icinga2director-3.png

In den Feldern werden dann die notwendigen Werte eingegeben ...

Icinga2director-4.png

  • Meine Werte:
    • Resource Type: SQL Database
    • Ressource Name: director_db
    • Database Type: MySQL
    • Host: localhost
    • Port:
    • Database Name: icinga2director
    • Username: icinga2director
    • Passwort: UnfassbarGeheim!
    • Character Set: utf8

Damit kann man die neue Ressource verwenden. Im Webfrontend wird dazu nun unter Modules das "Director" Modul angeklickt:

Icinga2director-1.png

Zum Aktivieren des Moduls auf enable klicken.

Icinga2director-2.png

Danach kann auf das "Configuration" Tab geklickt und als erstes die DB Resource director_db ausgewählt werden. Nach dem Klick auf Store configuration' startet ein neuer Wizard, der die initiale Einrichtung abfragt.

Icinga2director-5.png

Im Prinzip sind es nur drei Dinge:

  1. Endpoint Name: -> Name der für die CA verwendet wurde beim Aufruf von icinga2 api setup (hier icinga.example.com)
  2. API user: -> Hier der API Benutzer der in der /etc/icinga2/conf.d/api-users.conf eingetragen wurde.
  3. Icinga Host: In der Regel immer localhost

Folgt zum Schluss nur noch der Klick auf Run import. Hat alles geklappt, dürfte es nun so aussehen:

Icinga2director-6.png

Nun wird es ein wenig tricky. Der Director hat bereits eine Vielfalt an Checks, Notifications und Commands mit im Gepäck, die allerdings noch ausgerollt werden müssen. Man kann einige Zeit damit verbringen die passenden Knöpfe zu finden, daher habe ich den Pfad im nachfolgendem Bild einmal aufgelistet:

Icinga2director-7.png

  1. Anzahl der Änderungen die noch nicht ausgerollt worden sind
  2. Tab für die "Deployments"
  3. Konfiguration erstellen lassen
  4. Ja, das ist tatsächlich anklickbar. Ein Klick hat zur Folge, dass die neue Icinga2 Konfiguration generiert und dann auf dem Dateisystem abgelegt wird.

Damit ist die grundsätzliche Inbetriebnahme abgeschlossen.

Erste Schritte mit Icingaweb2 Director

Da ich auch ein wenig Zeit benötigt habe, um meinen ersten Host, den ersten Check und das erste Kommando hinzuzufügen, zeige ich die dazu nötigen Schritte.

Erster Linux Host mittels Icinga2 Agent

Bei Icinga1 / Nagios kommen entweder NRPE (in seinen verschiedenen Variationen), SSH oder manchmal sogar SNMP zum Einsatz (nsca mal außen vorgelassen). Meistens ist es NRPE, da es bisher keinen richtigen Agent gibt/gab, wie das eventuell einige von Zabbix (zabbix_agent) kennen. Eine Ausnahme bildet check_mk (verdammt geniales Stück Software), allerdings steck da eine komplette neue Software dahinter. Mit Icinga2 ist der Icinga2 Daemon sowohl Server als auch Agent in einem. Ich weiß noch nicht, ob ich das gut finde oder einen abgespeckten Client bevorzugt hätte, aber in Anbetracht dessen, dass von der Pflege her weniger zu beachten ist, war diese Entscheidung vermutlich am sinnvollsten.

Um einen ersten Host über den Director hinzuzufügen, muss zuerst ein Template angelegt werden. Es enthält dann bereits die notwendigen Parameter. Dazu im Director auf Host klicken, das Tab Templates und die Werte wie gewünscht ausfüllen. Auf dem Bild verwende ich einen Check von 60 Sekunden, statt den sonst üblichen 300 Sekunden. Ob man das so übernehmen möchte, sollte man im Vorfeld abklären ;-)

Dirctor-first-steps-1.png

  • Die Paramter sind:
    • Hostname: host-linux-generic-template
    • Check command: hostalive
    • Check intervall: 60
    • Retry intervall: 60
    • Max check attempts: 5
    • Execute active checks: Yes
    • Execute passive checks: Yes
    • Send notifications: Yes
    • Process performance data: Yes
    • Volatile: Yes
    • Icinga2 Agent: Yes
    • Establish connection: Yes
    • Accepts config: Yes

Bei den letzten drei Punkten ist es natürlich wieder Geschmackssache ob immer per Default den Icinga2 Agent gesetzt werden soll. Eventuell könnte das Template auch bereits passend benannt werden, ob der Icinga2 Agent zum Einsatz kommt oder nicht.

Die restlichen Felder habe ich belassen.

Auf Basis dieser Vorlage kann nun ein Host erstellt werden. Dazu im Director wieder auf Hosts klicken und in diesem Fall auf dem Tab Host Add Host klicken. Bei Object Type wählen wir nun Object und wählen bei Imports das neu erstellte Template aus. Alle anderen Felder müssen passend ausgefüllt werden.

Als Beispiel verwende ich diesen Wiki Server hier:

Dirctor-first-steps-2.png

Nach dem Ausfüllen und dem Abspeichern, kann auch gleich auf Deploy geklickt werden, welches dann die Konfiguration für Icinga2 aufbereitet und aus der Datenbank auf die Platte ablegt.

Hat das soweit geklappt, wird im nächsten Schritt die Agent Konfiguration herauskopiert und auf den zu überwachenden Host übertragen. Bei dem neu erstellten Host gibt es das Tab Agent, bei dem eine rudimentäre Anleitung zum Vorschein kommt. Den Bash Teil einfach in eine Datei kopieren später und mittels: bash sript.sh ausführen.

Bevor das aber klappen kann, ist dafür zu sorgen, dass:

  1. icinga2 ebenfalls auf dem Host installiert wurde (icinga2-bin reicht meistens)
  2. Der Monitoring Host auf den Port 5665 des zu überwachenden Host zugreifen darf (Routing/Firewall)
  3. Die benötigten Monitoring Plugins installiert sind
  4. Die generierte Konfiguration vor dem Start auf dem neuen Host in die icinga2.conf eingetragen wurde
  5. Icinga2 auf dem zu überwachendem Host auch läuft

Hier ein generiertes Beispiel, wie das in meinem Fall aussieht:

Ascii.png
#!/bin/bash

# This generates and signs your required certificates. Please do not
# forget to install the Icinga 2 package and your desired monitoring
# plugins first:

ICINGA_PKI_DIR=/etc/icinga2/pki
ICINGA_USER=nagios
chown $ICINGA_USER $ICINGA_PKI_DIR

icinga2 pki new-cert --cn www.pug.org \
--key $ICINGA_PKI_DIR/www.pug.org.key \
--cert $ICINGA_PKI_DIR/www.pug.org.crt

icinga2 pki save-cert --key $ICINGA_PKI_DIR/www.pug.org.key \
--trustedcert $ICINGA_PKI_DIR/trusted-master.crt \
--host icinga.example.com 

icinga2 pki request --host icinga.example.com \
--port 5665 \
--ticket 1111222222334445556667778899qwerttuisdfg \
--key $ICINGA_PKI_DIR/www.pug.org.key \
--cert $ICINGA_PKI_DIR/www.pug.org.crt \
--trustedcert $ICINGA_PKI_DIR/trusted-master.crt \
--ca $ICINGA_PKI_DIR/ca.crt
  • Folgt noch die Anpassung der icinga2.conf:
  • /etc/icinga2/icinga2.conf:
Ascii.png
include "constants.conf"
include <itl>
include <plugins>
// include <plugins-contrib>

object FileLogger "main-log" {
  severity = "information"
  path = LocalStateDir + "/log/icinga2/icinga2.log"
}

// TODO: improve establish connection handling
object Endpoint "www.pug.org" {}
object Endpoint "icinga.example.net" {}
object Zone "icinga.example.net" {
  endpoints = [ "icinga.example.net" ]
  // TODO: all endpoints in master zone
}

object Zone "director-global" { global = true }

object Zone "www.pug.org" {
  parent = "icinga.example.net"
  endpoints = [ "www.pug.org" ]
}

object ApiListener "api" {
  cert_path = SysconfDir + "/icinga2/pki/www.pug.org.crt"
  key_path = SysconfDir + "/icinga2/pki/www.pug.org.key"
  ca_path = SysconfDir + "/icinga2/pki/ca.crt"
  accept_commands = true
  accept_config = true
}

Wichtig aus Perspektive der Sicherheit sind die beiden letzten Parameter. Sie besagen, dass der Agent vom Master sowohl Kommandos akzeptiert als auch Konfigurationen übermittelt bekommen kann.

Nach der Änderung kann auf dem zu überwachendem Host der Icinga2 Daemon neu gestartet und das Script ausgeführt werden. Kurze Zeit später taucht im Icingaweb2 der neue Host auf und stellt sich in etwa so dar:

Dirctor-first-steps-3.png

Damit ist nun der erste Schritt getan, um den Host zu überwachen.

Erster Check

Als ersten Check - um das Prinzip zu verstehen - nehmen wir check_load. Beim Aktivieren vom Director werden bereits eine Menge Check Kommandos eingebunden. Es gibt allerdings einige Check Kommandos, bei denen wir gern Einfluss auf die Schwellwerte von Warning und Critical nehmen wollen. Wie dies geschieht, zeige ich in den nachfolgenden Zeilen. Zur Demonstration eignet sich check_load sehr gut.

Check Kommando Parameter

Als erster Schritt wird im Director das Kommando check_load ausgewählt und klickt dann auf Preview:

Dirctor-first-steps-4.png

  • In der Vorschau lassen sich gut die Standardwerte ablesen:
 vars.load_cload1 = 10
    vars.load_cload15 = 4
    vars.load_cload5 = 6
    vars.load_percpu = false
    vars.load_wload1 = 5
    vars.load_wload15 = 3
    vars.load_wload5 = 4

Um diese Werte zu überschreiben, findet man auf dem Tab Fields nun die Möglichkeit diese Felder Variable zu gestalten, sodass diese später (optional) gesetzt werden können. Dazu einfach alle gewünschten Felder die der Check bietet, hinzufügen:

Dirctor-first-steps-5.png

Wichtig an dieser Stelle: Optional vs. Mandatory: Es gibt einige Checks die benötigen immer die Werte für Warning und Critical, doch es sind keine vordefiniert. Bei diesen Checks (zum Beispiel check_mailq / mailq) müssen diese Felder auf Mandatory gesetzt werden.

Service Check Template

Als nächstes wird ein Service Template erstellt, wie auch schon beim Host. Ich habe es "service-linux-generic-template" genannt:

Director-first-steps-6.png

  • Meine Werte:
    • Name: service-linux-generic-template
    • Run on agent: Yes
    • Check interval: 300
    • Retry interval: 150
    • Max check attempts: 3
    • Execute active checks: Yes
    • Accept passive checks: Yes
    • Send notifications: Yes
    • Enable event handler: Yes
    • Process performance data: Yes
    • Volatile: Yes

Der Rest bleibt wie gehabt unangetastet.

Service

Jetzt wird der eigentliche Service Check definiert: check-load. Dazu im Director auf Services wieder ein Service Template hinzufügen. In diesem Fall bekommt der Check unser vorher erstelltes Template als Import mit auf den Weg:

Director-first-steps-7.png

Wird bei Check command load ausgewählt, erhalten wir auch die Felder um die Warning und Critical Werte anpassen zu können. Allerdings habe ich sie hier nicht angepasst, da es an dieser Stelle nicht viel Sinn ergeben würde. Ein sinnvoller Schwellwert hängt von der Anzahl der CPU Kerne ab. Daher werden die Schwellwerte bei der Zuweisung zum jeweiligen Host mitgegeben.

Service Zuweisung

Jetzt kann der Check dem Host zugewiesen werden. Also wieder zurück zum Director auf Hosts und den gewünschten Host klicken. In diesem Fall www.pug.org. Dort lässt sich der Check check-load zuweisen und die Load Schwellwerte anpassen:

Director-first-steps-8.png

Die Reihenfolge habe ich hier angepasst, da im Director die Parameter falsch sortiert werden (1 15 5, statt 1 5 15).

  • Meine Werte:
    • Imports: check-load
    • Name: check-load
    • Disabled: No
    • load_wload1: 15
    • load_wload5: 10
    • load_wload15: 5
    • load_cload1: 30
    • load_cload5: 25
    • load_cload15: 20

Dies entspricht einem Host mit zwei CPU Kernen. Die Werte habe ich von hier geklaut.

Sind alle Vorarbeiten erledigt, kann die Konfiguration wie gehabt ausgerollt werden, über Director -> Config history -> Tab Deployments -> Render config und schlussendlich auf "Deploy to master". Am Ende erscheint ein grünes Häkchen und der Check wird nach ein paar Minuten in etwa so aussehen:

Director-first-steps-9.png

Dauert es einem etwas zu lang, so genügt ein "service icinga2 reload" auf dem Host, dem der Check zugewiesen wurde. Dann besorgt sich der Icinga2 Agent sofort die neue Konfiguration vom Master. Als letztes hilft noch die Check Ausführung zu forcieren, über "Check now".

Apply Regeln

Eine sehr nützliche Funktion von Icinga2 sind die Apply Regeln. Damit lassen sich Checks automatisch an alle Hosts zuweisen, die zum Beispiel dem Betriebssystem Linux angehören. Damit das funktioniert, werden drei Dinge benötigt:

  1. Eine Liste
  2. Einträge für die Liste
  3. Ein neues Feld für das Host Template

Daten Liste

Auf der Director Startseite findet sich unterhalb von der Überschrift "Do more with your data" der Punkt "Provide data lists".

Director-first-steps-10.png

Nach einem Klick lässt sich eine Liste anlegen, mit dem Namen "OS" für "Operating System". Diese neu angelegte Liste lässt sich mit Werten füllen:

Director-first-steps-11.png

Es ist nicht weiter spannend, dass der Schlüssel und Wert den gleichen Namen tragen. Nach dem Abspeichern geht es zurück auf die Startseite, wählen "Define data fields" und fügen ein neues Feld mit Namen "Operating System" hinzu. Als "Caption" können wir ebenfalls Operating System verwenden. Bei Data type wird Datalist gewählt und die vorher erstellte Liste OS.

Director-first-steps-12.png

Datenfeld Zuweisung

Damit ist nun das neue Feld Operating System verfügbar und kann dann z.B. dem Template host-linux-generic-template zugewiesen werden.

Director-first-steps-13.png

Dieses neue Feld kann nun dem Host www.pug.org zugewiesen werden, mit Linux als Wert. In der Vorschau lässt sich das gut darstellen:

Ascii.png
object Host "www.pug.org" {
    import "host-linux-generic-template"

    display_name = "www.pug.org"
    address = "217.11.62.30"
    address6 = "2a00:1828:2000:167:8::1"
    vars.OperatingSystem = "Linux"
}

Als letztes kann eine Apply Regel erstellt werden, die den Check auf allen Hosts ausführt, die in ihrer Konfiguration ein vars.OperatingSystem = "Linux" haben.

check-load via Apply Zuweisung

Neben dem Service Namen "check-load" findet sich der Link "Create apply-rule"

Director-first-steps-14.png

Nach dem Klick haben wir die Möglichkeit genau zu definieren, wann diese Regel greift.

  • Bei Assignment rules gilt nun:
Ascii.png
assign where OperatingSystem = Linux
  • In der Vorschau stellt sich dies so da:
Ascii.png
zones.d/director-global/service_apply.conf
apply Service "check-load" {
    import "check-load"
    assign where host.vars.OperatingSystem == "Linux"
    import DirectorOverrideTemplate
}

Das war es auch schon. Jedem Host der das Feld OperatingSystem mit Linux als Wert hat, wird dieser Check nun zugewiesen.

Installation von Graphite

Als langjähriger Fan von pnp4nagios wollte ich es wieder einsetzen, musste aber erkennen, dass sich auch da vieles getan hat. Dazu gehören noch auch die Graphen.En vogue ist aktuell Graphite, welches viel flexibler im Umgang mit Metriken ist. Auch für Icingaweb2 gibt es ein passendes Modul. Der Weg dahin ist aber ein wenig steinig, daher schreibe ich den auch mal auf.

  • Wir benötigen dazu:
Debian-term.png
#  apt-get install graphite-carbon libapache2-mod-wsgi python-django python-django-tagging python-cairo python-tz python-pyparsing python-memcache python-rrdtool

Die Frage von Debconf, ob nach der Deinstallation auch die erzeugten Dateien gelöscht werden sollen, bejahe ich in der Regel. Dies muss aber jeder Admin für sich selbst entscheiden.

  • Als nächstes wird das Gaphite Modul für icingaweb2 aktiviert:
Debian-term.png
#  icinga2 feature enable graphite
# service icinga2 restart
[...]
[2016-10-11 20:50:46 +0200] information/ConfigItem: Triggering Start signal for config items
[2016-10-11 20:50:46 +0200] information/ApiListener: Adding new listener on port '5665'
[2016-10-11 20:50:46 +0200] critical/TcpSocket: Invalid socket: Connection refused
[2016-10-11 20:50:46 +0200] critical/GraphiteWriter: Can't connect to Graphite on host '127.0.0.1' port '2003'.
[2016-10-11 20:50:46 +0200] information/ConfigItem: Activated all objects.

Die Meldungen am Ende sind in Ordnung, da der Carbon Daemon von Graphite noch nicht gestartet wurde. Debian üblich müssen wir noch die Default Datei editieren:

  • /etc/defaults/graphite-carbon:
Debian-term.png
# sed -i 's/false/true/g' /etc/default/graphite-carbon
  • Nun kann Carbon gestartet werden:
Debian-term.png
# service carbon-cache start
[....] Starting Graphite backend daemon: carbon-cacheStarting carbon-cache (instance a)
. ok

Die Metriken werden dann nach und nach im Ordner /var/lib/graphite/whisper/icinga2 erscheinen. Das alles dient bisher lediglich dazu, dass Icinga2 die Performancedaten an Carbon übergibt, nicht jedoch um Graphen darzustellen. Das kommt jetzt:

Installation und Konfiguration von Graphite-web

Debian-term.png
#  graphite-web

Mit dem Paket kommt eine Beispielkonfiguration für den Apache2 mit ( /usr/share/graphite-web/apache2-graphite.conf ), die ich allerdings etwas für SSL abgewandelt habe. Des Weiteren habe ich eine Basic Authentifizierung davor geschaltet:

  • /etc/apache2/sites-available/graphite-web.conf
Ascii.png
<VirtualHost *:443>

ServerAdmin webmaster@icinga.example.com
ServerName graphite.example.com
SSLCertificateFile /etc/letsencrypt/live/icinga.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/icinga.example.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf

<Location "/">
	AllowOverride AuthConfig
	Order Allow,Deny
	Allow From All

	AuthName "Graphite Access"
	AuthType Basic
	AuthUserFile /etc/apache2/htpasswd.users
	Require valid-user
</Location>

	WSGIDaemonProcess _graphite processes=5 threads=5 display-name='%{GROUP}' inactivity-timeout=120 user=_graphite group=_graphite
	WSGIProcessGroup _graphite
	WSGIImportScript /usr/share/graphite-web/graphite.wsgi process-group=_graphite application-group=%{GLOBAL}
	WSGIScriptAlias / /usr/share/graphite-web/graphite.wsgi

	Alias /content/ /usr/share/graphite-web/static/
	<Location "/content/">
		SetHandler None
	</Location>

	ErrorLog ${APACHE_LOG_DIR}/graphite-web_error.log

	# Possible values include: debug, info, notice, warn, error, crit,
	# alert, emerg.
	LogLevel warn

	CustomLog ${APACHE_LOG_DIR}/graphite-web_access.log combined

</VirtualHost>

Wie sich unschwer erkennen lässt, nutze ich Letsencrypt um einen VirtualHost mit TLS abzusichern. Des Weiteren erfolgt wie erwähnt eine Authentifizierung, für die wir eine einfache Benutzerdatenbank benötigen:

Debian-term.png
# htpasswd -c /etc/apache2/htpasswd.users admin
New password:
Re-type new password:
Adding password for user admin

Anmerkung: In einem wirklich produktiven Umfeld würde ich an dieser Stelle keine Basic Authentifizierung mittels Datei verwenden, sondern LDAP, oder SQL via mod_authn_dbd.

  • Dann lässt sich der neue VirtualHost aktivieren:
Debian-term.png
# a2ensite graphite-web.conf

Nun muss Graphite-web selbst noch konfiguriert werden. Dazu gibt es die Datei /etc/graphite/local_settings.py, welche die Datenbank definiert und noch ein paar andere Dinge. Für den schnellen Erfolg kann durchaus die sqlite3 Datenbank verwendet werden, allerdings läuft ja ohnehin ein MySQL (aka MariaDB), daher nutzen wir diesen als Datenbank Quelle.

  • Die wichtigen Zeilen:
Ascii.png
SECRET_KEY = 'ohhh mein tuxx ein Passwort steht hier'
TIME_ZONE = 'Europe/Berlin'
LOG_RENDERING_PERFORMANCE = True
LOG_CACHE_PERFORMANCE = True
LOG_METRIC_ACCESS = True
GRAPHITE_ROOT = '/usr/share/graphite-web'
CONF_DIR = '/etc/graphite'
STORAGE_DIR = '/var/lib/graphite/whisper'
CONTENT_DIR = '/usr/share/graphite-web/static'
WHISPER_DIR = '/var/lib/graphite/whisper'
LOG_DIR = '/var/log/graphite'
INDEX_FILE = '/var/lib/graphite/search_index'  # Search index file
DATABASES = {
    'default': {
        'NAME': 'graphite_db',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'graphite',
        'PASSWORD': 'Geheimes Datenbank Kennwort',
        'HOST': 'localhost',
        'PORT': '3306'
    }
}
  • Dazu müssen wir natürlich die Datenbank anlegen:
Debian-term.png
# mysql -u root -p
mysql> CREATE DATABASE graphite_db CHARACTER SET 'utf8';
mysql> GRANT ALL ON graphite_db.* TO 'graphite'@'localhost' IDENTIFIED BY 'Geheimes Datenbank Kennwort';
mysql> FLUSH PRIVILEGES;
mysql> exit;
  • Nun können wir die Datenbank von Django befüllen lassen. Der Debian Maintaner hat dazu ein passendes Tool hinterlegt:
Debian-term.png
# graphite-manage syncdb

Es folgen nun einige Ausgaben in diversen Farben, am Ende wird nach einem Django superusers gefragt, bei dem dann wieder ein User (root) ein Passwort und eine Mailadresse hinterlegt werden müssen. Ähnlich wie bei RRD, müssen wir Carbon mitteilen, wie die Zeiträume am Ende zusammen gestaucht werden können (Aggregation). Damit das richtig klappt, gibt es nur eine wirklich wichtige Regel:

Die Intervalle er Icinga2 Checks müssen mit denen im Carbon übereinstimmen. Dazu kann man hier mehr lesen.

  • /etc/carbon/storage-schemas.conf
Ascii.png
[carbon]
pattern = ^carbon\.
retentions = 60:90d

[default_1min_for_1day]
pattern = .*
retentions = 60s:1d

[icinga_internals]
pattern = ^icinga\..*\.(max_check_attempts|reachable|current_attempt|execution_time|latency|state|state_type)
retentions = 5m:7d

[icinga_default]
pattern = ^icinga\.
retentions = 1m:2d,5m:10d,30m:90d,360m:4y

Hat das geklappt und Apache2 und carbon-cache wurden noch einmal neugestartet, kann man auf der Webseite http(s)://graphite.example.com Graphite bewundern. Um einen Graph zu erhalten, genügt es die Ordnerstruktur von z.B. icinga2 durchzugehen und einen Wert "Value" auszuwählen.

Graphite-web.png

Damit nun die Graphen auch auf der icingaweb2 Webseite zu sehen sind, benötigen wir dazu erneut ein Modul aus dem Git Universum.

Debian-term.png
# cd /usr/share/icingaweb2/modules/
# git clone https://github.com/findmypast/icingaweb2-module-graphite.git graphite
# mkdir /etc/icingaweb2/modules/graphite

Danach kann im Icingaweb2 unter Configuration -> Module -> graphite Das Graphite Modul aktiviert werden. Wird nun auf das Tab Configuration geklickt, erhält man praktischerweise eine Konfiguration die unter /etc/icingaweb2/modules/graphite/config.ini ablegt werden muss. Einige Zeilen sind allerdings anzupassen. Dazu zählt unter anderem die base_url:

  • /etc/icingaweb2/modules/graphite/config.ini:
Ascii.png
[graphite]
metric_prefix = icinga2
base_url = https://graphite.example.com/render?
legacy_mode = false
;if legacy mode is false (2.4 and newer):
service_name_template = "icinga2.$host.name$.services.$service.name$.$service.check_command$.perfdata.$metric$.value"
host_name_template = "icinga2.$host.name$.host.$host.check_command$.perfdata.$metric$.value"
;if legacy mode is true (pre 2.4):
;service_name_template = "icinga.$host.name$.services.$service.name$.$service.check_command$"
;host_name_template = "icinga.$host.name$.host.$host.check_command$"
;this template is used for the small image, macros $target$ , $areaMode$ and $areaAlpha$ can used.
graphite_args_template = "&target=$target$&source=0&width=300&height=120&hideAxes=true&lineWidth=2&hideLegend=true&colorList=$colorList$&areaMode=$areaMode$&areaAlpha=$areaAlpha$"
;this template is used for the large image, macros $target$ , $areaMode$ and $areaAlpha$ can used.
;graphite_large_args_template = "&target=alias(color($target$_warn,'yellow'),'warning')&target=alias(color($target$_crit,'red'),'critical')&target=$target$&source=0&width=800&height=700&colorList=$colorList$&lineMode=connected&areaMode=$areaMode$&areaAlpha=$areaAlpha$"
graphite_iframe_w = 800px
graphite_iframe_h = 700px
graphite_area_mode = all
graphite_area_alpha = 0.1
graphite_summarize_interval = 10min
graphite_color_list = 049BAF,EE1D00,04B06E,0446B0,871E10,CB315D,B06904,B0049C

Wurde die Datei angelegt, dürfte sich schon nach ein paar Reloads der Webseite folgendes Bild auftauchen:

Icingaweb2-graphite.png

Installation und Konfiguration von Grafana

Da Graphite selbst nicht sonderlich "hübsch" ist, gibt es Grafana.

  • Für Grafana verwenden wir am Besten das entsprechende Repository:
Debian-term.png
# apt-get install apt-transport-https
# echo 'deb https://packagecloud.io/grafana/stable/debian/ jessie main' >> /etc/apt/sources.list.d/grafana.list
# curl -s https://packagecloud.io/gpg.key | sudo apt-key add -
# apt-get update
# apt-get install grafana

Grafana nutzt per Default eine SQLite Datenbank. Da wir aber MySQL nutzen wollen, erstellen wir schnell eine Datenbank:

  • Datenbank:
Debian-term.png
# mysql -p
mysql> CREATE DATABASE grafana_db CHARACTER SET 'utf8';
mysql> GRANT ALL ON grafana_db.* TO 'grafana'@'localhost' IDENTIFIED BY 'Das Geheime Kennwort;
mysql> FLUSH PRIVILEGES;
mysql> quit;

Da Grafana einen eigenen Dienst mitbringt der auf Port 3000 horcht, ist es nicht sehr praktisch, daher erstellen wir eine Apache2 Konfiguration, die als ReverseProxy alle Anfragen an den Port 3000 weiterreicht. Zuvor müssen wir Grafana konfigurieren. Es gibt zuvor allerdings noch eine Sache die zu beachten ist: Die Authentifizierung!

Entweder alles läuft über den Apache2, oder -- wie in diesem Fall -- über Apache2 und Grafana.

  • Ich habe hier folgende Zeilen angepasst:
  1. domain -> Der Hostname
  2. root_url -> Die entsprechende URL hier mit /grafana/ am Ende
  3. header_name -> Authentifizierung durch den Webserver
  4. header_property -> Authentifizierung durch den Webserver
  5. auto_sign_up -> -> Authentifizierung durch den Webserver
  6. type = mysql -> Statt sqlite
  7. host -> Wo läuft der Datenbank Server
  8. name -> Datenbank Name
  9. user -> User für die Datenbank
  10. password -> Passwort für die Datenbank
  • /etc/grafana/grafana.ini:
Ascii.png
[paths]
[server]
domain = example.org
root_url = %(protocol)s://%(domain)s:%(http_port)s/grafana/
[database]
type = mysql
host = 127.0.0.1:3306
name = grafana_db
user = grafana
password = das Geheime Passwort
[session]
[analytics]
check_for_updates = true
[security]
admin_user = admin
secret_key = sinnloserTextmit726494762Zahlen
disable_gravatar = true
[snapshots]
[users]
allow_sign_up = false
auto_assign_org = true
auto_assign_org_role = Editor
[auth.anonymous]
enabled = false
org_role = Viewer
[auth.github]
[auth.google]
[auth.proxy]
enabled = true
header_name = X-WEBAUTH-USER
header_property = username
auto_sign_up = true
[auth.basic]
enabled = false
[auth.ldap]
[smtp]
[emails]
[log]
[log.console]
[log.file]
[log.syslog]
[event_publisher]
[dashboards.json]
[metrics]
[grafana_net]
url = https://grafana.net

Als nächstes den Dienst aktivieren und starten. Grafana wird dabei automatisch die Datenbank befüllen:

  • Für das klassische Init:
Debian-term.png
# update-rc.d grafana-server defaults 95 10
# 
  • Für Systemd:
Debian-term.png
# systemctl enable grafana-server.service
  • Starten:
Debian-term.png
# servive grafana-server start
  • Nun lauscht ein Dienst auf Port 3000:
Debian-term.png
# netstat -tln | grep 3000
tcp6       0      0 :::3000                 :::*                    LISTEN

Als letztes fehlt noch die Apache2 Konfiguration. Dabei gibt es zwei Möglichkeiten:

  1. Als triviale Konfiguration
  2. Als Virtualhost - wie in meinem Beispiel
  • /etc/apache2/sites-available/grafana.conf:
Ascii.png
ProxyPreserveHost On
    ProxyPass /grafana http://0.0.0.0:3000
    ProxyPassReverse /grafana http://0.0.0.0:3000

Bevor der Apache2 neugestartet werden kann, müssen die beiden Module proxy und proxy_html aktiviert werden:

Debian-term.png
# a2enmod proxy proxy_html
# a2ensite grafana.conf

Damit kann nun die Webseite https://graphite.example.com/grafana aufgerufen werden. Als erstes erfolgt die Anmeldung an dem Apachen, dann kann man sich an Grafana authentifizieren, mittels dem User admin und dem Passwort admin.

Grafana Basis

Da Icinga2 und Graphite bereits funktionieren, müssen wir nur noch Graphite als Datenquelle einstellen.

  • Im ersten Bild: Nach dem Login oben links auf das bunte Logo klicken und Data Source auswählen.

Grafana-1.png

  • Dann die Daten wie im folgendem Bild ausfüllen:

Grafana-2.png

Stimmen die Daten, wird beim Speichern automatisch geprüft, ob die Einstellungen stimmig sind.

  • Dann wird ein neues Dashboard erzeugt:

Grafana-3.png

Nun gibt es ein kleine grüne Lasche an der linken Seite. Wird es mit der Maus angeklickt fährt es heraus und man erhält weitere Optionen:

Grafana-4.png

Wir wollen einen neuen Graphen hinzufügen. Es wird per Default ein Beispielgraph automatisch eingefügt, der aber gleich verschwindet, sobald als Quelle "Graphite" (der Name der bei der Einrichtung der Data Source vergeben wurde) ausgewählt wird:

Grafana-5.png

Unten am Bild ist "Panel data source" zu erkennen, bei dem default ausgewählt wurde. Das lässt sich in den Einstellungen von Grafana ändern. Wird Panel data source auf Graphite geändert ...

Grafana-6.png

... lassen sich nun die von Icinga2 gesammelten Werte auswählen und anzeigen ....

Grafana-7.png

Grafana-8.png

Grafana-9.png

Damit lässt sich das Panel nun speichern. Möchte man weitere Parameter / Einstellungen ändern, so genügt ein Klick auf den Titel des Panels. Es erscheint darauf hin ein kleines Menü.

Hat man alles zusammen, kann dann das dann Dashboard gespeichert und umbenannt werden. Das lässt sich jeweils mit den Icons neben dem Dashboard Namen auslösen.

Influxdb

Seit Icinga 2.5 besteht die Möglichkeit als "Zeitdatenbank" (Time series database) InfluxDB zu verwenden. Influxdb hat da einige Vorteile gegebenüber Carbon von Graphite:

  • Prallen zu viele Daten auf Carbon ein, fängt dieser an Metriken zu verwerfen. Das ist ein Problem von Pyhton und Multithreading ...
  • Kommt Carbon an eine Grenzen, verrät er das einem leider nicht
  • Schreibt Carbon Daten, passiert dies nicht in einem Strom, sondern der Daemon führt das komplette Programm von "öffnen, schreiben, schließen" durch.

Hier findet sich eine schöne Beschreibung.

Vom Prinzip her ist die Einrichtung sehr einfach:

  • Deb Zeile hinzufügen
  • Influxdb Daemon anpassen und Datenbank erstellen
  • Icinga2 Influxdb als Datenempfänger aktivieren
  • Neue Datequelle zu Grafana hinzufügen
  • Schickes Dashboard einrichten

Influxdb - Installation

  • Sources.list hinzufügen
Debian-term.png
# echo "deb https://repos.influxdata.com/debian jessie stable" | tee /etc/apt/sources.list.d/influxdb.list
# curl -sL https://repos.influxdata.com/influxdb.key |  apt-key add -
# apt-get update
  • Influxdb installieren
Debian-term.png
# apt-get install influxdb
  • Grundkonfiguration erzeugen
Debian-term.png
# cd /etc/influxdb
# influxd config > influxdb.generated.conf
Merging with configuration at: /etc/influxdb/influxdb.conf

Influxdb - Konfiguration

Influxdb lässt sich auf Anhieb ohne Restriktionen nutzen und würde nach dem Start auf den Ports 8083, 8086 und 8088 horchen. Um das Influxdb ein wenig sicherer zu konfigurieren, aktivieren wir Authentifizierung und SSL. Zuvor wird ein Admin Account erstellt:

  • Admin Account erzeugen
Debian-term.png
# service influxdb start
# influx
> CREATE USER admin WITH PASSWORD 'timeismoney' WITH ALL PRIVILEGES
> quit
  • LetsEnctypt Berechtigungen

Wer wie im Beispiel LetsEncrypt verwendet, muss ein paar Berechtigungen anpassen, sonst kann der Daemon nicht auf die Zertifikate zugreifen:

Debian-term.png
# usermod -a -G ssl-cert influxdb
# chgrp -R ssl-cert /etc/letsencrypt

Danach kann die Konfiguration angepasst werden. Hier werden nur die abgeänderten Werte aufgelistet.

Hier sind die Zeilen für TLS hinzugekommen. Es ist allerdings eine Sache zu beachten: Während die http Sektion mit getrennten Dateien für das Zertifikat und Schlüssel zurecht kommt, kann das die Admin Sektion nicht.

Für LetsEncrypt gilt dann:

Debian-term.png
# cat /etc/letsencrypt/live/icinga.example.com/cert.pem /etc/letsencrypt/live/icinga.example.com/chain.pem /etc/letsencrypt/live/icinga.example.com/privkey.pem > /etc/letsencrypt/live/icinga.example.com/full.pem
# chown root:letsencrypt /etc/letsencrypt/live/icinga.example.com/full.pem
# chmod 640 /etc/letsencrypt/live/icinga.example.com/full.pem
  • /etc/influxdb/influxdb.conf:
Ascii.png
[....]
[admin]
  enabled = true
  bind-address = ":8083"
  https-enabled = true
  https-certificate = "/etc/letsencrypt/live/icinga.example.com/full.pem"
[...]

Hier wird ebenfalls SSL aktiviert und die Authentifizierung:

Ascii.png
[....]
[http]
  enabled = true
  bind-address = ":8086"
  auth-enabled = true
  log-enabled = true
  write-tracing = false
  pprof-enabled = false
  https-enabled = true
  https-certificate = "/etc/letsencrypt/live/icinga.example.com/fullchain.pem"
  https-private-key = "/etc/letsencrypt/live/icinga.example.com/privkey.pem"
  max-row-limit = 10000
  realm = "InfluxDB"
[...]

Jetzt kann Influxdb neugestartet und die Authentifizierung getestet werden.

  • Admin Account testen
Debian-term.png
# service influxdb restart
# influx -ssl -host icinga.example.com
> auth
username: admin
password: ....
>

Hat man ein selbst signiertes Zertifikat und Probleme sich zu verbinden, kann man auch "-unsafeSsl" als Parameter verwenden.

Hat der Login geklappt, kann es weitergehen.

Influxdb - Icinga2 Datenbank

Als erstes mit dem Admin Account einloggen, danach Datenbank und User erzeugen:

Debian-term.png
# influx -ssl -host icinga.example.com
> auth
username: admin
password: ....
> create database icinga2;
> create user icinga2 with password 'supersecret';
> grant all on icinga2 to icinga2;

Diese Login Daten werden später auch für Grafana benötigt.

Jetzt kann das Icinga2 Influxdb Modul aktiviert werden:

Debian-term.png
# icinga2 feature enable influxdb

Vor dem Neustart muss allerdings noch die Konfiguration angepasst werden:

  • /etc/icinga2/features-enabled/influxdb.conf:
Ascii.png
library "perfdata"

object InfluxdbWriter "influxdb" {
	host = "icinga.example.com"
		port = 8086
		database = "icinga2"
		ssl_enable = true
		username = "icinga2"
		enable_send_metadata = true
                enable_send_thresholds = true
		password = "supersecret"
		host_template = {
			measurement = "$host.check_command$"
			tags = {
				fqdn = "$host.name$"
				hostname = "$host.vars.hostname$"
				domain = "$host.vars.domain$"
				}
		}
	service_template = {
		measurement = "$service.check_command$"
			tags = {
				fqdn = "$host.name$"
				domain = "$host.vars.domain$"
				service = "$service.name$"
				instance = "$service.vars.instance$"
			}
	}
}

Wichtig sind hier die Logindaten und das auch SSL aktiv ist. Die Templates für Service und Host stammen von hier. Danach reicht ein Neustart von Icinga2, um dann die ersten Daten in Influxdb bewundern zu können.

Debian-term.png
# influx -ssl -host icinga.example.com
> auth
username: icinga2
password: ...
> use icinga2
> show measurements
name: measurements
------------------
name
apt
check_scsi_smart
disk
hostalive
http
icinga
load
ping4
ping6
procs
ssh
swap
users

> quit

Damit ist die Einrichtung von Influxdb für das erste abgeschlossen.

Influxdb - Grafana Quelle und Dashboard

Um auf die neue Datenquelle über Grafana zugreifen zu können, muss zu der Graphite (sofern schon vorhanden) noch Influxdb hinzugefügt werden. Das geht wie bei Graphite oben über den Admin Account -> Add Data source.

Grafana-Influx-Source.png

Damit lässt sich nun ein Graph hinzufügen, der wie eine SQL Abfrage augebaut wird. Hier ein Beispiel:

Grafana-influx-load.png


Richtig schön ist das Beispiel von den Netways Leuten, die ein Dashboard für Influx und Grafana gebastelt haben. Dazu genügt es ein neues Dashboard zu erzeugen und dieses von hier zu importieren.

Grafana-Influx-Dashboard.png

Dann lassen sich auch schon die ersten Daten visualisieren

Grafana-influx-Dashboard-2.png

Sinatra Dashboard

SinatraDashboard.png

Wenn etwas nicht sonderlich schön anzuschauen ist, dann die Standardseite von Icinga, Icinga2. Zumeist passt es nicht auf einen Bildschirm, oder es muss zu viel umgebaut werden, sodass die wesentlichen Informationen dargestellt werden können. An diese Stelle tritt nun das [Dashboard http://dashing.io/]. Es ist im Grunde ein Framework, welches Informationen "hübsch" darstellt, passend für einen großen Monitor an der Wand.

Von Netways gibt es eine angepasste Version die sich recht leicht installieren lässt. Einzig: wieder kein Debian Paket und vor allem ruby / bundler kram :-(

In meinem Fall installiere ich das Dashboard auf einem Cubietruck, auf dem lediglich ein icinga2-bin installiert ist.

Installation und Konfiguration

Da das Dashboard die API von Icinga2 anzapft, benötigen wir dafür einen weiteren API User auf dem Icinga2 Monitoring Host:

  • /etc/icinga2/conf.d/api-users.conf
Ascii.png
object ApiUser "dashing" {
  password = "Das andere geheime Kennwort"
  permissions = [ "status/query", "objects/query/*" ]
}

Nach einem reload von Icinga2, steht der Benutzer zur Verfügung.

Nun geht es auf dem Rechner weiter, auf dem das Dashboard installiert werden soll.

  • Pakete die notwendig sind:
Debian-term.png
# apt-get install ruby-dev nodejs
  • Git ausschecken:
Debian-term.png
# cd /opt
# git clone https://github.com/Icinga/dashing-icinga2
# chown nagios: -R dashing-icinga2
  • Bundler kram
Debian-term.png
# su - nagios -s /bin/bash
$ cd /opt/dashing-icinga2/
$ gem install bundler
$ gem install dashing

Bundler ruft sudo auf um einige Programme nach /usr/local/bin zu installieren, daher sollte man das sudo konfigurieren ...

  • Konfiguration /opt/dashing-icinga2/jobs/icinga2.rb anpassen:
Ascii.png
...
 $api_url_base = "https://icinga.example.com:5665"
...
$api_username = "dashing"
...
$api_password = "Das andere geheime Kennwort"

Für den Fall, dass eine Firewall zwischen beiden steht, besser vorher mit einem Telnet auf Port 5665 prüfen, ob sich der Icinga2 meldet.

  • Starten
Debian-term.png
# su - nagios -s /bin/bash
$ cd /opt/dashing-icinga2/
$ ./restart-dashing

Hat alles geklappt, meldet sich das Dashboard auf Port 8005.

Damit auch bei einem Reboot das Dashboard gestartet wird, habe ich ein Init Script von hier verwendet und leicht angepasst:

  • /etc/init.d/dashboard:
Ascii.png
#!/bin/bash
# USAGE: start|stop|restart|status

### BEGIN INIT INFO
# Provides:          dashboard
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

set -e
. /lib/lsb/init-functions

# Must be a valid filename
NAME=dashing
DASHING_DIR=/opt/dashing-icinga2
PIDFILE="$DASHING_DIR/$NAME.pid"
DAEMON=/usr/local/bin/$NAME
GEM_HOME=/var/lib/gems/1.9.1

DASHING_PORT=8005
DAEMON_OPTS="start -d -p $DASHING_PORT -P $PIDFILE --tag $NAME -D"

RUNUSER=nagios
RUNGROUP=nagios

test -x $DAEMON || { log_failure_msg "$NAME not installed";exit 1; }

function checkuser() {
  if [[ $UID != 0 ]]; then
    if [[ `whoami` != "$RUNUSER" ]]; then
      log_failure_msg "$1 must be run as root or $RUNUSER"
      exit 1
    fi
  fi
}

function start_dashing() {
  log_action_msg "Starting daemon: $NAME" || true
  sleep 5
  start-stop-daemon --verbose --quiet --start --chuid $RUNUSER:$RUNGROUP --chdir $DASHING_DIR --exec $DAEMON -- $DAEMON_OPTS
  log_end_msg 0
}

function stop_dashing() {
  log_action_msg "Stopping daemon: $NAME" || true
  start-stop-daemon --quiet --stop --pidfile $PIDFILE --user $RUNUSER --retry 30 --oknodo
  log_end_msg 0
}


case "$1" in
  start)
    checkuser start
    start_dashing
  ;;
  stop)
    checkuser stop
    stop_dashing
  ;;
  restart)
    checkuser restart
    log_action_msg "Restarting daemon: $NAME"
    stop_dashing
    start_dashing
  ;;
  status)
    status_of_proc -p $DAEMON $NAME
  ;;
  logs)
    tail -F $DASHING_DIR/log/thin.log
  ;;
  *)
  echo "Usage: "$1" {start|stop|restart|status}"
  exit 1
esac

exit 0
  • Init Script aktivieren
Debian-term.png
# chmod +x /etc/init.d/dashboard
# update-rc.d dashboard defaults

Vor dem ersten Test, prüfen ob der "thin" Prozess noch läuft und eventuell killen:

  • Starten
Debian-term.png
# ps ax | grep thin
28368 ?        Rl     0:02 thin server (0.0.0.0:8005) [dashing]
# kill 28368
# ps ax | grep thin

# service dashboard start
# service dashboard status

dashboard.service - LSB: Start daemon at boot time
   Loaded: loaded (/etc/init.d/dashboard)
   Active: active (running) since Sun 2016-10-30 21:16:27 CET; 2min 8s ago
  Process: 28306 ExecStop=/etc/init.d/dashboard stop (code=exited, status=0/SUCCESS)
  Process: 28354 ExecStart=/etc/init.d/dashboard start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/dashboard.service
           └─28368 thin server (0.0.0.0:8005) [dashing]

Oct 30 21:16:15 web dashboard[28354]: Starting daemon: dashing.
Oct 30 21:16:27 web dashboard[28354]: .
Oct 30 21:16:27 web systemd[1]: Started LSB: Start daemon at boot time.

Denny (Diskussion) 22:10, 23. Okt. 2016 (CEST)