Rundum updaten mit Ansible

Nachdem wir ja nun auch alle möglichen Dienstleistungen rund um Ansible anbieten, dachte ich mir, es kann nicht schaden, es mir auch mal zu Gemüte zu führen. Kurzum: Ich bin bisher begeistert davon, wie einfach man damit auch komplexe Aufgaben lösen kann und werde sicherlich mein Wissen in dieser Richtung noch vertiefen.

Meine ersten Gehversuche haben mir dann auch gleich geholfen, ein Problem zu lösen, das mich schon länger geplagt hat. IT’ler neigen ja dazu, auch selber eine umfangereiche Infrastruktur zu betreiben und dabei wird der Aufwand üblicherweise mit der Zeit nicht weniger. Ich habe durchaus einige ähnliche Systeme im Einsatz und kann getrost sagen, wenn ich bei ein paar repräsentativen Systemen geprüft habe, ob ich anstehende Updates sofort einspielen oder lieber warten sollte, kann ich sie für die restlichen Rechner auch gleich machen. Aber wie, ohne ständig von System zu System hüpfen zu müssen. Es gibt dafür natürlich Lösungen, aber die meisten, die ich gefunden habe, brauchen einfach deutlich zu viele Ressourcen und rentieren sich auch für meine mittlere zweistellige Anzahl an Rechnern nicht.

Also habe ich versucht, das Problem mit Ansible zu erschlagen und war auch in erstaunlich kurzer Zeit fertig. Inzwischen weiss ich, dass meine Lösung nicht sonderlich elegant ist und man noch einiges daran verbessern kann, aber ich denke, sie ist eingängig und deshalb möchte ich sie hier vorstellen.

Zuerst lege ich mir die Datei ~/ansible/hosts an, in der sämtliche Hosts namentlich aufgelistet werden. Ich habe sie anonymisiert und stark gekürzt, um den Blogartikel nicht unnötig in die Länge zu ziehen. z.B. ist hier nur ein NAT mit Hosts dargestellt, in meiner “echten” Liste sind es mehr, was “händische” Updates nicht einfacher macht.

[centos:children]
centos6
centos7

[debian:children]
debian-jessie
raspbian-stretch
debian-stretch

[centos6]
odin.example.com
kvasir.example.com

[centos7]
balder.example.com
heimdall.example.com
tyr.example.com

[raspbian-stretch]
rerun.asgard.example.com

[debian-jessie]
gullveig.example.com
[debian-stretch]
freyr.example.com

[solaris11]
surtur.asgard.example.com
[special-centos]
loki.asgard.example.com

[asgard]
loki.asgard.example.com
rerun.asgard.example.com
surtur.asgard.example.com

Zuerst werden hier Gruppen definiert, die andere Gruppen zusammenfassen. So sind die Gruppen centos6 und centos7 Teil von centos und alle Hosts in den Untergruppen auch gleichzeitig Mitglied in den Übergruppen. Bei genauem Hinsehen erkennt man auch, dass loki.asgard.example.com Mitglied in zwei Gruppen ist, was durchaus so beabsichtigt ist.

Das folgende Playbook ( ~/ansible/playbooks/update-all.yml ) kann nun (fast) alle Systeme auf einen Schlag aktualisieren. Wenn mir also mein Icinga 2 meldet, dass Updates anstehen, suche ich mir einen repräsentativen Host jeder Gruppe aus und prüfe, welche Updates anstehen. Denke ich, dass ich sie gefahrlos einspielen kann, starte ich das folgende Playbook.

---
- hosts: centos*:!special-centos
  remote_user: alice
  become: yes
  tasks: 
    - name: update everything
      yum:
        name: "*"
        state: latest
        exclude: "owncloud*"
- hosts: special-centos
  remote_user: alice
  become: yes
  tasks: 
    - name: update everything
      yum:
        name: "*"
        state: latest
        skip_broken: yes
- hosts: debian*:raspbian*
  remote_user : alice
  become: yes
  tasks:
    - name: install dmidecode
      apt:
        name: dmidecode
        update_cache: yes
    - name: update package cache
      apt:
        update_cache: yes
    - name: upgrade packages
      apt:
        upgrade: dist
        force: yes
    - name: autoremove dependencies
      apt:
        autoremove: yes

