Event handler

De UnixManiax
Aller à la navigation Aller à la recherche


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. :-)