Vous êtes ici:

Menu


Stacks Image 8983
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.

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.
Stacks Image 294368
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.
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.
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
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.
Stacks Image 294397
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 :
Stacks Image 294400
Cliquez sur l'onglet Data Processing.
Stacks Image 294405
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 :
Stacks Image 294410
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
Stacks Image 294413
Avec le graphe, nous pouvons visualiser l'action du gestionnaire d'événements
Stacks Image 294416
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.

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
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.
Stacks Image 294437
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 :
Stacks Image 294446
Cliquez sur l'onglet Data Processing. Activez la gestion d'événement et ajouter l'event handler handle-proc-event-restart-spooler
Stacks Image 294451
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.
Stacks Image 294476
comments powered by Disqus
 Vous êtes ici:

Nous utilisons des cookies pour nous permettre de mieux comprendre comment le site est utilisé. En continuant à utiliser ce site, vous acceptez cette politique.