Das erste Play verbindet sich zu allen centos Hosts, die nicht Teil der Gruppe centos-special sind und führt das Modul yum aus, das mit der Option latest alle Pakete aktualisiert. Explizit ausgeklammert ist dabei owncloud, da hier immer Nacharbeiten nötig sind. Dabei nutzt Ansible den User alice, für den ein SSH Key hinterlegt ist und wird per sudo zu root. Das muss natürlich vorher erlaubt werden, wobei Ansible auch ermöglicht, für sudo Passwörter mitzugeben. Ist dieses Play durchgelaufen, sind alle CentOS Maschinen, ausser loki aktualisiert. Dabei handelt es sich um eine “gewachsene Speziallösung” auf der diverse Pakete aus Drittrepositories installiert sind, die inzwischen in defekten Abhängigkeiten festhängen. Hier wird das yum Modul also mit der skip_broken Option aufgerufen, das diese verbogenen Pakete ausklammert.

Das Paket deltarpm um Gebrauch von deltarpms zu machen, habe ich über ein anderes Playbook installiert, könnte man aber prinzipiell auch noch hier vor den ersten Plays aufnehmen.

Nach den CentOS Hosts kommen die Debian Maschinen an die Reihe. Hier wird erst dmidecode installiert, das für den reibungslosen Ablauf nötig ist und z.B. bei raspbian nicht gleich installiert war. Ist das Paket bereits installiert, überspringt Ansible diesen Schritt nach einer Prüfung. Die Tasks für Debian haben alle das Update des package cache deaktiviert, was den Ablauf sehr beschleunigt. Der erste Task führt dieses Update durch und das reicht für alle weiteren. Zum Schluss werden noch nicht mehr benötigte Dependencies entfernt.

Damit Ansible sich auch in das NAT “asgard” verbinden kann, habe ich entsprechende Optionen in ~/ansible/hosts/group_vars/asgard hinterlegt.

ansible_ssh_common_args: '-o ProxyCommand="ssh -W %h:%p -q asgard.example.com" -o ConnectTimeout=800s'
ntp_server: 192.168.74.19

Damit wird festgelegt, dass ansible sich zu allen diesen Hosts über einen Jumphost verbinden muss. Dabei gibt der Name der Datei an, für welche Gruppe von Hosts die darin enthaltenen Optionen gelten. Die Adresse des NTP Servers hat keinen Einfluss auf dieses Playbook, soll aber zeigen, dass man hier auch einfach andere Variablen setzen kann.

Der Solaris Host bleibt hier aussen vor, da es dafür noch kein fertiges Modul für Updates gibt. Hier greife ich ggf. noch händisch ein.

Inzwischen weiss ich, dass man die verwendeten Module auch einfach abhängig vom Fact des Betriebssystems machen kann und noch den einen oder anderen Kniff. Aber in der aktuellen Version ist das Playbook wohl besser verständlich.

Wer mehr über Ansible wissen will, sollte unbedingt mal in einer unserer Schulungen vorbeischauen.

Thomas Widhalm

Autor: Thomas Widhalm

Thomas war Systemadministrator an einer österreichischen Universität und da besonders für Linux und Unix zuständig. Seit 2013 möchte er aber lieber die große weite Welt sehen und hat sich deshalb dem Netways Consulting Team angeschlossen. Er möchte ausserdem möglichst weit verbreiten, wie und wie einfach man persönliche Kommunikation sicher verschlüsseln kann, damit nicht dauernd über fehlenden Datenschutz gejammert, sondern endlich was dagegen unternommen wird. Mittlerweile wird er zum logstash - Guy bei Netways und hält Schulungen und erstellt Schulungsunterlagen zu diesem faszinierenden Tool. Seit 2017 stellt er sich neuen Herausforderungen als Lead Support Engineer und versucht sein Wissen aus den vorgenannten Tätigkeiten im Produktsupport umzusetzen.

Generationswechsel bei GnuPG/PGP Schlüsseln

Die für digitale Signaturen und zum Verschlüsseln von Daten verwendeten GnuPG bzw. PGP Schlüssel sind keine reinen Schlüssel im eigentlichen Sinne. Stattdessen enthalten sie den eigentlichen Schlüssel und diverse zusätzliche Informationen wie, für welche “IDs” (also Kombinationen aus Name und E-Mailadresse) sie gültig sind, wie lange sie gültig sind und einige Informationen über Hash- und Verschlüsselungsalgorithmen, die der Besitzer des Schlüssels vorzieht oder überhaupt zulässt.

Da sich das Wissen über die verwendeten Algorithmen weiterentwickelt und immer mehr Rechenleistung immer günstiger zu haben ist kann man leider nicht davon ausgehen, dass man einen Schlüssel für immer verwenden kann. Irgendwann ist er schlichtweg überholt und kann nicht mehr als sicher gelten. Dafür sind vor allem drei Komponenten ausschlaggebend: Die Länge des eigentlichen Schlüssels, der bevorzugte Verschlüsselungsalgorithmus und der für Signaturen verwendete Hash-Algorithmus.

