Monitoring RAID avec nagios via SNMP sous Debian avec mpt-status

J'utilise Nagios (avec l'interface Centreon) pour réaliser du monitoring de services sur les serveurs que je gère. Il est également possible (et souhaitable) de surveiller l'état des array RAID, pour remplacer le plus tôt possible tout disque défaillant.

J'ai trouvé sur cette page une documentation en anglais expliquant comment mettre en place ce type de monitoring de manière simple, en utilisant sur le serveur monitoré un script analysant la réponse renvoyée par mpt-status, qui sera renvoyée par snmpd sur demande depuis le serveur de monitoring. En voici les grandes lignes, tirées directement de mon expérience.

Configuration utilisée : un serveur de monitoring basé sur FAN (fully automated nagios), une distrib CentOS préconfigurée avec Nagios, Centreon et tout ce qu'il faut. Serveurs à surveiller : diverses configurations matérielles, tournant toutes sous Debian 6, avec un démon SNMPD.

Configuration des clients à surveiller

Télécharger ce script et placez-le par exemple dans /usr/local/bin sur toutes les machines pour lesquelles vous souhaitez surveiller l'état du RAID.

Attention, j'ai modifié le script en question. Dans le cas d'un statut avec erreur, il n'y avait pas d'output du code d'erreur. J'ai donc rajouté une ligne print "CRITICAL - " de la manière suivante, ligne 78 :

        if (!$logical_is_optimal || !$phys_all_online) {
                print "CRITICAL - ";
                print $status_output;
                exit $ERRORS{'WARNING'};
        }

Pensez à bien donner les droits d'exécution sur le script en question :

chmod 755 /usr/local/bin/check_mptsas

Dans le fichier /etc/snmp/snmpd.conf, ajoutez la ligne suivante :

exec check_mptsas_raid /usr/local/bin/check_mptsas

Cela permet de définir une nouvelle commande snmpd que pourra solliciter nagios, et qui est déléguée au script que l'on a téléchargé plus haut.

Redémarrez le démon snmpd pour appliquer les changements.

Configuration du serveur nagios

J'utilise exclusivement Centreon pour toute la configuration. Mais il faut toutefois mettre en place un petit script qui va utiliser la fonction d'exécution à distance par SNMP. Vous pouvez télécharger ce script, qui vient de cette page.

Voici donc la démarche que j'ai suivie :

Installation du script ci-dessus dans /usr/lib/nagios/plugins/contrib

Modification dans le script de l'appel à utils.sh. Il faut faire pointer vers le bon chemin (dans mon cas /usr/lib/nagios/plugins/utils.sh).

Création d'une nouvelle commande nagios (depuis centreon), que j'appelle check_mptsas_raid, avec comme ligne de commande

$USER1$/check_snmp_exec.sh $HOSTADDRESS$ check_mptsas_raid

Et enfin création tout à fait classique d'un nouveau service de monitoring qui va appel à la commande check_mptsas_raid, que l'on pourra appliquer diférents hôtes à monitorer.

Cas particulier : contrôleurs raid Smart Array G6

Sur les Dedibox ENT HP se trouvent un contrôleur RAID qui n'est pas compatible avec l'outil mpt-status. Pour faire du monitoring, il faut donc utiliser l'outil hpacucli.

J'ai donc adapté le script mentionné plus haut (celui à mettre sur les clients), pour en produire un compatible avec hpacucli. Il n'est peut-être pas tout à fait aussi beau et complet que l'autre, mais il devrait fonctionner. Attention toutefois, je n'ai pas encore eu de problème avec ce RAID me permettant de valider définitivement l'outil. A vérifier donc !

#!/usr/bin/perl -w

# $Id$

# check_mptsas v1.0 - Check LSI Fusion RAID status
# Copyright (c) 2010, John Morrissey <jwm@horde.net>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, 5th Floor, Boston, MA 02110-1301
# USA.

# Requires hpacucli from HP


use strict;

my %ERRORS = (
        'OK' => 0,
        'WARNING' => 1,
        'CRITICAL' => 2,
        'UNKNOWN' => 3,
        'DEPENDENT' => 4,
);

# You may need to update this if your mpt-status(8) is in a different
# location.
$ENV{'PATH'} = "$ENV{'PATH'}:/sbin:/usr/sbin";

if (!open(MPT_LOGICAL_STAT, 'sudo hpacucli ctrl slot=4 logicaldrive all show status |')) {
        print "ERROR: could not execute 'hpacucli'.\n";
        exit $ERRORS{'UNKNOWN'};
}

my $status_output;

while (<MPT_LOGICAL_STAT>) {
        if (!/logicaldrive ([0-9]+)/) {
                next;
        }

        if (!/OK$/){
                print "CRITICAL - ";
                print $_;
                exit $ERRORS{'CRITICAL'};
        }
        $status_output = $_;
}

if (!open(MPT_PHYSICAL_STAT, 'sudo hpacucli ctrl slot=4 physicaldrive all show status |')) {
        print "ERROR: could not execute 'hpacucli'.\n";
        exit $ERRORS{'UNKNOWN'};
}

while (<MPT_PHYSICAL_STAT>) {
        if (!/physicaldrive ([0-9]+)/) {
                next;
        }
        if (!/OK$/){
                print "CRITICAL - ";
                print $_;
                exit $ERRORS{'CRITICAL'};
        }
}

print "OK -";
print $status_output;
exit $ERRORS{'OK'};