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

Checkmk accède généralement aux ordinateurs hôtes surveillés en mode Pull via une connexion TCP au port 6556. À partir de la version 2.1.0, dans la plupart des cas, l’Agent Controller écoute sur ce port, ce qui permet de transférer les données de l’agent via une connexion chiffrée TLS. La version 2.2.0 de Checkmk a introduit une option alternative permettant de choisir le sens de transmission avec le mode Push.

Il existe toutefois des environnements — par exemple, des conteneurs allégés, des systèmes hérités ou embarqués — dans lesquels l’Agent Controller ne peut pas être utilisé. Dans de tels cas, le mode legacy est appliqué : (x)inetd exécute le script de l'agent après avoir établi une connexion, la sortie de l'agent est transférée en texte clair et la connexion est fermée immédiatement après.

Dans de nombreuses situations, les directives de sécurité peuvent exiger que des actions telles que la transmission de données en texte brut soient évitées. Par exemple, les niveaux de remplissage des systèmes de fichiers peuvent être de peu d’utilité pour un attaquant, mais les tables de processus ou les listes de mises à jour manquantes pourraient l’aider à cibler une attaque. De plus, il convient d’éviter d’ouvrir des ports supplémentaires et de privilégier l’utilisation des canaux de communication existants.

Les programmes source de données constituent la méthode universelle pour connecter de telles procédures de transfert à Checkmk. Le principe est très simple : on transmet une instruction sous forme de texte à Checkmk. Au lieu de réaliser une connexion au port 6556, Checkmk exécute cette instruction. Cela génère les données de l'agent sur la sortie standard, qui sont ensuite traitées par Checkmk exactement de la même manière que si elles provenaient d'un agent « normal ». Étant donné que les modifications apportées aux sources de données n'affectent généralement que les transports, il est important de laisser l'ordinateur hôte sur « API integrations if configured, else Checkmk agent » dans l'interface graphique de configuration.

La modularité de Checkmk vous aide à répondre à ces exigences en transmettant la sortie en texte brut de l’agent via n’importe quel moyen de transport. En fin de compte, la sortie en texte brut du script de l’agent peut être transmise par n’importe quel moyen — direct ou indirect, en mode pull ou push. Voici quelques exemples illustrant comment transmettre les données de l’agent au serveur Checkmk :

  • par courrier électronique

  • via un accès HTTP depuis le serveur

  • via un téléchargement HTTP depuis l'ordinateur hôte

  • via l'accès à un fichier qui a été copié sur le serveur à l'aide de rsync ou scp

  • via un script utilisant HTTP pour récupérer les données d’un service web

Les systèmes qui n’autorisent pas l’installation d’agents mais fournissent des données d’état via une API REST ou une interface Telnet constituent un autre domaine d’application des programmes source de données. Dans de tels cas, vous pouvez écrire un programme source de données qui interroge l’interface existante et génère une sortie d’agent à partir des données obtenues.

2. Écriture de programmes sources de données

2.1. Le programme le plus simple possible

L'écriture et l'installation d'un programme source de données ne sont pas difficiles. Tout langage de script et de programmation pris en charge par Linux peut être utilisé. Il est préférable de stocker le programme dans le répertoire ~/local/bin/, où il sera toujours trouvé automatiquement sans qu'il soit nécessaire de spécifier un chemin d'accès aux données.

Le premier exemple très basique suivant s’appelle myds et génère des données de supervision simples et fictives. Au lieu d’intégrer un nouveau chemin d’accès, il génère lui-même les données de supervision. Celles-ci se composent d’une section <<<df>>>, qui contient les informations relatives à un seul système de fichiers, et qui a une taille de 100 ko et le nom My_Disk. Il est codé sous la forme d’un script shell de trois lignes :

~/local/bin/myds
#!/bin/sh
echo '<<<df>>>'
echo 'My_Disk  foobar  100 70 30  70% /my_disk'
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 programme exécutable :

OMD[mysite]:~$ chmod +x local/bin/myds
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 un hôte de test dans la Configuration – par exemple, myserver125. Cela ne nécessite pas d'adresse IP. Afin d'éviter que Checkmk ne tente de résoudre myserver125 via le DNS, saisissez ce nom de domaine en tant qu'« adresse IP » explicite.

Ajoutez ensuite une règle dans le jeu de règles Setup > Agents > Other integrations > Individual program call instead of agent access qui s'applique à cet ordinateur hôte, et saisissez myds en tant que programme exécutable :

Input mask for an individual command.

Lorsque vous accédez à la configuration des services de l'ordinateur hôte dans l'interface graphique de configuration de la configuration, une seule liste de services prêts à être supervisés devrait apparaître :

The new service has been detected.

Ajoutez ce service à la supervision, activez les modifications, et votre premier programme source de données sera en cours d'exécution. À titre de test, dès que vous modifiez les données générées par le programme, le prochain check du système de fichiers d'My_Disk le signalera immédiatement.

2.2. Diagnostic des erreurs

Si quelque chose ne fonctionne pas correctement, vous pouvez vérifier la configuration de l'ordinateur hôte en saisissant « cmk -D » dans la ligne de commande et en vérifiant si votre règle prend effet :

OMD[mysite]:~$ cmk -D myserver125

myserver125
Addresses:              myserver125
Tags:                   [address_family:ip-v4-only], [agent:cmk-agent], [criticality:prod], [ip-v4:ip-v4], [networking:lan], [piggyback:auto-piggyback], [site:mysite], [snmp_ds:no-snmp], [tcp:tcp]
Host groups:            check_mk
Agent mode:             Normal Checkmk agent, or special agent if configured
Type of agent:
Program: myds
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é !