Bei der Länge wird man beim Erstellen des Schlüssels mit einer Auswahl konfrontiert, die eine minimale und eine maximale Länge angibt. Manchmal kann man diese Auswahl auch übersteuern, läuft dann aber Gefahr, einen Schlüssel zu haben, mit dem viele Kommunikationspartner gar nichts anfangen können oder der so lange für jede Aktion braucht, dass er alleine schon deshalb unbrauchbar ist. Unter einigen Umständen bringt ein extralanger Schlüssel überhaupt nichts, da z.B. damit nur eine weitere, einmalige, Passphrase gesichert wird, die eine fixe Länge hat. (Asymmetrische Verfahren für lange Texte zu verwenden ist auch heute noch zu rechenintensiv, weshalb meist ein symmetrisches Verfahren mit einer einmaligen Passphrase eingesetzt wird und nur die wird asymmetrisch verschlüsselt). Etwas mehr dazu findet man in einem älteren Post zu dem Thema.

Die für die Kommunikation bevorzugten Algorithmen kann man in den “Preferences” des Schlüssels setzen. Mehr dazu im zuvor genannten Blogpost.

Signaturen jedoch werden einmalig erstellt und sollen dann gelten. Wer schon länger mit GnuPG arbeitet wird also noch einige Signaturen mit SHA1, so auch die Selbstsignatur, mit der der Schlüssel ursprünglich ausgestattet wurde. SHA1 gilt aber schon lange nicht mehr als sicher, weshalb man ihn auch nicht mehr benutzen sollte. (Ebenso MD5, mit dem auch früher Signaturen erstellt wurden). Wer einen DSA Schlüssel mit 1024bit Länge hat, sollte sich jetzt angesprochen fühlen.

Es gibt also mittlerweile mehrere Gründe, manche alte Schlüssel zu überdenken. Die Liste der bevorzugten Algorithmen lässt sich auch bei einem bestehenden Schlüssel einfach austauschen. Die Schlüssellänge liesse sich durch einen neuen Subkey realisieren, der aber auch einige extra Schritte beim Handling braucht. Signaturen auszutauschen wird aber ein aufwändiger Prozess, weil man mit allen, die den alten Schlüssel signiert haben, nochmal in Kontakt treten und sie um neue Signaturen auf dem neuen Schlüssel bitten muss. Und da wir ja hoffentlich alle sehr viele Signaturen auf unseren Schlüsseln haben, kann das schon recht aufwändig werden.

Um also möglichst alle Probleme, die ein alter Schlüssel mit sich bringt, auf einmal zu erschlagen, gehen viele User den Weg, einfach einen neuen Schlüssel anhand möglichst aktueller Best Practices (als Ausgangspunkt kann wieder der vorherige Blogpost dienen) zu erstellen und auf den umzusteigen.

Um einen neuen Schlüssel zu etablieren und einen alten dadurch zu ersetzen, kann man folgendermassen vorgehen:

  • Einen neuen Schlüssel anhand aktueller Best Practices erstellen
  • Den neuen Schlüssel mit dem alten Schlüssel signieren
  • Ob man auch den alten Schlüssel mit dem neuen signieren soll, da gehen die Meinungen auseinander. (Ich hab’s jedenfalls immer gemacht)
  • Den neuen Schlüssel (und ggf. den alten, aktualisierten) auf Schlüsselsever hochladen
  • Den neuen Schlüssel bekanntmachen. Am besten über möglichst viele Kanäle, die man sonst auch nutzt, um mit der Welt zu kommunizieren. E-Mail, Soziale Medien, Blog, Website,…
  • “Dinge”, die bestehen bleiben sollen, also Dokumente, Pakete, etc. die mit dem alten Schlüssel signiert wurden mit dem neuen Schlüssel signieren. Wenn mehrere Signaturen möglich sind, sollte die neue hinzukommen, sonst muss sie ersetzt werden. Vor diesem Schritt sollte man etwas warten, damit die Empfänger eine Chance haben, den neuen Schlüssel zu holen bzw. zu bemerken.
  • Die Leute, die den alten Schlüssel signiert haben, sollten informiert und gebeten werden, den neuen Schlüssel ebenfalls zu signieren.

Für den letzten Punkt gibt es einige Vorlagen, die man verwenden kann. Es bietet sich an, ein Klartextdokument aufzusetzen, in dem über den Tausch informiert wird und gleich die nötigen Befehle mitzuliefern, mit der der neue Schlüssel geholt und signiert werden kann. Ein entsprechendes Beispiel habe ich für meine persönlichen Schlüssel verfasst. Dieses Dokument wurde auch gleich sowohl mit dem alten als auch dem neuen Schlüssel unterschrieben, um den Empfängern die Echtheit zu bestätigen.

