1. Einleitung
In den anderen Artikeln zur Programmierung von Erweiterungen haben Sie bereits gelernt, wie Sie schon mit kleinen Python-Kenntnissen Erweiterungen entwickeln können. Und sicher haben Sie selbst auch schon Erweiterungen als MKP aus der Checkmk Exchange heruntergeladen und installiert. In diesem Artikel erfahren Sie nun alles Notwendige, um Erweiterungspakete für Checkmk anzupassen oder aus selbst entwickelten Erweiterungen zu erstellen.
1.1. Die Arbeitsumgebung
Verwenden Sie zur Erstellung und Anpassung von MKPs eine Instanz zum Testen und kopieren Sie die MKPs für die Verteilung auf die produktiv genutzte Instanz. Dies wird Ihnen vor allem zwei potentielle Probleme ersparen, die entstehen, wenn geänderte Dateien nicht rechtzeitig zu MKPs gepackt werden:
Beim Checkmk-Update werden lokal geänderte Dateien durch den letzten Stand des MKPs überschrieben (dem Autor dieses Satzes ist genau dies passiert).
Im verteilten Monitoring mit zentralem Setup wundern Sie sich, weil sich Plugins auf Remote-Instanzen anders verhalten als auf der Zentralinstanz, denn die Remote-Instanzen erhalten weiterhin den zuletzt gepackten Stand.
Zudem ist das Risiko, versehentlich etwas bereits Vorhandenes zu überschreiben, weit geringer, wenn eine Instanz primär zum Testen eigener Entwicklungen eingesetzt wird und keine produktiv genutzten Erweiterungen aus anderer Quelle nutzt.
1.2. Werkzeuge für MKPs
Zur Verwaltung von MKPs gibt es zwei Werkzeuge:
Den Befehl
mkpIn den kommerziellen Editionen haben Sie zusätzlich den Setup-Menüeintrag Maintenance > Extension Packages
Beide Wege sind kompatibel, und mit der einen Methode vorgenommene Änderungen sind sofort in der anderen Methode sichtbar. Aber: auf der Befehlszeile stehen zusätzliche Optionen zur Verfügung, die künftig weiter ausgebaut werden. Daneben ist der Einsatz in Skripten möglich.
Für die Entwicklungsarbeit raten wir daher zur Verwendung der Befehlszeile.
2. Der Workflow
In diesem Kapitel zeigen wir Ihnen an der Reihenfolge aus auflösen, anpassen, neu zusammenstellen und paketieren, wie Sie bei der Modifikation eines vorhandenen Paketes vorgehen. Unser Beispiel verwendet das in der Checkmk Exchange verfügbare Beispiel-MKP Hello world!. Wollen Sie stattdessen ein eigenes MKP aus selbst erstellten Dateien bauen, überspringen Sie einfach die ersten Schritte und gehen direkt zur Suche nach unpaketierten Dateien.
2.1. Ein MKP auflösen
Damit ein Paket aufgelöst werden kann, muss dieses zunächst den Zustand Enabled (active on this site) haben. Dies überprüfen Sie mit dem folgenden Befehl:
Ist das Paket nicht aktiv, aktivieren Sie es:
Im Falle, dass ein Paket mit Ihrer Checkmk-Version inkompatibel ist, sie das Paket aber dennoch aktivieren wollen – eben gerade um es auf die neuere Checkmk-Version anzupassen – verwenden Sie den zusätzlichen Parameter --force-install.
Das Auflösen geschieht dann mit dem folgenden Befehl:
Im Setup der kommerziellen Editionen steht alternativ das Symbol eines Klemmbausteins (
) zur Verfügung.
2.2. Modifikationen vornehmen
Nun passen Sie vorhandene Dateien an oder fügen neue hinzu. Falls Ihre Arbeit nicht auf einem vorhandenen MKP basiert, sondern sozusagen „von Null“ beginnt, werden Sie zunächst eine Verzeichnisstruktur anlegen und diese beispielsweise befüllen, wie es in den Artikeln zur Programmierung von agentenbasierten Check-Plugins, Spezialagenten oder SNMP-Plugins beschrieben ist.
2.3. Unpaketierte Dateien finden
Hat Ihre Entwicklungsarbeit einen Stand erreicht, mit dem Sie zufrieden sind, bereiten Sie das erneute Verpacken vor. Der erste Schritt hierfür ist, sich einen Überblick zu verschaffen, welche unpaketierten Dateien im Instanzverzeichnis liegen. Mit dieser Information können Sie entscheiden, ob Sie Dateien löschen oder frühere Experimente zuerst paketieren wollen.
Der hierfür verwendete Befehl ist mkp find:
Die angezeigte Liste ist rein informativ. Bei den kommerziellen Editionen können Sie auf der Seite Extension packages den Knopf List unpackaged files verwenden. In der angezeigten Seite können Sie nicht mehr benötigte Dateien einfach löschen.
2.4. Die Paketkonfiguration erstellen
Mit dem Befehl mkp template erstellen Sie eine Vorlage für eine Paketkonfiguration.
Als weiterer Parameter ist der Name des Pakets anzugeben.
Da der Befehl auf die Standardausgabe schreibt, müssen Sie die Ausgabe entweder umleiten oder Sie kopieren Sie einfach aus dem Terminal:
Wollen Sie stattdessen die Paketkonfiguration eines zuvor aufgelösten Paketes verwenden, extrahieren Sie diese einfach aus dem ursprünglichen Paket:
Passen Sie die Paketkonfiguration jetzt mit Ihrem Lieblingseditor an. Wie bei vielen anderen Konfigurationsdateien in Checkmk handelt es sich hier um eine Python-Datei. Achten Sie daher auf korrekte Python-Syntax.
Unter dem Schlüssel files können Sie Dateien entfernen, welche nicht paketiert werden sollen.
Tragen Sie unter version.min_required die Mindestversion von Checkmk ein, die erforderlich ist, um das Paket zu verwenden.
Unter version.usable_until können Sie die höchste Checkmk-Version angeben, für die das Paket nutzbar ist.
Wenn Sie ausschließlich die stabilen öffentlichen Plugin-APIs nutzen, wird Ihr Paket die ganze Spanne von 2.3.0 bis 3.0.99 abdecken.
Die verwendete Versionsnummer (Schlüssel version) muss den Konventionen des Semantic Versioning entsprechen.
Inkrementieren Sie bei kleinen Änderungen wie Bugfixes nur die letzte Stelle.
Wenn Sie eine kommerzielle Edition verwenden, finden Sie auf der Seite Setup > Maintenance > Extension packages den Knopf Create package. Dieser Knopf führt Sie zu einem Formular, in dem Sie alle in der Vorlage für die Paketkonfiguration enthaltenen Parameter eintragen können – ohne auf korrekte Python-Syntax achten zu müssen.
2.5. Das Paket erstellen
Ist das Bearbeiten der Konfigurationsdatei abgeschlossen, packen Sie mit mkp package gefolgt vom Namen der Konfigurationsdatei:
Bei diesem Vorgang wird nicht nur das MKP erzeugt, welches Sie dann in ~/var/check_mk/packages_local/ vorfinden oder im Paketmanagement der kommerziellen Editionen herunterladen können.
Das Paket wird zusätzlich direkt aktiviert (hat also den Zustand Enabled (active on this site)), was exakt dem Verhalten vor dem Paketieren entspricht.
Beachten Sie, dass beim Packen auf einer produktiv genutzten Instanz bei aktiviertem zentralem Setup das neue Paket direkt an die Remote-Instanzen verteilt wird. Diese Tatsache sollte ein weiterer Anlass für die Nutzung dedizierter Testinstanzen sein.
3. Veröffentlichung in der Checkmk Exchange
Falls Sie Ihr frisch erstelltes MKP teilen möchten, können Sie es in die Checkmk Exchange hochladen. Vor dem Upload sind einige Dinge zu berücksichtigen:
Seien Sie sich bewusst, dass Ihre Erweiterung unter GPL v2 lizenzierte Programmierschnittstellen nutzt und daher ebenfalls der Lizenz GPL v2 unterliegt.
Checkmk führt vor der Veröffentlichung eine Prüfung auf von der Erweiterung ausgehende Gefahren durch. Pakete, die außerhalb eines Instanzverzeichnisses lesen oder schreiben oder nicht von Checkmk bereitgestellte APIs verwenden, werden zurückgewiesen.
Weisen Sie bei der Erweiterung vorhandener (eventuell verwaister) Pakete auf Konflikte wegen Verwendung derselben Ordnerstruktur hin. Anwendern sollte bewusst werden, dass sie das ursprüngliche Paket vor der Installation Ihrer Version deaktivieren müssen.
4. Das MKP-Paketformat
Wollen Sie lediglich einen Blick in ein MKP werfen oder einzelne Dateien extrahieren, ohne das ganze Paket zu installieren, ist Kenntnis vom Paketformat hilfreich.
Der Blick in ein Paket ist recht simpel, weil das MKP-Format lediglich eine .tar.gz-Datei ist, die wiederum .tar-Dateien und Manifest-Dateien enthält.
Die Untersuchung der heruntergeladenen Datei hello_world-0.2.5.mkp gibt die erste Stufe der Struktur preis:
Mit einer Pipeline über zwei tar-Befehle können Sie nun einen Blick in den Inhalt der cmk_addons_plugins.tar werfen:
Und was ist mit den beiden Manifest-Dateien info und info.json?
Die Datei info und ihre im Python-Dictionary-Format enthaltenen Felder haben Sie weiter oben kennengelernt.
Das JSON-Äquivalent info.json enthält exakt die gleichen Felder und Werte, wurde aber im JSON-Format serialisiert.
5. Befehlsreferenz
Befehle für die Verwaltung und für Updates finden Sie im Artikel zur Verwaltung von MKPs.
5.1. Entwicklung
| Sub-Befehl | Parameter | Verwendungszweck |
|---|---|---|
|
Name des Pakets |
Löst ein aktives Paket auf. |
|
keine |
Listet alle zu keinem Paket gehörenden Dateien auf. |
|
Name des neu zu erstellenden Pakets |
Erstellt eine Manifest-Datei als Basis für ein neues Paket. |
|
Pfad zur Manifest-Datei |
Erstellt auf Basis des Inhalts einer Manifest-Datei ein MKP. |