Avec une commande « cmk -d », vous pouvez déclencher la récupération des données de l'agent ainsi que l'exécution de votre programme :

OMD[mysite]:~$ cmk -d myserver125
<<<df>>>
My_Disk  foobar  100 70 30  70% /my_disk
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é !

Une commande « -v » répétée devrait générer un message indiquant que votre programme sera lancé :

OMD[mysite]:~$ cmk -vvd myserver125
Calling: myds
<<<df>>>
My_Disk  foobar  100 70 30  70% /my_disk
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é !

2.3. Transfert du nom de domaine d'un ordinateur hôte

Le programme de notre exemple fonctionne bel et bien, mais il n’est pas très utile car il produit toujours les mêmes données, quel que soit l’ordinateur hôte pour lequel il est appelé.

Un véritable programme qui, par exemple, récupère des données via HTTP depuis un emplacement donné, nécessite au moins le nom de domaine de l'ordinateur hôte à partir duquel il doit récupérer les données. En codant $HOSTNAME$ comme espace réservé dans la ligne de commande, vous pouvez permettre ce transfert :

Passing the host name with the $HOSTNAME$ macro.

Dans cet exemple, le programme myds reçoit le nom de domaine comme premier argument. L’exemple de programme suivant génère cela à des fins de test sous la forme d’une check local. Via $1, il récupère le premier argument et l’enregistre dans la variable $HOST_NAME afin de l’utiliser comme aperçu. Celui-ci sera ensuite inséré dans la sortie du plugin de la check local :

~/local/bin/myds
#!/bin/sh
HOST_NAME="$1"

echo '<<<local>>>'
echo "0 Hostname - My name is ${HOST_NAME}"
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é !

La reconnaissance du service trouvera alors un nouveau service de type local, dans la sortie duquel le nom de domaine sera visible :

The service discovery finds the new service, which now outputs the passed host name as information.

De là, il n'y a qu'un pas vers un véritable programme source de données qui, par exemple, récupère des données via HTTP à l'aide de l'instruction curl. Les espaces réservés suivants sont autorisés dans la ligne de commande d'un programme source de données :

$HOSTNAME$

Le nom de domaine tel qu'il est configuré dans la configuration.

$HOSTADDRESS$

L'adresse IP de l'ordinateur hôte sur lequel la supervision sera effectuée.

$_HOSTTAGS$

La liste de toutes les balises de l’hôte, séparées par des espaces – placez cet argument entre guillemets pour éviter qu'il ne soit divisé par le shell.

Si vous disposez d'une double supervision utilisant IPv4 et IPv6, les macros suivantes pourraient vous intéresser :

$_HOSTADDRESS_4$

L'adresse IPv4 de l'ordinateur hôte

$_HOSTADDRESS_6$

L'adresse IPv6 de l'ordinateur hôte

$_HOSTADDRESS_FAMILY$

La valeur numérique 4 si l'adresse IPv4 est utilisée pour la supervision, sinon 6.

2.4. Gestion des erreurs

Quelle que soit votre fonction dans le domaine de l’informatique, vous passerez une grande partie de votre temps à gérer des erreurs et des problèmes. Les programmes source de données n’y échappent pas. Il est particulièrement irréaliste d’attendre des programmes fournissant des données via des réseaux qu’ils soient exempts d’erreurs.

Afin que Checkmk puisse signaler une erreur à votre programme de manière ordonnée, les règles suivantes s’appliquent :

  1. Tout code de sortie autre que 0 sera traité comme une erreur.

  2. Les messages d'erreur doivent être envoyés sur le canal d'erreur standard (stderr).

Si un programme source de données échoue,

  • Checkmk ignore l'intégralité des données utilisateur de la sortie,

  • Checkmk définit le service Check_MK sur « CRIT » et identifie les données provenant de stderr comme une erreur,

  • et les services réels restent dans leur état antérieur (et deviendront obsolètes avec le temps).

Nous pouvons modifier l’exemple ci-dessus afin qu’il simule une erreur. Avec la redirection >&2, le texte sera redirigé vers stderr, et exit 1 définit le code de sortie du programme sur 1 :

~/local/bin/myds
#!/bin/sh
HOST_NAME=$1

echo "<<<local>>>"
echo "0 Hostname - My name is $HOST_NAME"

echo "This didn't work out" >&2
exit 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é !

En tant que service Check_MK, cela ressemblera à ceci :

If a script returns exit codes different from 0, the 'Check_MK' service will immediately CRIT (red).

Si vous écrivez votre programme sous forme de script shell, vous pouvez coder l'option d'set -e dès le début :

~/local/bin/myds
#!/bin/sh
set -e
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é !

Dès qu'une instruction génère une erreur (c'est-à-dire que le code de sortie n'est pas 0), le shell s'arrête immédiatement et renvoie le code de sortie 1. Vous disposez ainsi d'une gestion générique des erreurs et n'avez pas besoin de checker la réussite de chaque instruction individuellement.

3. Agents spéciaux

Checkmk est fourni avec un certain nombre de programmes sources de données fréquemment utilisés. Ces agents spéciaux sont présentés dans un article distinct.

4. Fichiers et répertoires

Chemin d'accès Fonction

~/local/bin/

Répertoire contenant vos propres programmes et scripts qui doivent figurer dans le chemin de recherche et qui peuvent être exécutés directement sans spécifier le chemin d'accès. Si un programme se trouve à la fois dans ~/bin/ et dans ~/local/bin/, ce dernier a la priorité.


Last modified: Tue, 11 Nov 2025 08:13:48 GMT via commit 7ce3decaf
Sur cette page