Problem mit "Hostname translation for piggybacked hosts" in Verbindung mit der Dynamischen Hostkonfiguration (DCD)

Hallo zusammen,

für die Benennung unserer Docker-Container möchte ich die Containernamen per o.a. Rule mittels “Multiple regular expressions” ändern lassen. Leider klappt das nicht so recht und ich finde den Fehler nicht.

Das Docker-Plugin liefert per Piggyback bei uns Hostnamen nach folgendem Muster:

Text-Text-Text_Text-Text-Text.Ziffer.irgendwas[.manchmal_nochwas]

also z.B.

q-app-stage_maier-db-backup.1.b5edf1wr165a6kt3udkq381iq

Ich würde gern den Teil den Namens bis zum ersten Punkt nehmen und für den Hostnamen einen Prefix dcontainer_ davorsetzen, im Beispiel sollte also

dcontainer_q-app-stage_maier-db-backup

herauskommen.

In der Rule habe ich als Regular Expression: ([a-z-_]*).
(Der Ausdruck wird hier irgendwie nicht nicht richtig dargestellt (Backslash vor dem Punkt fehlt), auf dem Screenshot ist zu sehen, was ich konfiguriert habe)

und als Replacement: dcontainer_\1

Leider ändert sich auch nach einem cmk -IIv des Docker-Nodes nichts an den Hostnamen. Matcht vielleicht mein Regex nicht?

1 Like

Ja, das muss hier im Forum als “Preformatted text” formatiert werden: ([a-z-_]*)\.

Sieht so aus.
Erstmal hat das Minus im Range eine Sonderfunktion und muss escapet werden. (und/oder am Anfang oder Ende oder Ende des Bereichs stehen? kommt evtl auch auf den regexp flavor an? bin mir grad nicht ganz sicher, daher lieber beides :wink: )
Dann würde ich auch den Ausdruck an Anfang und Ende festtackern.
Und nicht mit * sondern mit +matchen, damit mindestens ein Zeichen vorkommen muss.

Also sowas wie (ungetestet):
(^[a-z_\-]+)\..*$

1 Like

Erstmal vielen Dank für Deine schnelle Antwort!

Wieder etwas gelernt :slight_smile:

Damit klappt es leider auch nicht, es erscheint immernoch die volle Name. Irgendwie kommt er mit diesem Ausdruck auch durcheinander, er kann außer den beiden Check_MK-Checks nun nichts weiter im Container discovern :frowning:

Verstehe ich da bei der Rule vielleicht irgendetwas grundsätzliches falsch?

Du brauchst für jedes System, zu dem Daten per piggyback reinkommen, auch schon einen Host in Checkmk, der eben denselben Namen hat wie geliefert oder ggf durch die Regel übersetzt.

In deinem Beispiel musst du also einen Host “dcontainer_q-app-stage_maier-db-backup” anlegen.

Die Hosts lasse ich per “Dynamic configuration” anlegen, da wird der Docker-Host dauernd discovert und legt die Container automatisch als Host an.

https://checkmk.de/cms_dcd.html#Verwalten%20von%20Hosts%20mit%20dem%20DCD

Den DCD nutze ich selbst bisher nicht. Aber soweit ich das verstehe, müsstest du dann Unterverzeichnisse unter tmp/check_mk/piggyback haben, die jeweils den (ggf. laut Regel übersetzen) Hostnamen tragen. - Ist das der Fall?
Und der DCD müsste (wenn entsprechend konfiguriert) daraus auch Hosts mit genau demselben Namen anlegen. - klappt auch das noch?

Auf die Idee, mal in tmp/check_mk/piggyback nachzusehen kam ich auch gerade. Dort habe ich erst mal die Altlasten meiner alten Versuche gelöscht. Mit Deinem Ausdruck oben werden dann die Verzeichnisse mit genau dem Namen angelegt, den ich haben will :slightly_smiling_face:

Also habe ich frohen Mutes die Container in Wato gelöscht und vom DCD neu discovern lassen. Seltsamerweise werden nun dort wieder die alten Namen als Hostname genommen. In tmp/check_mk/piggyback stehen aber noch immer die schon umgewandelten drin.

So langsam reift in mir die Vermutung, dass DCD nicht zusammen mit der Hostname Translation funktioniert. Ich habe mal einen der discoverten Hosts händisch umbenannt, sodass er den Namen nach der Hostname-Translation trägt. Das funktioniert soweit. Sofort danach wurde der gleiche Host aber mit dem alten Namen wieder discovert und hinzugefügt. Natürlich bekommt der dann wieder keine Infos, weil es ihn ja unter tmp/check_mk/piggyback nicht gibt.

Richtig. Oder man sucht nach allem was kein Punkt ist, gefolgt von einem Punkt :slightly_smiling_face:

(^[^.]+)\.

Auch nicht schlecht. Für die Rule muss aber anscheinend alles matchen. Dies hier funktioniert dort:

(^[^.]+)\..*