Checkmk
to checkmk.com
Important

This is a machine translation based on the English version of the article. It might or might not have already been subject to text preparation. If you find errors, please file a GitHub issue that states the paragraph that has to be improved.

1. Introduction

L'inventaire matériel/logiciel vous aide à suivre le matériel existant et à garder à tout moment le contrôle sur les logiciels installés. Checkmk fournit des plugins prêts à l'emploi pour de nombreux scénarios d'utilisation de base. Cependant, dans de nombreux cas, vous souhaiterez obtenir des informations plus détaillées sur du matériel et des logiciels spécifiques. C'est là que les plugins d'inventaire matériel/logiciel personnalisés entrent en jeu.

Dans le cadre de cet article, nous partons du principe que vous disposez déjà de connaissances de base en matière de programmation de plugins de supervision basés sur des agents. Pour les aspects où l'utilisation de l'API d'inventaire ne diffère pas significativement de celle de l'API de vérification, les explications fournies dans cet article sont donc relativement succinctes. Toutefois, si nécessaire, nous soulignerons d'autant plus clairement les différences significatives.

Tip

Notez la différence entre les plugins de supervision et les plugins d'inventaire. Les plugins de supervision conviennent principalement aux données qui changent rapidement, tandis que les plugins d'inventaire conviennent aux données qui changent rarement. Dans cet article, nous utiliserons un exemple simple impliquant des périphériques USB pour illustrer ce point. Par exemple, si vous souhaitez vous assurer que personne ne réalise de connexions avec des périphériques USB ne figurant pas sur une liste blanche à un ordinateur du système de supervision, un plugin de supervision sera plus approprié.

1.1. Documentation de l'API Check

L'API Inventory fait partie de l'API Check. Pour accéder à la documentation, suivez les mêmes étapes que pour les plugins de supervision basés sur des agents.

Vous pouvez accéder à la documentation fournie avec votre instance Checkmk. Pour ce faire, rendez-vous sur Help > Developer resources > Plug-in API references dans l'interface graphique de Checkmk. Dans la nouvelle fenêtre de navigateur, sélectionnez « Agent based ("Check API") > Version 2 » dans la barre de navigation de gauche. Même si vous ne disposez pas actuellement d'une instance Checkmk en cours d'exécution, vous pouvez consulter une copie de la documentation de l'API des plugins à l'adresse docs.checkmk.com/plugin-api.

2. Préparation

Par défaut, Checkmk met à jour les données d'inventaire une seule fois par jour. Cela va bien sûr à l'encontre de la nécessité de disposer rapidement des résultats lorsque vous testez votre propre programmation. Nous vous recommandons donc deux mesures préparatoires pour augmenter la vitesse sans alourdir significativement la charge du système :

  1. N'utilisez pas le plugin « mk_inventory », qui génère une charge importante sur l'ordinateur hôte fournissant les données pour le nouveau plugin à créer.

  2. Définissez l'intervalle d'exécution de la check active pour cet ordinateur hôte sur une ou quelques minutes.

3. Le plugin d'agent

Si vous souhaitez ajouter une fonctionnalité d'inventaire à un plugin de supervision basé sur un agent, vous pouvez éventuellement utiliser une section d'agent écrite pour votre plugin de supervision. Pour notre exemple, créez la vôtre. La base pour cela est l'instruction « lsusb ». Lorsqu'elle est appelée sans paramètres, elle affiche une liste de tous les périphériques USB connectés. Cela pourrait ressembler à ceci :

