Zum Inhalt springen

Zeitpläne, Befunde und Rollouts

Ein Zeitplan lässt Heinzel zu festen Zeiten nach Ihren Servern sehen, ohne dass jemand dabei ist. Was es findet und nicht allein beheben darf, wird ein Befund. Und eine Aufgabe, die auf vielen Servern dasselbe tun soll, ist ein Rollout: erst einer, dann alle.

Einen Zeitplan anlegen

Das Formular für einen neuen Zeitplan: Name, Servergruppe, wann, die Aufgabe, die Stufe und die Empfänger des Berichts
Der Zeitplan „Sicherheitsupdates“ der Beispiel GmbH: täglich um drei, zwölf Webserver, Heinzel ändert allein, Bericht an admins@.
FeldBedeutungBeispiel
WoEine Servergruppe, ein einzelner Server, oder Tags: dann jeder Server, der alle trägt, auch ein später getaggter. Gesperrte Server werden ausgelassen.Gruppe „Web“, oder env:prod role:web
Eine Session oder eine je ServerEine Session für alle, wenn die Server zusammengehören; eine je Server, vier gleichzeitig, wenn jeder für sich geprüft wird.eine je Server
WannTäglich zu einer Uhrzeit, wöchentlich, oder ein Cron-Ausdruck. In der Zeitzone des Mandanten (Einstellungen, Allgemein); ein neuer Mandant steht auf UTC.0 3 * * *
AufgabeWie in einer Session, nur ohne jemanden, der nachfragt: Sagen Sie, was liegen bleiben soll.siehe unten
Stuferw- liest nur. rwx ändert, so weit die Obergrenze des Mandanten, die Rechte des Besitzers und der Deckel jedes Servers es erlauben, bei jedem Befehl neu geprüft.rwx
ZugangDer Benutzer, als der Heinzel auf jedem Server arbeitet; ein Server ohne diesen Zugang wird ausgelassen.heinzel
Bericht anMailadressen, und der Kanal des Teams, wo der Mandant einen Webhook hat.admins@example.com

Die Aufgabe des Beispiels:

Eingabe: Spiele auf allen Servern die anstehenden Sicherheitsupdates ein und prüfe danach, ob alle Dienste laufen. Was das Journal eines Servers ausnimmt, lass stehen und melde es. Kein Neustart.

Wer Stufe, Aufgabe oder Modell ändert, wird Besitzer des Zeitplans; er läuft im Namen dieser Person und so weit, wie eine Session von ihr allein gehen dürfte. Ein Zeitplan gehört einer Gruppe, einer Person oder allen; die Personen dieser Gruppe ändern, pausieren und starten ihn. „Jetzt ausführen“ in der Liste startet ihn sofort.

Die Liste der Zeitpläne mit dem Zeitplan Sicherheitsupdates: täglich um 03:00, zwölf Server, Bericht an admins@example.com, Stufe rwx, läuft als anna.berg@example.com, mit Knöpfen zum Starten, Pausieren, Bearbeiten und Löschen
Die Liste sagt zu jedem Zeitplan, wann er zuletzt lief, wann er wieder läuft und als wer.

Was in der Nacht passiert

Ein Lauf ist eine unbeaufsichtigte Session je Server, und sie kann niemanden fragen. Lesebefehle laufen. Änderungen laufen, wo der Zeitplan auf rwx steht und Mandant, Besitzer und Server es erlauben. Alles andere wird übersprungen, im Bericht unter „Braucht einen Operator“ genannt und eine Woche auf der Seite Freigaben aufbewahrt, wo jemand es in eine eigene Session übernimmt. Eine Servergruppe kann ein Wartungsfenster tragen (Wochentage, von, bis); außerhalb liest ein Lauf nur.

Am Morgen eine Mail, als Text und als HTML: zuerst die Hosts, die jemanden brauchen, dann eine Zeile je Host, bei dem alles in Ordnung ist.

Die Mail des Nachtlaufs: oben der Server, der jemanden braucht, mit dem, was Heinzel dort stehen ließ, darunter eine Zeile je Server, bei dem alles in Ordnung ist
Der Bericht des Zeitplans „Sicherheitsupdates“ nach einer Nacht, aus dem Beispiel.

Das ganze Beispiel mit Bildern aus der Nacht: Sicherheitsupdates jede Nacht.

Befunde

Was ein Lauf als Problem gefunden hat, steht unter Befunde: ein Eintrag je Server und Problem. In der nächsten Nacht wieder gesehen, bleibt es ein Eintrag mit Zähler; sieht ein späterer Lauf desselben Zeitplans es nicht mehr, schließt es sich von selbst. Einen Befund übernehmen Sie, schließen ihn von Hand oder starten daraus eine Session: Die vorgeschlagene Aufgabe steht schon im Formular, lesen Sie sie, bevor Sie starten.

Die Seite Befunde mit einem offenen Befund: web07, zwei zurückgehaltene PHP-Pakete, gefunden vom Zeitplan Sicherheitsupdates, mit dem Knopf, daraus eine Session zu starten
Ein Befund aus der Nacht. Das Beispiel Ein Befund wird behoben zeigt, wie es weitergeht.

Rollouts: dasselbe auf vielen Servern

Neue Session, „Auf allen parallel dasselbe“: Server anhaken, von Hand oder nach Tag, Aufgabe einmal schreiben. Der Rollout läuft zuerst auf dem ersten Server als gewöhnliche Session mit jeder Freigabe, die sie braucht. Ist sie durch, liest jemand, der freigeben darf, diese Session und sagt Go. Dann läuft die Aufgabe auf den anderen, vier gleichzeitig.

