Table des matières
Créer une sonde personnalisée
Ou comment ajouter une sonde personnalisée au monitoring de Chapril.
Exécutable de test
Il vous faut un exécutable de test, nommé plugin dans la nomenclature icinga2. Cet exécutable devra renvoyer au choix :
- 0 ⇒ OK
- 1 ⇒ WARNING
- 2 ⇒ CRITICAL
- 3 ⇒ UNKNOWN
Cet exécutable devra être présent sur chaque machine où c'est nécessaire dans le dossier /usr/local/lib/nagios/plugins/
.
Le master Icinga distribue leurs ordres et leurs configurations aux satellites, mais ne distribue pas les exécutables et dépendances.
- /etc/sudoers.d/icinga2-smart
nagios ALL=NOPASSWD: /usr/lib/nagios/plugins/check_ide_smart -d /dev/sd[ab]
Interface Icinga <=> exécutable
Icinga doit savoir comment appeler votre exécutable. Ça passe par un objet CheckCommand. Cette configuration est à faire sur le Icinga Master et sera déployée automatiquement sur tous les satellites qui recoivent la zone globale nommée global-templates
. Pour cette raison la configuration doit se faire sous l'arborescence /etc/icinga2/zones.d/global-templates/
.
Un cas très simple de CheckCommand :
object CheckCommand "backup" { command = [ LocalPluginDir + "/check_backup" ] }
Un cas moins simple :
object CheckCommand "smartsudo" { command = [ "sudo", LocalPluginDir + "/check_ide_smart" ] arguments = { "-d" = { value = "$smart_device$" description = "Name of a local hard drive to monitor" required = true } } }
Pour connaître les CheckCommand spécifiques à Chapril, c'est grep 'object CheckCommand' /etc/icinga2/zones.d/global-templates/ -R
sur le Icinga Master.
Configuration de la sonde
Icinga doit savoir comment affecter chaque sonde à chaque machine. Ça passe par les objets Service.
Cette configuration est à faire sur le Icinga Master et sera placée soit dans la zone global-templates
, soit pour un hote spécifique dans la configuration de l'hote (sous l'arborescence /etc/icinga2/zones.d/master
).
Un cas simple :
apply Service "Check Backup " { /* héritage de configuration de base ; cf global-templates/templates.conf */ import "generic-service" /* le CheckCommand de ce service */ check_command = "check_backup" /* le lieu d'exécution de la commande */ command_endpoint = host.vars.client_endpoint /* la regle d'affectation de ce service */ assign where host.name == "felicette.cluster.chapril.org" }
Lieu d'exécution
Pour par exemple tester un service depuis l'extérieur, on peut être intéressés par déporter le lieu d'exécution. Par exemple sur la VM dédiée à cela (et au backup) dans l'infra de l'April :
command_endpoint = "felicette.cluster.chapril.org"
Variables de CheckCommand
Un cas peu moins simple :
apply Service "Smart " for (harddisk => config in host.vars.harddisks) { import "generic-service" check_command = "smartsudo" command_endpoint = host.vars.client_endpoint vars.smart_device = config.device }
On remarque que la variable smart_device
est utilisée dans la CheckCommand associée.
Le "apply ... for" expliqué
Considérons :
apply Service "Domaine " for (zone => config in host.vars.zones) { import "generic-service" check_command = "whois" command_endpoint = host.vars.client_endpoint vars.fqdn = config.fqdn assign where config.view == "external" }
Le apply Service “Préfixe de nom” for
applique le Service en déconstruisant les variables des hosts. Ainsi, si un hôte a une configuration Icinga de décrivant
object Host "dns.cluster.chapril.org" { ... /* Define zones and files for checks */ vars.zones["Internal chapril.org"] = { fqdn = "chapril.org" file = "/etc/bind/zones/masters/chapril.org-int" view = "internal" } vars.zones["external chapril.org"] = { fqdn = "chapril.org" file = "/etc/bind/zones/masters/chapril.org" view = "external" } ... }
Alors cet hôte va se voir affecté un qui pourrait être décrit (façon Nagios) par
/* Pour démonstration seulement. Ne pas instancier des services via la directive ''object Service''. */ object Service "Domaine chapril.org" { host_name = "bling.cluster.chapril.org" import "generic-service" check_command = "whois" command_endpoint = host.vars.client_endpoint vars.fqdn = "chapril.org" }
object Service
, qui est la façon Nagios (legacy) de faire. Toujours faire via un apply Service
, plus simple à généraliser (peut s'appliquer sur 42 hotes en une fois) et donc à maintenir.
grep 'apply Service' /etc/icinga2/zones.d/ -R
sur le Icinga Master.
Finalement
Vous pouvez vérifier que la configuration se charge bien dans Icinga :
icinga2 daemon -C
Vous aurez à reloader icinga. Éventuellement même sur le client.
systemctl reload icinga2
ServiceGroup
Icinga possède une notion (utile pour s'y retrouver) de groupes de services. Vous pouvez définir des nouveaux groupes de services et/ou ajouter vos sondes à un groupe de services dans zones.d/global-templates/groups.conf
:
object ServiceGroup "backup" { display_name = "Backup Checks" assign where match("*backup*", service.check_command) }
object ServiceGroup "disk" { display_name = "Disk Checks" assign where match("disk*", service.check_command) assign where match("drbd*", service.check_command) assign where match("smart*", service.check_command) }
Filtrer sur les CheckCommand présente l'avantage de gérer toutes les variantes de services possibles. Et selon les conventions, on voit que ça peut être avantageux d'avoir des préfixes ou des suffixes communs pour les noms des CheckCommand.