gpg --digest-algo SHA512 --clearsign -u 6265BAE6 -u A84CB603 key-transition-2018-01-05.txt

Dieses Dokument sollte man möglichst öffentlich machen und an die Leute schicken, die den alten Schlüssel signiert haben.

Verwendet man den Schlüssel auch zum Signieren von Paketen, ist der Umstieg etwas schwieriger. Man kann leider nicht erwarten, dass jeder User, der die Software einsetzt, auch regelmässig ein Blog oder andere Neuigkeiten liest, weshalb ein einfaches Ersetzen des Schlüssels dazu führen würde, dass die User neue Pakete nicht mehr installieren können. Um den Umstieg einfacher zu machen sollte bereits im Vorfeld ein “release”-Paket bereitgestellt werden, also eines das das eigene Repository in den Packagemanager der User konfiguriert und den entsprechenden Schlüssel ablegt. In diesem Paket kann man in einem neuen Release dann auch den neuen Schlüssel hinterlegen, sodass beide, der neue und der alte in den Packagemanager kommen. Stellt man später um, mit welchem Schlüssel man Pakete signiert, werden sie automatisch als valide signiert erkannt. (Da sich verschiedene Packagemanager unterschiedlich verhalten, sollte man das unbedingt vorher testen!)

Nicht abgedeckt sind jene User, die das Repository “von Hand” angelegt und den Schlüssel manuell importiert haben. Klar könnte man in eine Version der Software selbst den neuen Schlüssel-Import ins Paket verbauen, aber das würden einem die User (zu recht) um die Ohren hauen, da das Software Paket nur die Software installieren soll und nichts am Paketmanager verändern. Beim Release-Paket ist das was anderes, da das ja genau für solche Aufgaben gebaut wurde. Hier heisst es, im Vorfeld umso mehr über diverse Kanäle zu kommunizieren und es auch möglichst in alle fertigen Module, Cookbooks, Playbooks, etc. zu integrieren, dass für kurze Zeit zwei Schlüssel vorhanden sind und wann umgestiegen wird. Besonders geeignet ist natürlich der Release einer grösseren neuen Version, wo vielleicht sowieso ein neues Repository gebaut wird.

Einige Zeit, nachdem der Umstieg vollzogen wurde, sollte man den alten Schlüssel “revoken”, damit er nicht mehr benutzt wird. Auch könnte man das Release-Paket dazu bringen, den alten Schlüssel aus den Packagemanagern zu entfernen. Sollte tatsächlich jemand den alten Schlüssel knacken, ist man so auf der sicheren Seite und genau dafür hat man den Umstieg ja gemacht. Alte Informationen, die mit dem alten Schlüssel verschlüsselt wurden, kann man übrigens auch mit einem revoked key noch immer entschlüsseln. Jedenfalls kenne ich keine Software, die das nicht mehr erlauben würde. Nur verschlüsseln geht dann eben nicht nicht mehr.

Etwas mehr zum Nachlesen zum Thema gibt’s unter anderem auf den Debian Seiten.

Thomas Widhalm

Autor: Thomas Widhalm

Thomas war Systemadministrator an einer österreichischen Universität und da besonders für Linux und Unix zuständig. Seit 2013 möchte er aber lieber die große weite Welt sehen und hat sich deshalb dem Netways Consulting Team angeschlossen. Er möchte ausserdem möglichst weit verbreiten, wie und wie einfach man persönliche Kommunikation sicher verschlüsseln kann, damit nicht dauernd über fehlenden Datenschutz gejammert, sondern endlich was dagegen unternommen wird. Mittlerweile wird er zum logstash - Guy bei Netways und hält Schulungen und erstellt Schulungsunterlagen zu diesem faszinierenden Tool. Seit 2017 stellt er sich neuen Herausforderungen als Lead Support Engineer und versucht sein Wissen aus den vorgenannten Tätigkeiten im Produktsupport umzusetzen.

Liebes Icinga 2, sag “Aaaaaah”

Die meisten, die schon mal ein Support Ticket aufgemacht haben, kennen das:

“Hallo, ich hab’ ein Problem, weil blah blubb.”
“Hi, das ist schade. Ich hab’ hier ein paar Seiten Doku über Euer Setup. Ist das noch aktuell?”