Auf den anderen Servern laufen ohne Rückfrage nur die Befehle, die auf dem ersten ein Mensch freigegeben hat und die dort gelungen sind, keiner davon unumkehrbar, als derselbe Text und in derselben Reihenfolge, jeder erst, wenn der davor gelungen ist. Alles andere fragt wie immer. Jeder Server behält seine eigene Session, sein Protokoll und seinen Stopp-Knopf.

Die Seite eines Rollouts: eine Zeile je Server mit Zustand und Befehlen, der erste fertig, die übrigen zwölf nach dem Go gelaufen
Der Rollout aus dem Beispiel php2shell auf 13 Servern nach dem Go.

Alarme aus dem Monitoring

Lassen Sie Ihr Monitoring einen Alarm an Heinzel Pro schicken, und Heinzel sieht sofort nach: Unter Einstellungen, Anbindungen erzeugen Sie ein Token; das Monitoring sendet es als Bearer-Token an /api/alerts/<mandant>. Der Webhook von Alertmanager wird angenommen, wie er ist; jedes andere System sendet JSON mit host, title und text.

$ curl -X POST https://app.heinzel-pro.de/api/alerts/beispiel \
  -H "Authorization: Bearer $HEINZEL_ALERT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"host": "web03.example.com",
       "title": "Platte /var zu 92 % voll",
       "text": "Schwelle 90 % seit 10 Minuten überschritten"}'

Ist der Host einer Ihrer Server, startet dort eine Session, die nur liest und Ursache und Lösungsvorschlag berichtet; die Antwort auf den Aufruf enthält die Adresse der Session. Derselbe Alarm findet innerhalb einer Stunde seine Session wieder, und höchstens zwanzig Sessions starten pro Stunde. Umgekehrt markiert Heinzel Pro Änderungen im Monitoring: Mit einem Endpunkt, der Annotationen annimmt wie Grafana, erscheint jeder ausgeführte Befehl in den Graphen.

Was Sie benachrichtigt

Unter Einstellungen, Alarme: Mailadressen und ein Webhook (Slack, Teams, Mattermost, generisches JSON), und je Ereignis ein Haken: Freigabe nötig, Befehl fehlgeschlagen oder abgelehnt, Host-Key geändert, geplanter Lauf beendet, wiederholt fehlgeschlagene Anmeldungen, Benutzer angelegt, eine zu lange wartende Freigabe, ein Modell, das der Anbieter abschaltet, und eine Wochenmail mit dem, was liegen geblieben ist. Ereignisse, die ein Upgrade mitbringt, sind aus, bis Sie sie einschalten.

Einstellungen, Alarme: Mailadressen, ein Webhook für Slack, Teams oder Mattermost, und die Liste der Ereignisse mit je einem Haken
Für Microsoft Teams den Webhook über Workflows anlegen; die alten Office-365-Connectors nehmen die Karten nicht an.

Die API

Eine Pipeline, die Heinzel ein Deployment prüfen lässt, ein Skript, das Server anlegt, ein Bericht, der jeden Morgen abgeholt wird: Unter Verwaltung, API-Tokens erzeugt ein Administrator ein Token mit den Bereichen read, sessions und servers. Es handelt im Namen der Person, die es erzeugt hat, und darf nie mehr als sie. Und es gibt nie einen Befehl frei: Es sieht, was wartet, und kann ablehnen; eine Freigabe ist ein Mensch im Browser.

# Eine Session starten
$ curl -X POST https://app.heinzel-pro.de/api/v1/beispiel/sessions \
  -H "Authorization: Bearer hzp_…" \
  -H "Content-Type: application/json" \
  -d '{"server": "web03.example.com",
       "task": "Prüfe, warum nginx seit dem Deploy um 14:02 502 liefert"}'

# Ihren Zustand und die letzte Antwort lesen
$ curl -H "Authorization: Bearer hzp_…" \
  https://app.heinzel-pro.de/api/v1/beispiel/sessions/0199e2c4-…

# Den Änderungsnachweis als Markdown
$ curl -H "Authorization: Bearer hzp_…" \
  https://app.heinzel-pro.de/api/v1/beispiel/sessions/0199e2c4-…/record
AufrufBereichWas er tut
GET /serversreadDie Server mit ihren Zugängen.
POST /serversserversLegt einen an; gibt den öffentlichen Schlüssel zurück, der auf dem Host einzutragen ist.
GET /sessions, POST /sessionsread, sessionsDie Sessions der Person; eine starten mit server und task.
GET /sessions/:idreadZustand, letzte Antwort, Zusammenfassung, Befehle.
POST /sessions/:id/messagessessionsSchreibt text in eine Session.
GET /sessions/:id/recordreadDer Änderungsnachweis als Markdown.
GET /approvals, POST /approvals/:id/denyread, sessionsWas wartet; einen Befehl ablehnen, mit note.
GET /findingsreadDie offenen Befunde.
GET /schedules, POST /schedules/:id/runread, sessionsDie Zeitpläne; einen jetzt ausführen.

Ein unbekannter Mandant und ein falsches Token bekommen beide 401 mit demselben Inhalt; ein Aufruf außerhalb des Bereichs 403; einer, der so nicht geht (eine Session, die beschäftigt ist), 409. 120 Aufrufe pro Minute und Adresse sind die Vorgabe. Das Skript heinzel aus dem Repository ist eine Hülle um diese Aufrufe für die Shell.