Event handler
Principe
L'event_hanlder est un mécanisme de Nagios qui permet d'exécuter automatiquement une commande lors d'un changement d'état (passage de OK, WARNING ou CRITICAL vers n'importe quel autre de ces états). On peut alors envisager de relancer automatiquement un process lorsque nagios détecte sa panne.
Attention : lorsqu'on met en place ce système, il faut bien faire attention à ce que ce processus ne parte pas en boucle. En effet, si le process surveillé est vraiment défaillant, nagios va le relancer, il va replanter aussitôt, et ainsi de suite.
Techniquement, on va créer un script de relance du service sur le client nagios. Puis on va rajouter une commande dans la configuration nagios du service surveillé, cette commande se chargeant de lancer le script créé précédemment. Il faut veiller à ce que nagios ait les droits d'exécution pour ce script ; prévoir éventuellement un sudo ou équivalent.
Exemple de mise en place
On va prendre un exemple simple : la surveillance du service apache, qui sera relancé automatiquement.
Sur le client nagios
Dans un cas simple comme celui-ci, il n'est pas nécessaire de créer un script de relance en local sur le client. On peut intégrer la commande de relance directement dans la configuration de l'event_handler. Mais ici nous allons quand même le créer pour avoir un exemple complet.
Nous allons donc créer le script /opt/nagios/event_handler/httpd_restart.sh (peu importe l'emplacement, il faut juste le connaître pour le reporter plus loin) :
#!/bin/bash # Relance du serveur apache par nagios sudo /etc/init.d/httpd restart
Puis on donne les droits d'exécution dessus et on le fait appartenir à nagios :
chmod +x /opt/nagios/event_handler/httpd_restart.sh chown nagios:nagios /opt/nagios/event_handler/httpd_restart.sh
Note : le script sera lancé par le compte nagios, et celui-ci n'a pas les droits pour relancer le service apache. Il faut donc trouver un moyen de lui permettre de le faire, le plus propre étant à mon sens l'utilisation de sudo. D'où le sudo dans le script. Pensez-bien à configurer correctement le sudoers, je ne rentrerai pas dans ces détails ici.
Il est prudent de tester que le script fonctionne avant de passer à la suite. Bien sûr, il ne faut pas le faire à un moment ou ça va planter les utilisateurs !
Sur le serveur nagios
Sur le serveur nagios, il y a trois étapes : modification du service, création de la commande et, point un peu plus complexe, la création du script qui va déclencher le lancement du script sur le client.
Modification du service
Il faut éditer la configuration du service pour ajouter les deux lignes en gras :
define service{ use generic-service service_description io-svc check_period 24x7 notification_period 24x7 check_command check_nrpe!check_io_svc host_name serveur_a_surveiller contact_groups none event_handler http-restart event_handler_enabled 1 }
La première ligne indique que l'event-handler doit faire appel à la commande http-restart (qu'on va créer juste après).
La deuxième ligne active l'event-handler pour ce service. A noter qu'il faut également que l'event-handler soit actif au niveau général, pour tous les services nagios. Cela se fait dans nagios.cfg, variable enable_event_handlers.
Maintenant, on va définir la commande http-restart (on peut l'écrire à la suite, dans le même fichier de conf) :
define command{ command_name http-restart command_line $USER1$/eventhandlers/http-restart $SERVICESTATE$ $SERVICESTATETYPE$ $SERVICEATTEMPT$ }
Cette commande possède deux ligne : command_name, qui doit correspondre au nom donné sur la ligne event_handler du service, et la ligne command_line, qui est la commande qu'on va lancer. On va passer plusieurs plusieurs variables en paramètre, que je vais détailler juste après.
Le script côté client
[EN COURS]
#!/bin/bash # Script nagios de relance apache SERVICESTATE=$1 SERVICESTATETYPE=$2 SERVICEATTEMPT=$3 echo "SERVICESTATE=$SERVICESTATE SERVICESTATETYPE=$SERVICESTATETYPE SERVICEATTEMPT=$SERVICEATTEMPT" action() { ssh nagios@serveur_a_surveiller "/opt/nagios/event_handler/httpd_restart.sh" } case "$SERVICESTATE" in OK) # Pas de probleme. On ne fait rien. ;; WARNING) # Warning. On ne fait rien. ;; UNKNOWN) # Etat inconnu. On ne fait rien. ;; CRITICAL) # Etat critique. On ne va relancer apache qu'au deuxieme etat CRITICAL SOFT, ou a l etat HARD. case "$SERVICESTATETYPE" in SOFT) # Verification du nombre de tentatives case "$SERVICEATTEMPT" in 2) # On relance apache. echo "Restarting apache." action ;; esac ;; HARD) # On relance apache. echo "Restarting apache" action ;; esac ;; esac
Relance de nagios
Une fois que tout est configuré, il faut relancer nagios pour que ce soit pris en compte.
# service nagios checkconfig # service nagios reload
Il n'y a plus qu'à attendre que ça plante pour vérifier qu'on a bien tout mis en place. :-)