OMD[mysite]:~$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 002 Device 002: ID 0bda:0409 Realtek Semiconductor Corp. USB3.2 Hub
Bus 002 Device 003: ID 0bda:0409 Realtek Semiconductor Corp. USB3.2 Hub
Bus 002 Device 004: ID 0bda:8153 Realtek Semiconductor Corp. RTL8153 Gigabit Ethernet Adapter
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 002: ID 0c45:6a09 Microdia Integrated_Webcam_HD
Copier les instructions dans le presse-papiers
Instruction(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

La version abrégée utilisée ici dans ses premiers champs indique à quel bus et à quel port un périphérique est connecté. Viennent ensuite, séparés par deux points, d'abord l'identifiant du fabricant, puis l'identifiant du périphérique. Le reste de la ligne contient un texte descriptif.

3.1. Le script obtenu

Étant donné que Checkmk handle bien les sorties ligne par ligne, trois lignes suffisent pour le plugin de supervision requis :

/usr/lib/check_mk_agent/plugins/lsusb
#!/bin/bash
echo '<<<lsusb_demo>>>'
lsusb
Copier le contenu du fichier dans le presse-papiers
Contenu du fichier copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

N'oubliez pas de rendre le plugin exécutable :

root@linux# chmod 0755 /usr/lib/check_mk_agent/plugins/lsusb
Copier les instructions dans le presse-papiers
Instruction(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Si l'ordinateur hôte sur lequel vous testez le plugin d'agent est une machine virtuelle, ou si vous ne souhaitez pas avoir à déconnecter et reconnecter continuellement des périphériques, enregistrez simplement l'exemple suivant dans un fichier situé dans le répertoire spool. Les fichiers spool sont inclus dans la sortie de l'agent et sont transférés avec celle-ci, veillez donc à ce que le fichier se termine par un saut de ligne.

/var/lib/check_mk_agent/spool/lsusb.txt
<<<lsusb_demo>>>
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 002 Device 002: ID 0bda:0409 Realtek Semiconductor Corp. USB3.2 Hub
Bus 002 Device 003: ID 0bda:0409 Realtek Semiconductor Corp. USB3.2 Hub
Bus 002 Device 004: ID 0bda:8153 Realtek Semiconductor Corp. RTL8153 Gigabit Ethernet Adapter
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 002: ID 0c45:6a09 Microdia Integrated_Webcam_HD
Bus 003 Device 004: ID 8087:0032 Intel Corp. AX210 Bluetooth
Bus 003 Device 005: ID 0bda:5409 Realtek Semiconductor Corp. USB2.1 Hub
Bus 003 Device 006: ID 0bda:5409 Realtek Semiconductor Corp. USB2.1 Hub
Bus 003 Device 007: ID 0bda:1100 Realtek Semiconductor Corp. HID Device
Bus 003 Device 071: ID 046d:c093 Logitech, Inc. M500s Optical Mouse
Bus 003 Device 096: ID 1a40:0101 Terminus Technology Inc. Hub
Bus 003 Device 108: ID 6964:0075 MT ID75 Rev
Bus 003 Device 109: ID 0c45:636b Microdia USB 2.0 Camera
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Copier le contenu du fichier dans le presse-papiers
Contenu du fichier copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Vous pouvez ensuite simuler la connexion et le retrait de périphériques USB en ajoutant ou en supprimant des lignes dans le fichier texte.

3.2. Test de l'agent

Testez la sortie de l'agent localement à l'aide de l'instruction suivante :

root@linux# cmk-agent-ctl dump | grep -A25 '^<<<lsusb'
Copier les instructions dans le presse-papiers
Instruction(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

En fonction du nombre de périphériques USB en connexion (ou du nombre de lignes dans le fichier spool), vous devriez maintenant voir la sortie de `lsusb` et quelques lignes de la section suivante de l'agent. Assurez-vous que le saut de ligne à la fin de la section de l'agent est correct.

4. Le plugin d'inventaire

Les plugins d'inventaire se trouvent dans la structure de répertoires standard, aux côtés des plugins de supervision habituels. Vous pouvez soit stocker les plugins d'inventaire dans des fichiers distincts, auquel cas nous vous recommandons d'utiliser le préfixe inventory_. Vous pouvez également intégrer les plugins d'inventaire dans les mêmes fichiers que les plugins de supervision, auquel cas vous devez omettre complètement le préfixe. Le choix de la méthode dépendra de la clarté et de la nécessité de partager des fonctions.

Pour créer un plugin d'inventaire pur, vous devez donc créer un répertoire approprié :

OMD[mysite]:~$ mkdir -p ~/local/lib/python3/cmk_addons/plugins/lsusb_demo/agent_based
OMD[mysite]:~$ cd ~/local/lib/python3/cmk_addons/plugins/lsusb_demo/agent_based
Copier les instructions dans le presse-papiers
Instruction(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

4.1. Un plugin de base

Vous pouvez désormais créer un plugin d'inventaire de base, que vous pouvez modifier à l'aide de n'importe quel éditeur de texte :

~/local/lib/python3/cmk_addons/plugins/lsusb_demo/agent_based/inventory_lsusb_demo.py
#!/usr/bin/env python3

from cmk.agent_based.v2 import InventoryPlugin, Attributes

def inventory_lsusb_demo(section):
    yield Attributes(
        path = [ "hardware", "usb", "general" ],
        inventory_attributes = { "Max standard": "3.2" },
    )

inventory_plugin_lsusb_demo = InventoryPlugin(
    name = "lsusb_demo",
    inventory_function = inventory_lsusb_demo,
)
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

La structure est similaire à celle des plugins de supervision. Le plugin d'inventaire importe également depuis l'espace de nommage cmk.agent_based.v2. Un objet CheckPlugin instancié est lié à une fonction de supervision spécifique qui renvoie un ou plusieurs objets Result via yield. De même, un objet InventoryPlugin instancié est lié à une fonction d'inventaire spécifique qui renvoie un objet Attributes via yield.

L'Attributes renvoyé par yield implémente la feuille minimale significative d'un arbre d'inventaire :

  • L'path décrit le nœud pertinent dans la hiérarchie de l'arborescence, ici Hardware > Usb > General.

  • Les paires clé-valeur de l'objet d'inventory_attributes sont représentées sous la forme d'un tableau clé-valeur.

Commencez par vérifier que le plugin est syntaxiquement correct et qu'il peut être lancé pendant l'inventaire :

OMD[mysite]:~$ cmk-validate-plugins
Agent based plugins loading succeeded, Active checks loading succeeded, Special agents
loading succeeded, Rule specs loading succeeded, Rule specs forms creation succeeded,
Referenced rule specs validation succeeded, Loaded rule specs usage succeeded
OMD[mysite]:~$ cmk -vv --inventory myhost | grep lsusb_demo
<<<lsusb_demo>>> / Transition HostSectionParser -> HostSectionParser
  HostKey(hostname='myhost', source_type=<SourceType.HOST: 1>)  -> Add sections: ['check_mk', 'local', 'lsusb_demo', ...]
 lsusb_demo: ok
 lsusb_demo: skipped (no data)
Copier les instructions dans le presse-papiers
Instruction(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Si tel est le cas, mettez à jour la configuration du noyau de supervision, puis redémarrez votre instance :

OMD[mysite]:~$ cmk -U
Generating configuration for core (type cmc)...
Starting full compilation for all hosts
 Creating global helper config...OK
 Creating cmc protobuf configuration...OK
OMD[mysite]:~$ omd restart
Stopping crontab...OK
Stopping dcd...killing 153645....OK
Stopping apache...killing 153387.................OK
Stopping cmc...killing 153300.....OK
Stopping ui-job-scheduler...killing 153285...OK
...
Copier les instructions dans le presse-papiers
Instruction(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Un coup d'œil à l'inventaire de l'ordinateur hôte de test montre désormais — dès que la prochaine vérification régulière a été effectuée — une nouvelle feuille dans l'arborescence de l'inventaire.

4.2. Écriture de la fonction d'analyse

Les sections d’agent sans séparateur spécifié sont converties en une liste bidimensionnelle de tokens à l’aide du séparateur par défaut (espace) avant d’être transmises à la fonction d’inventaire : Une liste de tokens est créée pour chaque ligne. Chacune de ces listes est à son tour un élément d’une liste de lignes. Si un séparateur est spécifié, il définit la limite entre les tokens. Cela facilite le traitement des données au format CSV, par exemple.

Une fonction d'analyse telle que celle destinée aux plugins de supervision basés sur des agents n'est pas absolument nécessaire. Cependant, l'utilisation d'une fonction d'analyse distincte peut présenter certains avantages. Par exemple, elle améliore la clarté et l'extensibilité. Et si un plugin de supervision existant doit être réutilisé, la question ne se pose même pas : il suffit de continuer à utiliser la fonction d'analyse existante.

Dans notre exemple, l'emplacement de connexion d'un périphérique USB n'a pas d'importance. Pour le plugin, il faut déterminer les identifiants du fabricant et du périphérique (sixième élément de la liste) ainsi que la description (du septième élément jusqu'à la fin de la liste).

Alors que la version USB maximale prise en charge était simplement codée en dur dans l'exemple simple ci-dessus, n'hésitez pas à réfléchir à la manière dont vous pourriez déterminer cela à moyen terme à l'aide d'expressions régulières à partir de la description. Pour ce faire, la description complète est requise, c'est-à-dire tout ce qui se trouve du septième au dernier mot de la liste :

~/local/lib/python3/cmk_addons/plugins/lsusb_demo/agent_based/inventory_lsusb_demo.py
def parse_lsusb_demo(string_table):
    parsed = { "devices": [] }
    for line in string_table:
        vendor = line[5].split(":")[0]
        device = line[5].split(":")[1]
        description = ""
        for i in range(6, len(line)):
            description = description + " " + line[i]
        parsed["devices"].append({ "vendor": vendor, "device": device, "description": description })
    return parsed
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

4.3. Écriture de la fonction d'inventaire

Vous pouvez ici prendre un raccourci : contrairement aux plugins de supervision basés sur un agent, la fonction d'analyse n'est pas intégrée par la création d'un objet `AgentSection`, mais doit être appelée depuis la fonction d'inventaire elle-même. Vous connaissez le principe de l'yielde pour le transfert continu d'éléments depuis les plugins de supervision basés sur un agent :

~/local/lib/python3/cmk_addons/plugins/lsusb_demo/agent_based/inventory_lsusb_demo.py
def inventory_lsusb_demo(section):
    section = parse_lsusb_demo(section)
    yield Attributes(
        path = [ "hardware", "usb", "general" ],
        # FIXME: dynamically calculate from agent section
        inventory_attributes = { "Max standard": "3.2" },
    )
    for d in section["devices"]:
        yield TableRow(
            path = [ "hardware", "usb", "devices" ],
            key_columns = {
                "vendor": d["vendor"],
                "device": d["device"]
            },
            inventory_columns = {
                "description": d["description"]
            }
        )
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Ici, un objet de type TableRow est renvoyé pour chaque ligne de la sortie de lsusb. Celui-ci contient trois colonnes : le fournisseur et l'ID de l'appareil servent ensemble de clés. La troisième colonne, qui est purement informative, contient la description.

Les colonnes clés ont la particularité d'être utilisées pour détecter les modifications, ce qui peut entraîner un changement de statut du service HW/SW Inventory dans la supervision. De plus, les clés doivent être uniques. Les lignes supplémentaires présentant la même combinaison d'identifiants de fournisseur et d'appareil sont donc ignorées.

Outre les colonnes de clé et d’inventaire, vous pouvez également décrire les entrées du tableau à l’aide d’status_columns et d’status_attributess analogues, qui représentent l’état d’un objet. Les types de données simples (int, float, str, bool ou None) sont disponibles pour la valeur de l’état. Par exemple, si vous souhaitez créer un tableau répertoriant les connexions (Bus/Device) occupées, vous pouvez utiliser key_columns (Bus et Device) et status_columns (ici : bool).

4.4. Le plugin terminé

Le plugin final rassemble tous les éléments. La classe TableRow est également importée ici :

~/local/lib/python3/cmk_addons/plugins/lsusb_demo/agent_based/inventory_lsusb_demo.py
#!/usr/bin/env python3

from cmk.agent_based.v2 import InventoryPlugin, Attributes, TableRow

def parse_lsusb_demo(string_table):
    parsed = { "devices": [] }
    for line in string_table:
        vendor = line[5].split(":")[0]
        device = line[5].split(":")[1]
        description = ""
        for i in range(6, len(line)):
            description = description + " " + line[i]
        parsed["devices"].append({ "vendor": vendor, "device": device, "description": description })
    return parsed

def inventory_lsusb_demo(section):
    section = parse_lsusb_demo(section)
    yield Attributes(
        path = [ "hardware", "usb", "general" ],
        inventory_attributes = { "Plugin version": "0.1.0" },
    )
    for d in section["devices"]:
        yield TableRow(
            path = [ "hardware", "usb", "devices" ],
            key_columns = {
                "vendor": d["vendor"],
                "device": d["device"],
            },
            inventory_columns = {
                "description": d["description"],
            }
        )

inventory_plugin_lsusb_demo = InventoryPlugin(
    name = "lsusb_demo",
    inventory_function = inventory_lsusb_demo,
)
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

5. Jeux de règles pour l'inventaire

L'API Inventaire faisant partie de l'API Check, la création et l'application des jeux de règles s'effectuent exactement de la même manière que pour le développement de plugins de supervision classiques. C'est pourquoi nous ne présenterons ici qu'un exemple simple.

5.1. Définition d'un jeu de règles

La sortie de l'lsusbe comprend plusieurs lignes pour les hubs (hubs externes et hubs racines). Ces appareils, qui ne possèdent aucune fonctionnalité propre, rendent difficile l'aperçu.

Les utilisateurs doivent donc pouvoir décider eux-mêmes si les concentrateurs doivent être inclus ou non. Ils doivent pouvoir configurer ce paramètre à l'aide d'une case à cocher dans une règle.

Pour ce faire, créez le dossier « rulesets » pour la famille de plugins :

OMD[mysite]:~$ mkdir -p ~/local/lib/python3/cmk_addons/plugins/lsusb_demo/rulesets
OMD[mysite]:~$ cd ~/local/lib/python3/cmk_addons/plugins/lsusb_demo/rulesets
Copier les instructions dans le presse-papiers
Instruction(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Créez maintenant le jeu de règles dans ce dossier :

~/local/lib/python3/cmk_addons/plugins/lsusb_demo/rulesets/ruleset_lsusb_demo_inventory.py
#!/usr/bin/env python3

from cmk.rulesets.v1 import Label, Title, Help
from cmk.rulesets.v1.form_specs import (
    BooleanChoice,
    DefaultValue,
    DictElement,
    Dictionary,
)
from cmk.rulesets.v1.rule_specs import (
    InventoryParameters,
    Topic
)
from cmk.rulesets.v1 import Label

def _parameter_form():
    return Dictionary(
        elements = {
            "hubs": DictElement(
                parameter_form = BooleanChoice(
                    title = Title("USB hubs"),
                    label = Label("Consider USB hubs in the inventory table"),
                    prefill = DefaultValue(True),
                ),
                required = True,
            ),
        }
    )

rule_spec_lsusb_demo_inventory = InventoryParameters(
    name = "lsusb_demo",
    title = Title("Lsusb inventory demo"),
    topic = Topic.GENERAL,
    parameter_form = _parameter_form,
)
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Une fois que vous avez enregistré le script du jeu de règles, validez-le à l'aide de cmk-validate-plugins, puis redémarrez l'instance avec omd restart. À ce stade, vous pouvez ignorer les messages d'erreur provenant de cmk-validate-plugins concernant les jeux de règles existants mais non liés. La liaison s'effectue dans la section suivante.

Vous pouvez désormais consulter et personnaliser la règle dans l'interface graphique à l'adresse Setup > Hosts > HW/SW inventory rules. Si vous connaissez le nom d'une règle (ici : Lsusb inventory demo), vous pouvez le saisir directement dans le champ de recherche. À l'aide de Add rule, vous pouvez créer la règle que vous venez de préparer et l'appliquer comme d'habitude aux dossiers ou aux ordinateurs hôtes présentant les propriétés que vous avez sélectionnées.

5.2. Application du jeu de règles

Le jeu de règles n'a pas encore été lié. Pour l'appliquer, ajoutez deux autres named arguments lors de la création de la classe InventoryPlugin.

~/local/lib/python3/cmk_addons/plugins/lsusb_demo/agent_based/inventory_lsusb_demo.py
# ...

inventory_plugin_lsusb_demo = InventoryPlugin(
    name = "lsusb_demo",
    inventory_function = inventory_lsusb_demo,
    inventory_default_parameters = { "hubs": True },
    inventory_ruleset_name = "lsusb_demo",
)
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

De plus, le dictionnaire de paramètres doit être transmis à la fonction inventory en tant que premier argument. Ici, vous ajoutez également une expression régulière pour identifier les descriptions de périphériques se terminant par « hub ». Notez que vous devez ajouter une autre ligne import au début du script pour cela :

~/local/lib/python3/cmk_addons/plugins/lsusb_demo/agent_based/inventory_lsusb_demo.py
# ...

import re

# ...

def inventory_lsusb_demo(params, section):
    section = parse_lsusb_demo(section)
    yield Attributes(
        path = [ "hardware", "usb", "general" ],
        inventory_attributes = { "Plugin version": "0.1.0" },
    )
    h = re.compile('.*?hub$', re.IGNORECASE)
    for d in section["devices"]:
        if params['hubs'] or not h.match(d["description"]):
            yield TableRow(
                path = [ "hardware", "usb", "devices" ],
                key_columns = {
                    "vendor": d["vendor"],
                    "device": d["device"],
                },
                inventory_columns = {
                    "description": d["description"],
                }
            )
# ...
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

6. Options d'extension

6.1. Abonnement à plusieurs sections

Dans l'exemple, vous avez suivi la procédure standard jusqu'à présent : Un plugin d'inventaire s'abonne à une section d'agent qui porte le même nom que le plugin d'inventaire. Mais que faire si vous souhaitez utiliser des sections d'agent existantes qui sont déjà évaluées par un plugin d'inventaire existant ? Dans ce cas, il y a de fortes chances qu'un plugin d'inventaire utilisant le même nom que la section d'agent existe déjà. La sortie suivante fournit un aperçu des sections existantes :

OMD[mysite]:~$ cmk -vv --inventory myhost
Doing HW/SW Inventory on: myhost
myhost:
+ INVENTORIZING
+ FETCHING DATA
  Source: SourceInfo(hostname='myhost', ipaddress='127.0.0.1', ident='agent' ...)
...
+ EXECUTING INVENTORY PLUGINS
 mssql_instance: skipped (no data)
 mssql_instance: skipped (no data)
 azure_app_gateway: skipped (no data)
 azure_app_gateway: skipped (no data)
 redfish_firmware: skipped (no data)
 redfish_firmware: skipped (no data)
 redfish_firmware_hpe_ilo4: skipped (no data)
 redfish_firmware_hpe_ilo4: skipped (no data)
 robotmk: skipped (no data)
 robotmk: skipped (no data)
Copier les instructions dans le presse-papiers
Instruction(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Dans ce cas, et dans les cas où un plugin d'inventaire doit évaluer plusieurs sections d'agent, vous pouvez spécifier les sections souscrites sous forme de liste. Par exemple, supposons que vous souhaitiez évaluer deux sections d'agent faisant référence à des éléments fictifs :

/var/lib/check_mk_agent/spool/fictional.txt
<<<zorg>>>
ZF1 23.0
<<<yoyodyne>>>
Gnomovision 42.1
Copier le contenu du fichier dans le presse-papiers
Contenu du fichier copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Dans ce cas, les sections d'agent souscrites doivent être explicitement spécifiées. Le nom du plugin d'agent ne doit plus correspondre aux sections d'agent :

~/local/lib/python3/cmk_addons/plugins/fictional/agent_based/fictional.py
inventory_plugin_lsusb_demo = InventoryPlugin(
    name = "fictional",
    sections = [ "yoyodyne", "zorg" ],
    inventory_function = inventory_fictional,
)
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

La fonction d'inventaire reçoit ensuite les tables de chaînes sous forme de variables selon le modèle section_sectionname :

~/local/lib/python3/cmk_addons/plugins/fictional/agent_based/fictional.py
def inventory_fictional(section_yoyodyne, section_zorg):
    # Do something with the two two-dimensional arrays...
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Le plugin complet, qui inclut les versions de Yoyodyne Gnomovision et Zorg ZF1 dans l'arborescence de l'inventaire, peut alors se présenter comme suit :

~/local/lib/python3/cmk_addons/plugins/fictional/agent_based/fictional.py
#!/usr/bin/env python3

from cmk.agent_based.v2 import InventoryPlugin, Attributes

def inventory_fictional(section_yoyodyne, section_zorg):
    yoyo = section_yoyodyne
    zorg = section_zorg
    yield Attributes(
        path = [ "software", "fictional", "example" ],
        inventory_attributes = { "Yoyodyne " + yoyo[0][0]: yoyo[0][1] },
    )
    yield Attributes(
        path = [ "hardware", "fictional", "example" ],
        inventory_attributes = { "Zorg " + zorg[0][0]: zorg[0][1] },
    )

inventory_plugin_lsusb_demo = InventoryPlugin(
    name = "fictional",
    sections = [ "yoyodyne", "zorg" ],
    inventory_function = inventory_fictional,
)
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Last modified: Thu, 05 Mar 2026 09:26:19 GMT via commit cb50dcaeb
Sur cette page