Und erst dann geht’s los mit der eigentlichen Fehlersuche. Das hat vor allem den Hintergrund, dass viele unserer Kunden sehr unterschiedliche Ansätze haben, wie sie ihr Setup betreuen und mit uns zusammenarbeiten. Manche kontaktieren uns nur im Notfall, andere nehmen nur grössere Umbauten mit uns gemeinsam vor und pflegen alles andere selbst und wieder andere lassen alles von uns machen. Deshalb kommt auch immer erst die Frage, ob sich nicht vielleicht was geändert hat, was natürlich völlig ok ist, nur wissen muss man es für den Support.

Oder man stellt eine Frage im Monitoringportal. Dann kommt da auch gern mal: “Sag erstmal, was für ein Setup Du hast.”

Und genau für diese Fälle gibt’s jetzt (oder eher demnächst) das “Icinga 2 Diagnostics Script”. Das Script soll zwei Anwendungsfälle haben:

  • Einen ersten Überblick über die Eckdaten einer Installation
  • Eine umfassende Datensammlung um alle Feinheiten abzuklopfen

Dabei liegt der Fokus klar auf der ersten Anwendung. Icinga und die damit verbundenen Tools haben eine unglaubliche Flexibilität und können auf so viele unterschiedliche Arten verwendet und konfiguriert werden, dass es oft ziemlich aufwändig sein kann, einen ersten Überblick zu erhalten. Deshalb soll das Script einen nicht gleich mit Unmengen an Information überwältigen, sondern sie sinnvoll und übersichtlich aufbereiten. Dazu probiert es meist verschiedene Befehle durch, die einem Betriebssystem Informationen entlocken können und listet die Ausgabe dann entsprechend aufbereitet auf.

Der andere Modus sammelt so viele Informationen wie er nur kann, inklusive Logfiles, Konfiguration, Datenbankdumps, etc. Weil diese Daten manchmal Informationen enthalten, die man nicht rausgeben darf oder will, ist das nicht der Default Modus.

Egal, welchen Modus man verwendet, das Script sammelt die Daten und legt sie auf dem Host ab, der sie eingesammelt hat. Es gibt also keinen versteckten “Phone-Home” Mechanismus oder eine “praktische” Verschlüsselung, die nur verschlüsselte Daten zurücklässt, sodass der User nicht sieht, was er da verschickt. Auch ein Ändern der Daten ist vor dem Versand natürlich möglich, um z.B. Passwörter zu entfernen.

Ein Wunschtraum für die Zukunft wäre, dass das Script im Überblicksmodus auch auf ungewöhnliche Dinge prüft und nur meldet, wenn es etwas Erwähnenswertes gefunden hat. Also z.B. wenn eine Datenbank nicht dem Schema entspricht, das mitgeliefert wird – entspricht es, gibt’s aber keinen “Ok” Eintrag, um die Übersicht nicht zu beeinträchtigen.

Das Script ist aktuell noch auf dem Stand eines schnellen Hacks, der nach einem Dokumentationstermin bei einem Kunden entstanden ist. Ich habe damals versucht, die relevantesten Eckdaten des Setups zu dokumentieren und mir notiert, welche Befehle ich benutzt habe. Das wurde noch etwas erweitert (Danke Dirk, für die vielen guten Ideen) und einige davon in ein Script gegossen. Wie wahrscheinlich die meisten, die selber Projekte laufen haben, bin ich noch höchst unzufrieden mit dem Funktionsumfang, dem Errorhandling, dem Scripting-Stil, usw. Da ich aber nicht wieder ewig warten will, bis ich doch mal Zeit finde, daran weiter zu schrauben, folge ich der Empfehlung meiner Kollegen und mache ein offizielles Icinga-Projekt daraus. Das motiviert mich erstens sicherlich dazu, eher weiter zu arbeiten und andererseits, wird so wohl eher auch mal jemand den ein oder anderen Pull-Request schicken. Bitte habt aber Verständnis dafür, dass der Fokus darauf bleibt, den Output übersichtlich zu halten.

Inzwischen befindet sich das Script schon in einem GitHub Repo im Icinga Bereich. Wer es testen möchte, Ideen dafür hat oder auch mitarbeiten möchte, findet dort alles Nötige.

Thomas Widhalm

Autor: Thomas Widhalm

Thomas war Systemadministrator an einer österreichischen Universität und da besonders für Linux und Unix zuständig. Seit 2013 möchte er aber lieber die große weite Welt sehen und hat sich deshalb dem Netways Consulting Team angeschlossen. Er möchte ausserdem möglichst weit verbreiten, wie und wie einfach man persönliche Kommunikation sicher verschlüsseln kann, damit nicht dauernd über fehlenden Datenschutz gejammert, sondern endlich was dagegen unternommen wird. Mittlerweile wird er zum logstash - Guy bei Netways und hält Schulungen und erstellt Schulungsunterlagen zu diesem faszinierenden Tool. Seit 2017 stellt er sich neuen Herausforderungen als Lead Support Engineer und versucht sein Wissen aus den vorgenannten Tätigkeiten im Produktsupport umzusetzen.

