Add check via web-api oder cli

Hi,

Enterprise 1.6.0p12

ich möchte meine SSL-Zertifikate überwachen. Im Wato ist das kein Problem mit check_http. Jetzt aber suche ich eine Möglichkeit, per cli, resp. Puppet zu machen. Kann man so einen check per web-api konfigurieren? Ich habe mir die Ausgabe von get_rulesets_info angesehen, da scheinen mir die Konfigs für check_http nicht drin zu sein…
Könnte man alternativ eine Konfigdatei erzeugen und einbringen? Wie geht das? Gibt es da HowTos drüber?

Danke, Gruß
Jochen

Du musst erst get_rulesets_info machen und dann für jedes Item, das da zurück kommt und einen Zähler != 0 hat, nocht get_ruleset.
Ich kann Dir aber schon vorab verraten, dass für check_http das ruleset active_checks:http heißt. Mit dem kannst Du den HTTP-Check komplett konfigurieren.
Leg mal in der GUI eine Regel an und klicke dann dort auf den EXPORT Button. Dann siehst Du die Settings.

3 Likes

Hi Dirk,

danke für den Hinweis!

Mhmm… das mit dem Export klappt so weit, auch das abrufen aller bestehenden http rules. Aber das Bauen des requests für set_ruleset klappt nicht…

Gibt es da vlt irgendwo ein Beispiel oder eine API Datei, mit deren Hilfe man den Request bauen/debuggen kann?

