Serviceparameter dem Agent mitgeben

Hallo,

ich habe mit der Anleitung aus der Doku angefangen ein Plugin zuschreiben, welches als erst-entwickeltes Plugin prüfen soll, ob ein Pfad vorhanden ist.
In der Dokumentation habe ich jedoch nirgendwo rauslesen können, wie man den zu prüfenden Pfad an den Agent mitgeben kann.

Wenn ich das korrekt aus der Doku rauslese, sind die Serviceparameter um serverseitig mit den Ergebnissen des Agents die Logik für den Status zu bestimmen.
Bin ich gezwungen alle möglichen Pfade hart einzutragen oder kann ich das als Parameter einbauen und in den Agent einbacken?

agent_based:

#!/usr/bin/python

from .agent_based_api.v1 import *


def discover_exists(section):
    for path, shouldCrit, exists in section:
        yield Service(item=path)

def check_exists(item, params, section):
    shouldCrit = params["shouldCrit"]
    for path, exists in section:
        if path == item:
            exists = bool(exists)
            shouldCrit = bool(shouldCrit)
            if exists:
                s = State.OK
                summary = f"Found {path}"
            else:
                summary = f"Did not found {path}"
                if shouldCrit:
                    s = State.CRIT
                else:
                    s = State.WARN
            yield Result(
                state = s,
                summary = summary
            )
            return


# Check deklarieren
register.check_plugin(
    name='exists',
    service_name='Exist %s',
    discovery_function=discover_find,
    check_function=check_find,
    check_default_parameters={"shouldCrit": True},
    check_ruleset_name="exists",
)

Regelsatz:

#!/usr/bin/python

from cmk.gui.i18n import _

from cmk.giu.valuespec import (
    Dictionary,
    Integer,
    textAscii,
    DropdownChoice
)

from cmk.gui.plugins.wato import (
    CheckParameterRuleSpecWithItem,
    rulespec_registry,
    RulespecGroupCheckParametersOperatingSystem,
)

def _item_valuespec_exists():
    return TextAscii(title=_("absolute Path"))

def _parameter_valuespec_exists():
    return Dictionary(
        elements=[
            ("shouldCrit", DropDownChoice(
                title = _("Throw critical if not found otherwise throw warning"),
                help = _("default is Yes"),
                choices = [
                    (False, _("No")),
                    (True, _("Yes")),
                ],
                default_value= "yes"
            )),

        ]
    )


rulespec_registry.register(
    CheckParameterRulespecWithItem(
        check_group_name="exists",
        group=RulespecGroupParametersOperatingSystem,
        item_spec=_item_valuespec_exists,
        match_type="dict",
        parameter_valuespec=_parameter_valuespec_exists,
        title=lambda: _("Get if File or Folder exists")
    )
)

Der Check (erster ansatz) für den Agent

#!/usr/bin/python
# Import OS Modul
import os


# Sektionskopf
print('<<<exists>>>')

 

path = r'C:/Testpfad\egal/ob/Linux\oder\Windows/Datei/geht/auch.txt'
path = path.replace("\\", os.sep).replace("/", os.sep)


isExist = os.path.exists(path)
print([path,Exist])

Du wirst Deinem Agentenplugin eine Konfigurationsdatei spendieren müssen, der die Agentenkommunikation selber ist ja read-only.

Eine solche Datei liegt üblicherweise in /etc/check_mk und kann auch mit Hilfe der Bakery erstellt werden.

Das macht die Klasse PluginConfig in dem Beispiel hier: check_mk_extensions/sslcertificates.py at cmk2.1 · HeinleinSupport/check_mk_extensions · GitHub

1 Like

Mittlerweile ist mein Plugin ausgerollt und Funktioniert. :slight_smile:

Für den Ernstfall haben wir intern Diskutiert, wie man Parameter ausrollen kann, ohne auf das Backen angewiesen zu sein.
Das Thema ist aktuell noch nicht durch, jedoch haben wir als Ansatz einen automation User erstellt, welcher Agentseitig die Serviceparameter in einem bestimmten Intervall aus der Web-API ausliest und selber in eine Config-Datei schreibt.

So können wir Zukünftig, wenn es Konzeptioniert, Umgesetzt und getestet ist bei Sicherheitslücken wie zB. die Log4J oder commons-text.jar Sache ohne zu Backen die Parameter an die Agents mitgeben.

Wenn die Sache weiter Fortgeschritten ist und ich daran Denke, werde ich hier nochmal genauer Erklären wie wir das dann umgesetzt haben.

Mittlerweile haben wir das Plugin soweit Konzipiert.

Per bakery werden die Credentials automation users mitgegeben (permissions bis auf regeln per api lesen eingeschränkt), sowie das Intervall der API Abfragen.

Welchen Server bzw. welche Site der anfragen soll, wird aus der Config des agent updaters geholt.

In form von Regeln werden dann die Parameter die der Agent braucht angelegt. Hier sind es erstmal Pfade die es auf existenz zu prüfen gilt.

Agentseitig ist das dann nur ein Skript, welches erst die Datei mit den Parametern einliest und ggf. die API Abfragt und wenn explicit_host oder host_label zu dem host passt, wird der Parameter in eine Datei weggeschrieben.
In der Datei steht dann der letzte Zugriff auf die API (um das Intervall einzuhalten bzw. nicht minütlich die API zu belasten) und die Parameter drin.

Ab hier ist es wie ein ganz normales Plugin.
Daten holen → ausgeben → serverseitige Checklogik

This topic was automatically closed 365 days after the last reply. New replies are no longer allowed. Contact an admin if you think this should be re-opened.