Graphite entlasten mit Carbon Relay (NG)

Graphite ist eine der beiden häufig genutzten Lösungen zum Erstellen von Graphen durch (nicht nur) Icinga 2. Im Gegensatz zu PNP4Nagios, das zusätzliche Software braucht, bringt Graphite mit dem Carbon Cache schon von Haus aus eine Lösung mit, die Daten zwischenspeichern kann, bevor sie auf Platte geschrieben werden. Während eine einzelne Graphite Installation so etliche Datenpunkte in kurzer Zeit “verdauen” kann, so stösst auch Graphite irgendwann an seine Grenzen.

Eine Lösung, die sich bei einigen Setups bewährt hat, ist ein Carbon Relay. Eigentlich dafür gedacht, Daten auf mehrere Carbon Cache Instanzen aufzuteilen, bietet ein solches Relay auch die Möglichkeit, eine weitere Pufferinstanz einzuführen und so noch besser Lastspitzen abzufangen. Sollte das Relay nicht als Pufferinstanz ausreichen, ist damit schon die Grundlage gelegt, Graphite in der Breite zu skalieren.

Zur Auswahl stehen zwei Implementierungen des Carbon Relay, wobei der neuere, Carbon Relay NG genannte, Rewrite in “Go” bisher deutlich bessere Ergebnisse gebracht hat. Zur Installation werden Pakete angeboten, die auch über Repositories zu beziehen sind. Leider stehen keine einfachen Repo-Files, die die Repositories in den Package Manager konfigurieren, zur Verfügung. Statt dessen wird man gezwungen, ein Script auszuführen, das erst Abhängigkeiten installiert und dann ein passendes Repofile zusammenbaut und ablegt. Da ich nicht gern einfach irgendwelche Scripts auf meinen Hosts laufen lassen, habe ich die Anleitung auf einer Wegwerf-VM befolgt, die Schritte auf den eigentlichen Hosts nachempfunden und das Repofile kopiert. Danach reicht auf CentOS 7 ein yum install carbon-relay-ng um das Relay zu installieren.

Leider scheint das Paket noch nicht ausreichend für CentOS 7 angepasst zu sein, weshalb ein paar Nacharbeiten nötig sind: Die beiden Verzeichnisse /var/spool/carbon-relay-ng und /var/run/carbon-relay-ng müssen angelegt werden. Ausserdem braucht die Konfigurationsdatei /etc/carbon-relay-ng/carbon-relay-ng.conf noch ein paar kleinere Anpassungen. Sehr wichtig dabei ist, zwei Leerzeichen in der addRoute Zeile vor dem Empfänger zu verwenden.

instance = "default"
max_procs = 2
listen_addr = "0.0.0.0:2003"
pickle_addr = "0.0.0.0:2013"
admin_addr = "0.0.0.0:2004"
http_addr = "0.0.0.0:8081"
spool_dir = "/var/spool/carbon-relay-ng"
pid_file = "/var/run/carbon-relay-ng.pid"
log_level = "notice"
bad_metrics_max_age = "24h"
validation_level_legacy = "medium"
validation_level_m20 = "medium"
validate_order = false
init = [
     'addRoute sendAllMatch carbon-default  192.168.5.20:2003 spool=true pickle=false',
]
[instrumentation]
graphite_addr = "localhost:2003"
graphite_interval = 1000  # in ms

Dabei ist natürlich 192.168.5.20 durch die IP der Carbon Cache Instanz zu ersetzen.

Leider ist die Dokumentation des carbon-relay-ng aktuell noch etwas dürftig, weshalb einiges an Probiererei gefragt ist, wenn man die Funktionen ausreizen möchte. Zum Probieren und Testen habe ich Vagrant Boxen gebaut, die aktuell nicht viel mehr sind als Prototypen. Wer Erfahrung mit Vagrant und Puppet hat, kann die aber ganz gut als Ausgangsposition nehmen. Wenn sie mal ein bissl ausgereifter sind, wandern die auch aus meinem privaten Github Account in einen “offizielleren”.

Ein grosser Vorteil des Carbon Relay NG ist, dass es nicht nur puffern, sondern die Daten auch sehr einfach auf mehrere Carbon Cache Instanzen verteilen kann. Dazu ändert man einfach den init Teil der Konfigurationsdatei auf folgende Version (auch hier wieder zwei Leerzeichen vor jedem Ziel):