-d “request={‘ruleset_name’:‘active_checks:http’, ‘ruleset’: {’’: [{‘conditions’: {‘host_name’: ['hostname]},‘options’: {‘description’: ‘SSL Cert’}, ‘value’: {‘host’: {‘virthost’: ‘host2check’}, ‘mode’: (‘cert’, {‘cert_days’: (20, 10)}), ‘name’: ‘SSL Cert host2check’}}”

Ergebnis:

{‘result’: u"Check_MK exception: Failed to parse JSON request: … : Expecting property name: line 1 column 2 (char 1)", ‘result_code’: 1

Ich bin mir bei den ganzen Klammern nicht sicher, aber ich glaube die [ vor condidtions wird nicht geschlossen. Kann das sein? Wenn ja, wäre das das Problem denke ich.

1 Like

@joker Ja, das mit curl an der Kommandozeile ist sehr mühsam. Ich benutze die Python-Library check-mk-web-api von Max Brenner, mit der geht es wesentlich einfacher.

Wenn Du aber bei curl bleiben willst (das ist für erste Gehversuche ja vollkommen okay), dann probiere folgendes:

Kopiere folgendes in eine Datei, z.B. http-rule.txt:

request={
    'ruleset_name': 'active_checks:http',
    'ruleset': {
        '': [
                {'condition': {'host_name': ['localhost']},
                 'options':   {'description': 'SSL Cert'},
                 'value':     {'host': {'virthost': 'host2check'},
                               'mode': ('cert', {'cert_days': (20, 10)}),
                               'name': 'SSL Cert host2check'}
                },
            ]
    }
}

Und dann lege ein Hilfsskript an, das einen POST-Request schickt:

#!/usr/bin/env bash

port=$(omd config show APACHE_TCP_PORT)
user="automation"
secret="$(cat $OMD_ROOT/var/check_mk/web/automation/automation.secret)"
url="http://localhost:$port/$OMD_SITE/check_mk/webapi.py"

curl \
    "${url}?action=set_ruleset&_username=${user}&_secret=${secret}&request_format=python" \
    -d @http-rule.txt

Achtung: Dieses Skript musst du als Site-Nutzer auf dem Checkmk-Server laufen lassen. Es umgeht den “normalen” Apache-Server (der auf Port 80 oder 443 lauscht) und spricht direkt mit der checkmk-eigenen Apache-Instanz auf 127.0.0.1 und dem site-spezifischen Port (5000+). Außerdem ermittelt es das “automation secret” direkt aus der Datei …/automation.secret. Ansonsten – wenn du von außen kommst – musst du die Werte selber setzen und in die URL einbauen.

Du kannst auch den Request (Datei http-rule.txt) innerhalb des Skriptes als here-document erstellen und die Datei einsparen.

Dann einfach das Skript aufrufen, in der GUI das Ergebnis angucken und dort dann “Activate” oder “Discard” drücken. Achtung: Das Skript überschreibt dir sämtliche active_checks:http-Regeln und ersetzt sie durch diese eine. Normalerweise liest du erst die Regeln für diesen Regelsatz aus, ergänzt dann die Liste […] um deine neue Regel und schickst dann den erweiterten Regelsatz zurück.

Und @marass hatte recht: In deinem Request waren die Klammern nicht balanciert und haben teilweise gefehlt. Zudem heißt das Attribut condition und nicht conditions.

2 Likes

Hey, danke für die Hinweise. Oha, wenn ich da den ganzen ruleset zurück geben muss, guck ich lieber auch gleich mal Richtung Python… hatte da eh schon dran gedacht… in dem Fall muss es das mit den ersten Schritten per Curl wohl gewesen sein :wink:

Danke nochmal, auch an @marass

Naja, wenn Du das in Python machst, musst du auch das ganze Ruleset zurückliefern. Aber versteh mich nicht falsch: Du musst nicht alle Regelsätze für alles zurückgeben. Also nicht alle ~1200 Regelsätze, die checkmk kennt (für CPU-Auslastung, Filesystem, usw.), sondern nur alle Regeln innerhalb des Regelsatzes active_checks:http.

Wenn Du z.B. bereits fünf aktive HTTP-Checks in der GUI definiert hast und willst jetzt einen sechsten hinzufügen, dann machst Du das mit folgendem Pseudocode:

current_rules = get_ruleset('active_checks:http')
current_rules.append( my_new_rule )
set_ruleset('active_checks:http', current_rules)

Das heißt: Du holst du dir mit get_ruleset diese fünf Regeln, fügst deine in der Liste hinzu und machst dann set_ruleset, um alle sechs Regeln innerhalb des Regelsatzes zu definieren. Du musst also nicht auch noch die CPU-Regeln (z.B.) wieder setzen. Die bleiben, wie sie sind.

1 Like

Das ist schon klar, trotzdem danke!
Aber schon wegen des current_rules.append lohnt sich m.E. der roundtrip nach Python :wink:

Bin grade schon dabei my_new_rule zu bauen…

1 Like

Ja genau. Das geht mit Python besser. Auch kannst Du da viel leichter prüfen, ob deine neue Regel evtl. schon in der Liste enthalten ist. Da reicht tatsächlich im ersten Schritt ein einfaches

if new_rule not in current_rules['ruleset']['']:
    current_rules['ruleset'][''].append(new_rule)

Wobei new_rule dann nur so aussieht:

{'condition': {'host_name': ['localhost']},
 'options':   {'description': 'SSL Cert'},
 'value':     {'host': {'virthost': 'host2check'},
               'mode': ('cert', {'cert_days': (20, 10)}),
               'name': 'SSL Cert host2check'}
}
2 Likes

@Dirk funktioniert das bei dir aktuell mit der Version 1.6?

Ich bekomme eine Fehlermeldung, die da wirklich gar nicht hingehört…

CheckMkWebApiException: Check_MK exception: Folder ruleset does not exist

Minimalcheck, der m.E. eigentlich auf jeden Fall laufen müsste… das gleiche Ruleset wieder setzen:

result = api.get_ruleset(‘active_checks:http’)
api.set_ruleset(‘active_checks:http’, result)

Auch da bekomme ich den Fehler, da kann es also eigentlich nicht sein, dass ich was falsch zusammen gebaut hätte…

@joker, sorry für die späte Antwort. Ja ich mache das mit der 1.6. Derzeit mit der p8, p11 und p12, je nachdem, wo ich gerade unterwegs bin.

Das Ergenbis von api.get_ruleset('active_checks:http') sieht so aus (wenn noch keine Regel existiert):

{
    'configuration_hash': '99914b932bd37a20b983c5e7c90ae93b', 
    'ruleset': {}
}

ruleset ist ein dictionary mit key=folder_name und value=list_of_rules, also sowas wie

{
    '':             [ rule1, rule2, rule3 ],
    'other_folder': [ rule4 ],
}

Ich hatte noch keine Regel definiert, deswegen ist ruleset bei mir erstmal ein leeres dictionary. Wenn ich da eine neue Regel im Main directory hinzufügen will, geht das so:

result = api.get_ruleset('active_checks:http')

new_rule = {
    'condition': {'host_name': ['localhost']},
    'options':   {'description': 'SSL Cert'},
    'value':     {'host': {'virthost': 'host2check'},
                  'mode': ('cert', {'cert_days': (20, 10)}),
                  'name': 'SSL Cert host2check'}
}

folder = '' # each rule lives in a folder; '' is the "Main directory"
if new_rule not in result['ruleset'].setdefault(folder, []):
    result['ruleset'][folder].append(new_rule)

api.set_ruleset('active_checks:http', 
	            result['ruleset'], 
	            result['configuration_hash'])

Der configuration_hash ist optional. Wenn Du ihn angibst, prüft checkmk, ob sich der Regelsatz zwischen dem get_ruleset und dem set_ruleset verändert hat (z.B. durch andere Skripte oder die GUI) und verweigert dann die Ausführung. Wenn Du ihn weglässt, findet keine solche Prüfung statt und set_ruleset überschreibt den vorhandenen Regelsatz.

Der einfachste Test ist also:

result = api.get_ruleset('active_checks:http')
api.set_ruleset('active_checks:http', result['ruleset'])

Gruß Dirk

2 Likes

Hi @Dirk,

kein Problem - schönen Feiertag.

Vielen Dank für die Erläuterung, jetzt klappt es!
Jetzt erschliesst sich auch, was der leere Key bedeuten soll…

Mein Fehler war also, dass ich das ganze result wiederverwendet habe und nicht nur result[‘ruleset’]

Noch mal vielen Dank!
Gruß Jochen

1 Like

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.