Les Event Handlers ou gestionnaire d'événements vont permettre au moteur de supervision d'interagir avec des scripts en fonction des états d'un hôte ou d'un service. Imaginons que vous avez un serveur Web supervisé par Centreon. Si le processus apache s'arrête pour une raison inconnue. Vous pouvez, grâce aux Event Handlers, relancer le service apache. Attention, tout de même, il faut bien réfléchir aux actions que vous voulez mettre en oeuvre pour éviter des comportements non désirés.
Dans ce tutoriel, je vais vous proposer deux exemples, un pour Linux et un deuxième pour Windows. Le premier vous permettra de relancer un processus comme le service centengine d'un serveur de test sous Debian 10. Cela me permettra de connaître la fréquence des arrêts non désirés de cette version pendant 24 heures. Le deuxième exemple, plus intéressant pour ma part, permet de redémarrer le service spooler d'un serveur Windows. De plus, ce deuxième exemple, est plus générique, puisque nous utiliserons une macro système $HOSTADRESS$. Ceci permettra d'appliquer la configuration à un modèle de service.
Dans ce tutoriel, je vais vous proposer deux exemples, un pour Linux et un deuxième pour Windows. Le premier vous permettra de relancer un processus comme le service centengine d'un serveur de test sous Debian 10. Cela me permettra de connaître la fréquence des arrêts non désirés de cette version pendant 24 heures. Le deuxième exemple, plus intéressant pour ma part, permet de redémarrer le service spooler d'un serveur Windows. De plus, ce deuxième exemple, est plus générique, puisque nous utiliserons une macro système $HOSTADRESS$. Ceci permettra d'appliquer la configuration à un modèle de service.
1 Premier exemple : relancer un processus sous Linux
1.1 Prérequis
J'ai donc installé un serveur Debian avec une configuration de base avec le nouveau package centreon-engine livré avec Buster. Ce serveur ne supervise rien, il sert juste pour ce tutoriel. Bien sûr je le supervise avec un Centreon 19.04, tout à fait opérationnel avec le plugin SNMP livré avec cette version.
Le but de ce tuto étant de détecter un arrêt du processus centengine et de tenter de le redémarrer à distance, nous allons d'abord trouver le moyen d'effectuer cette action.
1.2 Redémarrage à distance du processus centengine
Il n'y a aucun lien entre le serveur Debian et le serveur de supervision, ce n'est pas un poller distant mais bien un serveur autonome, nous allons trouver une solution de contournement. Cet exemple pourra servir pour tout autre processus. Tout d'abord, voici les différentes commandes pour redémarrer le moteur centengine.
service centengine restart
ou
systemctl restart centengine
Nous utiliserons la première commande. Nous utiliserons l'utilisateur centreon-engine donc il faudra utiliser le mécanisme sudo. Pour la connexion à distance, j'ai choisi une solution via le protocole ssh. Comme je n'ai pas envie de réinventer la roue, je vais utiliser un plugin centreon qui est capable d'effectuer cette opération.
Installer le plugin centreon-plugin-Operatingsystems-Linux-Local.
Installer le plugin centreon-plugin-Operatingsystems-Linux-Local.
yum install centreon-plugin-Operatingsystems-Linux-Local
Comme nous devons réaliser une connexion ssh sans mot de passe, nous utiliserons une clé publique pour l'utilisateur centreon-engine. Sur le serveur Debian Buster, créez un mot de passe pour centreon-engine (attention, par défaut, cet utilisateur sous debian 10 n'a pas de login bash)
passwd centreon-engine
Sur le serveur Centreon, connectez-vous en centreon-engine. Créez votre clé publique et envoyez cette clé sur le serveur Debian.
root@supervision:~# su - centreon-engine $ ssh-keygen $ ssh-copy-id -i centreon-engine@<IP Serveur Debian>
Sur le serveur Debian, il faut élever les privilèges de centreon-engine pour la commande de redémarrage de centengine. Nous allons utiliser le mécanisme sudo. Créez le fichier suivant :
vi /etc/sudoers.d/centreon
Saisissez les lignes suivantes :
## Elevation centreon-engine
User_Alias CENTREON=%centreon-engine
Defaults:CENTREON !requiretty
# Centreon Engine
CENTREON ALL = NOPASSWD: /usr/sbin/service centengine restart
2.1a plugin centreon
Maintenant, nous allons tester notre commande avec la ligne suivante, j'utilise le mode cmd-return avec l'option remote et sudo.
/usr/lib/centreon/plugins/centreon_linux_local.pl --plugin=os::linux::local::plugin --mode=cmd-return --sudo --command=/usr/sbin/service --command-options="centengine restart" --manage-returns='0,OK,process centengine start#1,CRITICAL,process KO#,UNKNOWN,Command problem' --remote --hostname=<IP Serveur Debian> --ssh-option='-l=centreon-engine'
Description des paramètres
plugin=os::linux::local::plugin : utilisation du plugin
mode=cmd-return : le mode cmd-return permet l'utilisation d'une commande et de récupérer le code de sortie de celui-ci
sudo : on indique qu'il faut utiliser la commande sudo pour élever le privilège de l'utilisateur
command=/usr/sbin/service : nom et chemin de la commande
command-options="centengine restart" : options de la commande
manage-returns='0,OK,process centengine start#1,CRITICAL,process KO#,UNKNOWN,Command problem' : interprétations du résultat de la commande chaque état est séparé par le symbole Dièze ou Hashtag
remote : on indique qu'on utilise le protocole ssh pour envoyer la commande à distance.
hostname=<IP Serveur Debian> : adresse IP du serveur Debian
ssh-option='-l=centreon-engine' : option ssh, dans ce cas c'est l'utilisateur centreon-engine.
plugin=os::linux::local::plugin : utilisation du plugin
mode=cmd-return : le mode cmd-return permet l'utilisation d'une commande et de récupérer le code de sortie de celui-ci
sudo : on indique qu'il faut utiliser la commande sudo pour élever le privilège de l'utilisateur
command=/usr/sbin/service : nom et chemin de la commande
command-options="centengine restart" : options de la commande
manage-returns='0,OK,process centengine start#1,CRITICAL,process KO#,UNKNOWN,Command problem' : interprétations du résultat de la commande chaque état est séparé par le symbole Dièze ou Hashtag
remote : on indique qu'on utilise le protocole ssh pour envoyer la commande à distance.
hostname=<IP Serveur Debian> : adresse IP du serveur Debian
ssh-option='-l=centreon-engine' : option ssh, dans ce cas c'est l'utilisateur centreon-engine.
Testons notre commande en arrêtant manuellement le processus centengine sur le serveur buster et en se connectant en tant que centreon-engine sur le moteur de supervision.
[root@centreon1910 ~]# su - centreon-engine
-bash-4.2$ /usr/lib/centreon/plugins/centreon_linux_local.pl --plugin=os::linux::local::plugin --mode=cmd-return --sudo --command=/usr/sbin/service --command-options="centengine restart" --manage-returns='0,OK,process centengine start#1,CRITICAL,process KO#,UNKNOWN,Command problem' --remote --hostname=192.168.1.79 --ssh-option='-l=centreon-engine'
OK: process centengine start | 'code'=0;;;;
Le plugin nous retourne le code de sortie de la commande. Vous devez avoir votre processus centengine en état de fonctionnement.
1.3 Configuration de notre gestionnaire d'événement
Nous devons créer notre script de gestionnaire d'événement. Celui-ci devra gérer le statut du service ainsi que l'état hard ou soft de ce statut. Voici le script que l'on placera dans un dossier eventhandler dans le dossier /usr/lib/centreon/plugins. Je n'ai rien inventé, ce script provient de la documentation Nagios. J'ai juste rajouté le script précédent sur l'événement Critical en statut Hard.
Créez le dossier
Créez le fichier
Saisissez les lignes suivantes
mkdir /usr/lib/centreon/plugins/eventhandler
Créez le fichier
vi /usr/lib/centreon/plugins/eventhandler/handle-proc-event-restart-engine
Saisissez les lignes suivantes
#!/bin/bash
#script pour les service handle-master-proc-event
# prise en compte que si état HARD
case "$2" in
HARD)
case "$1" in
CRITICAL)
/usr/lib/centreon/plugins/centreon_linux_local.pl --plugin=os::linux::local::plugin --plugin=os::linux::local::plugin --mode=cmd-return --sudo --command=/usr/sbin/service --command-options="centengine restart" --manage-returns='0,OK,process centengine start#1,CRITICAL,process KO#,UNKNOWN,Command problem' --remote --hostname=192.168.1.79 --ssh-option='-l=centreon-engine'
;;
WARNING)
;;
UNKNOWN)
;;
OK)
;;
esac
;;
esac
exit 0
Donnez les droits d'exécution et changer le propriétaire du fichier.
chmod +x /usr/lib/centreon/plugins/eventhandler/handle-proc-event-restart-engine
chown centreon: /usr/lib/centreon/plugins/eventhandler/handle-proc-event-restart-engine
Nous allons créer notre commande dans l'interface Centreon. Sélectionnez configuration -> commands -> checks. ajoutez une commande de vérification.
Nous ajoutons notre script suivi de deux macros systèmes sur le statut du service et de son état.
$CENTREONPLUGINS$/eventhandler/handle-proc-event-restart-engine $SERVICESTATE$ $SERVICESTATETYPE$
Sauvegardez cette commande et sélectionnez le service qui vérifie l'état du processus centengine. Nous allons lui associer ce gestionnaire d'événement. Voici notre service :
Cliquez sur l'onglet Data Processing.
Activez la gestion d'événement et sélectionnez le gestionnaire d'événement handle-proc-event-restart-engine. Sauvegardez et appliquez la configuration.
1.4 Vérification du fonctionnement
Pour tester, rien de plus facile. Arrêtez votre processus centengine. Il vous suffira d'attendre tranquillement l'état hard du statut critical de notre service proc-centengine. Voici un aperçu du gestionnaire d'événements :
Une fois que l'état Hard du statut Critical est confirmé, le moteur du serveur de supervision va déclencher le gestionnaire d'événement comme le montre le fichier de log.
[1563138004] [767] SERVICE ALERT: testbuster;proc-centengine;OK;HARD;3;OK: Number of current processes running: 1
[1563138004] [767] SERVICE EVENT HANDLER: testbuster;proc-centengine;OK;HARD;3;handle-proc-event-restart-engine
Au bout de quelque temps votre service retourne à l'état OK
Avec le graphe, nous pouvons visualiser l'action du gestionnaire d'événements
Nous avons vu un exemple d'utilisation du gestionnaire d'événements appelé aussi Event Handlers. Attention, il faudra faire attention aux événements mal maîtrisés qui mettraient en péril le bon fonctionnement de votre installation.
2 Deuxième exemple : relancer un processus sous Windows
Voici l'objectif : Superviser un processus, en l’occurrence le service spooler de Windows, et pouvoir le redémarrer en cas d’alerte Critique. On utilise le mécanisme de gestionnaire d’événement qui se déclenche à chaque changement d’état du service. On lancera le script de redémarrage lors du statut Critical avec l’état Hard du service.
Le script sera exécuté sur la machine Windows par l’intermédiaire de l’Agent NSClient. L’utilisation de la macro système $HOSTADRESS$ nous permet de créer un Event Handler générique pouvant servir pour plusieurs hôtes Windows.
Le script sera exécuté sur la machine Windows par l’intermédiaire de l’Agent NSClient. L’utilisation de la macro système $HOSTADRESS$ nous permet de créer un Event Handler générique pouvant servir pour plusieurs hôtes Windows.
2.1 Configuration de notre gestionnaire d'événement
Nous devons créer notre script de gestionnaire d'événement. Celui-ci devra gérer le statut du service ainsi que l'état hard ou soft de ce statut. Voici le script que l'on placera dans un dossier eventhandler dans le dossier /usr/lib/centreon/plugins. Je n'ai rien inventé, ce script provient de la documentation Nagios. J'ai juste rajouté le script précédent sur l'événement Critical en statut Hard.
Créez le dossier
Créez le fichier
Saisissez les lignes suivantes
mkdir /usr/lib/centreon/plugins/eventhandler
Créez le fichier
vi /usr/lib/centreon/plugins/eventhandler/handle-proc-event-restart-spooler
Saisissez les lignes suivantes
#!/bin/bash
#script pour les service handle-master-proc-event
# prise en compte que si état HARD
case "$2" in
HARD)
case "$1" in
CRITICAL)
/usr/lib64/nagios/plugins/check_centreon_nrpe3 -H $3 -p 5666 -t 30 -u -2 -P 8192 -c check_start_spooler
;;
WARNING)
;;
UNKNOWN)
;;
OK)
;;
esac
;;
esac
exit 0
Donnez les droits d'exécution et changer le propriétaire du fichier.
chmod +x /usr/lib/centreon/plugins/eventhandler/handle-proc-event-restart-engine
chown centreon: /usr/lib/centreon/plugins/eventhandler/handle-proc-event-restart-engine
Nous allons créer notre commande handle-proc-event-restart-spooler dans l'interface Centreon. Sélectionnez configuration -> commands -> checks. ajoutez une commande de vérification.
Nous ajoutons notre script suivi de trois macros systèmes, respectivement le statut du service, le statut de son état et l’adresse IP de l’hôte sélectionné.
$CENTREONPLUGINS$/eventhandler/handle-proc-event-restart-engine $SERVICESTATE$ $SERVICESTATETYPE$ $HOSTADDRESS$
2.2 Modification du service
Sauvegardez cette commande et sélectionnez le service qui vérifie l'état du processus spooler sur le serveur windows. Nous allons lui associer ce gestionnaire d'événement. Voici notre service :
Cliquez sur l'onglet Data Processing. Activez la gestion d'événement et ajouter l'event handler handle-proc-event-restart-spooler
Exportez la configuration
2.3 Création du script windows
Sur le serveur windows, création d’un script start_spooler.bat dans C:\Program Files\Centreon NSClient++\scripts.
@echo off
net start spooler >NUL
IF ERRORLEVEL 2 GOTO err
GOTO ok
:err
echo Pb service spooler
exit /B 1
:ok
echo spooler ok
exit /B 0
2.4 Configuration NSClient
Modification du nsclient ini
[/settings/external scripts/scripts]
check_start_spooler = scripts\\start_spooler.bat
redémarrer le service NSClient
2.5 Test
Il suffit d’arrêter le service spooler du serveur Windows. Comme le montre la timeline, au déclenchement de l’alerte CRITICAL en état HARD, l’Event Handler se déclenchera. Le service reviendra au statut OK.