init = [
        'addRoute consistentHashing carbon-default  192.168.5.20:2003 spool=true pickle=false  192.168.5.30:2003 spool=true pickle=false',
]

Dabei wird der cosistentHashing Algorithmus von Graphite verwendet, der Metriken anhand ihres Namens auf verschiedene Instanzen verteilt. Somit kann man ganz einfach die Schreiblast auf beliebig viele Carbon Caches verteilen und stellt sicher, dass die Metriken immer am gleichen Cache ankommen. Am besten funktioniert das, wenn man die Verteilung konfiguriert, bevor zum ersten mal Daten in die Carbon Caches geschrieben werden. Sollte man eine bestehende Installation umziehen wollen, muss man alle bereits angelegten Whisper Files auf alle Carbon Caches verteilen. Also eigentlich nicht alle, da es aber nicht einfach nachvollziehbar ist, welche Metriken der Hashing-Algorithmus wo hin schreibt, ist es sicherer, alle zu kopieren und nach einiger Zeit mit find diejenigen zu suchen und zu löschen, in die schon länger nicht mehr geschrieben wurde. Das sollte man ohnehin regelmässig machen, da Whisper Files von Hosts und Services, die man in Icinga 2 umbenennt oder entfernt, liegen bleiben.

Hat man mehrere Carbon Cache Instanzen als Ziel konfiguriert, muss man sie auch für Graphite-Web nutzbar machen. Viele Addons wie Grafana nutzen die API von Graphite-Web, um auf die in Graphite gespeicherten Daten zuzugreifen, weshalb es naheliegend ist, sämtliche Datenquellen dort zu hinterlegen. Graphite-Web lässt in seiner Konfiguration mehrere Datenquellen zu, wobei 3 davon für uns relevant sind:

  1. lokale Whisper Files
  2. Andere Graphite-Web APIs
  3. Andere Carbon Caches (hier sollten nur die angegeben werden, die auf dem selben Host liegen, wie Graphite-Web, sonst lieber den Umweg über Lösung 2)

Da Graphite-Web üblicherweise so konfiguriert ist, dass es die lokalen Whisper Files verwendet, muss in local_settings.py nur mehr die zusätzliche Graphite Instanz auf dem hinzugekommenen Host konfiguriert werden. (Port 8003 ist hier aus den oben genannten Vagrant Boxen entnommen. Natürlich muss hier konfiguriert werden, wie das andere Graphite Web erreicht werden kann)

CLUSTER_SERVERS = ["192.168.5.30:8003"]

So erreicht man zwar keine Hochverfügbarkeit, aber das liesse sich relativ einfach erreichen, in dem man mehrere Graphite Webs anlegt, die jeweils ihre lokalen Whisper Files und die APIs aller anderen Instanzen konfiguriert haben. Davor einen Loadbalancer, fertig. Auf jeden Fall hat man auf diese Weise aber Carbon Cache in die Breite skaliert, was für grosse Installationen, die vielleicht nicht nur aus Icinga 2, sondern auch aus dem Elastic Stack und collectd Daten erhalten, einige Probleme lösen kann.

Wer jetzt Lust bekommen hat, mehr über Graphite zu erfahren, der sollte sich mal unser Schulungsangebot dazu ansehen.

Thomas Widhalm

Autor: Thomas Widhalm

Thomas war Systemadministrator an einer österreichischen Universität und da besonders für Linux und Unix zuständig. Seit 2013 möchte er aber lieber die große weite Welt sehen und hat sich deshalb dem Netways Consulting Team angeschlossen. Er möchte ausserdem möglichst weit verbreiten, wie und wie einfach man persönliche Kommunikation sicher verschlüsseln kann, damit nicht dauernd über fehlenden Datenschutz gejammert, sondern endlich was dagegen unternommen wird. Mittlerweile wird er zum logstash - Guy bei Netways und hält Schulungen und erstellt Schulungsunterlagen zu diesem faszinierenden Tool. Seit 2017 stellt er sich neuen Herausforderungen als Lead Support Engineer und versucht sein Wissen aus den vorgenannten Tätigkeiten im Produktsupport umzusetzen.

Netways auf der Elastic{ON}17

Wie letztes Jahr hatten einige von uns die grossartige Gelegenheit, die Elastic{ON} in San Francisco besuchen. Dort stellt Elastic sämtliche kommenden Neuerungen am Elastic Stack vor. Daneben haben auch einige Kunden und Partner die Möglichkeit, ihre Use-cases oder Services zu präsentieren sowie ihr eigenes Setup und dessen Herausforderungen zu zeigen.

