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.
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 :
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.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 :
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 :
N'oubliez pas de rendre le plugin exécutable :
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.
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 :
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é :
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 :
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'
pathdé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_attributessont 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 :
Si tel est le cas, mettez à jour la configuration du noyau de supervision, puis redémarrez votre instance :
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 :
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 :
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 :
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 :
Créez maintenant le jeu de règles dans ce dossier :
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.
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 :
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 :
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 :
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 :
La fonction d'inventaire reçoit ensuite les tables de chaînes sous forme de variables selon le modèle section_sectionname :
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 :
