Daten/Geräte zur HW/SW-Inventur hinzufügen (SNMP)

Hallo zusammen!

Bei vielen unserer Geräte kann CheckMK über die HW/SW-Inventur die Firmware- oder Betriebssystemversion auslesen.
Für andere Geräte klappt das bisher nicht. Die Versionen sind zwar über SNMP vom Gerät abrufbar, aber CheckMK hat das wohl bisher nicht integriert.
Spontan fallen mir vor allem unsere Geräte von MikroTik (Netzwerk-Switche) und CyberPower (USV) ein. Hier wäre es sehr praktisch, wenn wir einen schnellen Überblick über die installierte Firmware bekommen könnten.

Ich habe mich schon in den Docs umgeschaut, aber neben dem Programmieren von simplen Checks für SNMP nicht herausgefunden, wie ich mit einem eigenen Check-Plugin Daten zur Inventarisierung hinzufügen kann.
Gibt es hierzu eine kleine Anleitung oder Doku?
Ein agentbasiertes Plugin habe ich schon mal gebastelt, auch für SNMP-Geräte.

Oder können solche bisher nicht unterstützten Geräte “auf Wunsch der Community” hinzugefügt werden?

Vielen Dank!

My German is not what it used to be, so possibly I get the question wrong.
But, when you know the OIDs of the info of the devices you want to monitor, you can use the integrate nagios method described in chapter 2.3 of this docs article:

The question is about the HW/SW inventory, not a service check.

Oops, remind me not to apply for a German IT job. (-;

2 Likes

Nicht das ich wüsste auf die Schnelle.
Aber hier das Plugin ist “relativ” einfach und implementiert eine HW/SW Inventory Funktion.

Den Hostlabel Teil kannst auch ignorieren wenn es erstmal nur um Inventardaten geht.
Wichtig ist im eigenen Plugin der Part mit dem Pfad wo die Daten abgelegt werden sollen.
Wenn deine Daten in eigene Strukturen kommen solltest auch einen View dazu definieren.

Das ist aber auch schon alles was gebraucht wird für ein Inventar Plugin.
Du siehst auch, dass dies sehr ähnlich einem normalen SNMP Check Plugin ist.

Vielen Dank für die Links!
Ich habe mich ein bisschen durch die Plugins gewühlt und mir anschließend einiges aus den CheckPoint Plugins rausgeholt.

Nach ein bisschen Gebastel bin ich jetzt hier gelandet, am Beispiel MikroTik RouterOS:

Plugin
#!/usr/bin/env python3

from cmk.base.plugins.agent_based.agent_based_api.v1 import (
    SNMPTree,
    register,
    startswith,
    Attributes,
)
from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
    InventoryResult,
)

def parse_mikrotik_routeros_version(string_table):
    section = string_table[0][0]
    return section

def inventory_mikrotik_routeros_version(section) -> InventoryResult:
    attributes = []
    attributes.append((['software', 'os'], 'version', section))
    attributes.append((['software', 'os'], 'type', 'MikroTik RouterOS'))

    for invPath, key, value in attributes:
        yield Attributes(
            path=invPath,
            inventory_attributes={key: value})

register.snmp_section(
    name='inv_mikrotik_routeros_version',
    parse_function=parse_mikrotik_routeros_version,
    detect = startswith(
        ".1.3.6.1.2.1.1.1.0", 
        "RouterOS",
    ),
    fetch = SNMPTree(
        base='.1.3.6.1.4.1.14988.1.1.7', 
        oids=['4.0'],
    ),
)

register.inventory_plugin(
    name='inv_mikrotik_routeros_version',
    inventory_function=inventory_mikrotik_routeros_version,
)

Wenn die Version ohne weiteren Text in einer OID abgerufen werden kann, funktioniert das so weit ganz gut. Sauber geschrieben ist das sicherlich nicht ganz :smile:

Vielen Dank für eure Hilfe!