Die Neuigkeiten im Stack zeigen vor allem drei Schwerpunkte: Graphische Bedienung, mehr Visualisierungen in Kibana und noch mehr Stabilität. So sind eine graphische Aufbereitung und wohl auch eine teilweise graphische Konfiguration von Logstash Pipelines via Kibana geplant.

In Kibana selbst tut sich sehr viel. Da kommen neue Visualisierungen, insb. für Geolocation und ein “Visualisation Builder”, mit dem man deutlich ausgefallenere Graphen als bisher erstellen kann. In einer one-on-one Test Session konnte ich dieses Feature schon mal bestaunen, bin aber, ehrlich gesagt, etwas an der Komplexität und der ungewohnten Bedienung gescheitert. Entweder hat da noch der Jet-Lag zugeschlagen oder Elastic sollte noch etwas an der Bedienung feilen, die ja sonst doch sehr eingängig ist.

An der Stabilität wird insbesondere bei Elasticsearch gearbeitet. Dabei ist wohl eine Art “Transaction Log” geplant, das endlich schnelle Neustarts von Clusterknoten ohne vorherigen “Flushed Sync” ermöglicht und auch sonst sehr zur Stabilität beitragen soll.

Es wäre nicht Elastic, wenn nicht auch eine Menge Livedemos vorgeführt werden würden, was wir sehr schätzen, da sie doch auch einen wirklich sehr konkreten Nutzen für die Teilnehmer haben. Da heben sich die Elastic Mitarbeiter wirklich von vielen anderen Sprechern auf, insbesondere amerikanischen, Konferenzen positiv ab. Eine besonders beeindruckende Demo war der Auftakt der Konferenz mit einer Tänzerin, deren Bewegungen und Herzschlag live in Kibana visualisiert wurden. Das schien tatsächlich live zu sein, da Kibana durchaus auch mal den ambivalenten Smiley zeigte, der angibt, dass aktuell keine Datensätze gefunden wurden.

Es ist noch etwas zu früh, um alle Änderungen sichten und bewerten zu können, aber es sieht jedenfalls so aus, als hätte Elastic etliches in petto, das uns als Elastic Stack Usern das Leben deutlich einfacher und vor allem bunter machen würde. Wie immer schwebt das Damoklesschwert “kommt dieses Feature in X-Pack oder bleibt es frei” über jeder angekündigten Neuerung, aber das scheint teilweise noch gar nicht entschieden zu sein. Ziemlich sicher wird “Machine Learning” ein Kibana Feature, das aus “Prelert” entstanden ist, nur für Nutzer von X-Pack erhältlich sein. Ob “Canvas”, ein Feature, mit dem Reports und Präsentationen aus Kibana heraus erstellt werden können, frei verfügbar sein wird, wird noch entschieden. Auf jeden Fall würde das vielen Usern sehr weiterhelfen, nach dem, was wir an Nachfragen erhalten.

Viele der Features wurden für “kommende Releases” angekündigt. Einige davon kommen in 5.3, andere erst in 6.0.

Auf jeden Fall war die Konferenz wieder die Reise wert und ich kann es kaum erwarten, mit den neuen Features zu experimentieren und sie umzusetzen.

Ganz abgesehen von der Konferenz ist San Francisco natürlich auch für sich genommen eine wunderbare Stadt und wir alle sind sehr froh, dass die Reise so gefallen ist, dass wir uns auch noch etwas die Stadt ansehen konnten.

Wer noch keinen Kontakt zum Elastic Stack hatte, sollte sich einmal unsere Schulungen zum Thema ansehen. Die kurz und knackig und bieten alles, was man für einen Start in die Welt des Logmanagement braucht.

Dass der Blogpost etwas später als gewohnt erscheint liegt an der Zeitverschiebung und dem einen oder anderen wunderbaren IPA, das es hier zu probieren gab.

Die Talks gibt es sicherlich demnächst im Archiv nachzusehen.

Thomas Widhalm

Autor: Thomas Widhalm

Thomas war Systemadministrator an einer österreichischen Universität und da besonders für Linux und Unix zuständig. Seit 2013 möchte er aber lieber die große weite Welt sehen und hat sich deshalb dem Netways Consulting Team angeschlossen. Er möchte ausserdem möglichst weit verbreiten, wie und wie einfach man persönliche Kommunikation sicher verschlüsseln kann, damit nicht dauernd über fehlenden Datenschutz gejammert, sondern endlich was dagegen unternommen wird. Mittlerweile wird er zum logstash - Guy bei Netways und hält Schulungen und erstellt Schulungsunterlagen zu diesem faszinierenden Tool. Seit 2017 stellt er sich neuen Herausforderungen als Lead Support Engineer und versucht sein Wissen aus den vorgenannten Tätigkeiten im Produktsupport umzusetzen.