Surveiller un BladeCenter IBM avec Nagios

Ce billet explique la façon de surveiller un BladeCenter avec Nagios via SNMP. Pour ce tutoriel, les essais ont été faits sur des chassis HS21 et HS22, en utilisant un Nagios Core 3.2 sur une machine CentOS 5.4. Nous allons nous pencher sur la surveillance des températures ainsi que sur le fonctionnement des ventilateurs.

Activer SNMP sur le BladeCenter

Si ce n’est déjà fait, l’activation de SNMP se fait en suivant ce cheminement :

  • Se connecter sur l’Advanced Management Module
  • Aller sous MM Control
  • Network Protocols
  • SNMP

Il suffit d’activer SNMP, ici on se contentera de la version 1 du protocole, renseigner la communauté, en général « public » et l’IP, ici je choisis 192.168.1.10, à adapter bien entendu.

Trouver de la documentation IBM sur leur MIB n’est pas une mince affaire, je n’ai pas non plus passer tout mon temps là-dessus, en gros voici ce que l’on peut rapidement exploiter, exemple avec ce listing snmpwalk :

$ snmpwalk -v1 -c public -O n 192.168.1.10 .1.3.6.1.4.1.2.3.51.2.2
.1.3.6.1.4.1.2.3.51.2.2.1.1.2.0 = STRING: "39.00 Centigrade"
.1.3.6.1.4.1.2.3.51.2.2.1.5.1.0 = STRING: "23.00 Centigrade"
.1.3.6.1.4.1.2.3.51.2.2.2.1.1.0 = STRING: "+4.81 Volts"
.1.3.6.1.4.1.2.3.51.2.2.2.1.2.0 = STRING: "+3.26 Volts"
.1.3.6.1.4.1.2.3.51.2.2.2.1.3.0 = STRING: "+11.85 Volts"
.1.3.6.1.4.1.2.3.51.2.2.2.1.5.0 = STRING: "-4.85 Volts"
.1.3.6.1.4.1.2.3.51.2.2.2.1.6.0 = STRING: "+2.48 Volts"
.1.3.6.1.4.1.2.3.51.2.2.2.1.8.0 = STRING: "+1.76 Volts"
.1.3.6.1.4.1.2.3.51.2.2.3.1.0 = STRING: "47% of maximum"
.1.3.6.1.4.1.2.3.51.2.2.3.2.0 = STRING: "47% of maximum"
(...)

On découvre quelques informations intéressantes, comme la température et l’état des ventilateurs :

  • .1.3.6.1.4.1.2.3.51.2.2.1.1.2.0 Température interne
  • .1.3.6.1.4.1.2.3.51.2.2.1.5.1.0 Température ambiante
  • .1.3.6.1.4.1.2.3.51.2.2.3.1.0 Vitesse ventilateur 1 (en % du maximum)
  • .1.3.6.1.4.1.2.3.51.2.2.3.2.0 Vitesse ventilateur 2 (en % du maximum)



Nagios

Coté Nagios, en principe nous n’aurions pas besoin de plugin particulier car nous interrogeons le BladeCenter via SNMP, mais voilà, les réponses ne sont pas directement exploitables si l’on veut recevoir des alertes. En effet, si l’on regarde par exemple une des températures, le résultat nous donnes : 39.00 Centigrade, ce n’est pas directement évaluable, juste le 39.00 aurait été plus simple. Il faut donc manipuler cette chaine pour extirper le chiffre qui pourra être évaluer et Nagios pourra retourner un état OK, WARNING, CRITICAL ou UNKNOWN.

Le script PERL

Avis aux développeurs PERL, je n’ai quasiment jamais touché à ce langage, ce script a été pondu en m’inspirant d’autres plugins Nagios et en me documentant sur le vif, il y a peut-être des énormités, merci de m’en faire part ^.^
J’ai toutefois essayé de suivre la guideline Nagios en ce qui concerne les plugins PERL. Voici le script que j’ai appelé check_temperature_bladecenter.pl pour surveiller les températures et recevoir des alertes :

#!/usr/bin/perl -w

use lib "/usr/local/nagios/libexec";
use utils qw(%ERRORS &print_revision &support &usage);

use Getopt::Long;
Getopt::Long::Configure('bundling');


#
# Deux subroutines pour afficher l'usage et une aide succinte
#
sub print_usage () {
        print "Usage: $0 -H <host> -w <warning_temperature> -c <critical_temperature> -t <mm|ambiant>\n"; }

sub print_help () {
        print "\n";
        print "\n";
        print "$plugin_name nagios plugin version $version\n";
        print "\n";
        print "The nagios plugins come with ABSOLUTELY NO WARRANTY.  You may redistribute\n";
        print "copies of the plugins under the terms of the GNU General Public License.\n";
        print "For more information about these matters, see the file named COPYING.\n";
        print "\n";
        print "Copyright (c) 2012 Fabien Amann <fabien at feub.net>\n";
        print "\n";
        print "\n";
        print "This plugin checks the temperatures of an IBM BladeCenter.\n";
        print "\n";
        print "\n";
        print_usage();
        print "\n";
        print "Options:\n";
        print " -H, --hostname=ADDRESS\n";
        print "     host name argument for server.\n";
        print " -h, --help\n";
        print "     print detailed help screen.\n";
        print " -V, --version\n";
        print "     print version information.\n";
        print " -w, --warning=INTEGER\n";
        print "     temperature value at which a warning message will be gererated.\n";
        print " -c, --critical=INTEGER\n";
        print "     temperature value at which a critical message will be gererated.\n";
        print "\n";
        print "\n";
}
#
# Valeurs par défaut
#
$TIMEOUT=15;
$plugin_name="check_temperature_bladecenter";
$version="0.1";

#
# Obtenir les options de ligne de commande proprement
#
GetOptions
        ("V"   => \$opt_V, "version"       => \$opt_V,
         "h" => \$opt_h, "help"     => \$opt_h,
         "w=s" => \$opt_w, "warning=s"     => \$opt_w,
         "c=s" => \$opt_c, "critical=s"    => \$opt_c,
         "H=s" => \$opt_H, "hostname=s"    => \$opt_H,
         "t=s" => \$opt_t, "temptype=s"    => \$opt_t);

#
# Affiche les informations sur le plugin
#
if ($opt_V) {
        print "\n";
        print "$plugin_name nagios plugin version $version\n";
        print "\n";
        print "The nagios plugins come with ABSOLUTELY NO WARRANTY.  You may redistribute\n";
        print "copies of the plugins under the terms of the GNU General Public License.\n";
        print "For more information about these matters, see the file named COPYING.\n";
        print "\n";
        print "Copyright (c) 2012 Fabien Amann <fabien at feub.net>\n";
        print "\n";
        print "\n";
        exit $ERRORS{'UNKNOWN'};
}

#
# Affiche l'aide du plugin
#
if ($opt_h) {
        print_help();
        exit $ERRORS{'UNKNOWN'};
}

#
# Gère le timeout
#
$SIG{'ALRM'} = sub {
     print ("ERROR: No response from HTTP server (alarm)\n");
     exit $ERRORS{"UNKNOWN"};
};
alarm($TIMEOUT);

#
# MIB BladeCenter
#
$mibAmbiant = ".1.3.6.1.4.1.2.3.51.2.2.1.5.1.0";
$mibMM = ".1.3.6.1.4.1.2.3.51.2.2.1.1.2.0";

if ($opt_t eq "mm"){
        $resultat = `snmpwalk -v 1 -c public $opt_H $mibMM`;
}
else{
        $resultat = `snmpwalk -v 1 -c public $opt_H $mibAmbiant`;
}
if ( $resultat ) {
        @temperature = split(/ /,$resultat);
        @temperature2 = split(/\"/,$temperature[3]);
        $temp = $temperature2[1];

        if ( $temp < $opt_w ) {
                print "OK : Temperature $temp (w:$opt_w - c:$opt_c)";
                exit $ERRORS{'OK'};
        }
        elsif ( $temp < $opt_c ) {
                print "WARNING : Temperature $temp (limit critical : $opt_c)";
                exit $ERRORS{'WARNING'};
        }
        else {
                print "CRITICAL : Temperature :$temp (limit warning : $opt_w)";
                exit $ERRORS{'CRITICAL'};
        }

}
else {
        print "Unkonwn : No response\n";
        exit $ERRORS{'UNKNOWN'};
}
#
# Fin
#

Ce script se place sous /usr/lib/nagios/plugins/. Il faut le rendre exécutable :

chmod +x /usr/lib/nagios/plugins/check_temperature_bladecenter.pl

Configuration Nagios

Entrons vraiment dans Nagios maintenant. En premier nous allons ajouter une nouvelle commande check_bc_temp dans le fichier /etc/nagios/objects/command.cfg :

#
# Commande BladeCenter
#
define command {
	command_name    check_bc_temp
	command_line    /usr/bin/perl $USER1$/check_temp_bladecenter.pl -H $HOSTADDRESS$ -w $ARG1$ -c $ARG2$ -t $ARG3$
	}

Ensuite, on ajoute un hôte BladeCenter. Il existe de nombreuses possibilités pour gérer Nagios, en ce qui me concerne j’ai un fichier par hôte avec les diiférents services de cet hôte, à adapter donc si vous utilisez une structure différente. Fichier /etc/nagios/hosts/bladecenter_hs22.cfg :

# Hote BladeCenter
define host{
	use             	bladecenter
	host_name       	bladecenter_hs22
	alias           	BladeCenter HS22
	address         	192.168.1.10
	}

# Service de "ping"
define service{
	use			local-service
	host_name		bladecenter_hs22
	service_description PING
	check_command		check_ping!100.0,20%!500.0,60%
	}

# Ventilateur chassis 1	
define service {
	use			generic-service
	host_name		bladecenter_hs22
	service_description	Chassis Fan 1
	check_command		check_snmpv1!|
			.1.3.6.1.4.1.2.3.51.2.2.3.1.0!\
			65!85!C!Chassis Fan 1
	}

# Température ambiante
define service {
	use			generic-service
	host_name		bladecenter_hs22
	service_description	Chassis Temperature - Front Panel
	check_command		check_bc_temp!35!45!ambiant
	action_url		/cacti/graph_view.php?action=tree&tree_id=1&leaf_id=21
}

# Température interne
define service {
	use			generic-service
	host_name		bladecenter_hs22
	service_description	Chassis Temperature - Planar
	check_command		check_bc_temp!65!85!mm
	action_url 		/cacti/graph_view.php?action=tree&tree_id=1&leaf_id=23
}

Au passage, la ligne action_url permet de spécifier un lien qui sera affiché à droite du service dans Nagios, dans mon cas, je dirige vers les graphiques de l’hôte correspondant dans Cacti.
Tout est maintenant presque prêt, il ne reste plus qu’à ajouter notre hôte dans le fichier de configuration nagios.cfg :

cfg_file=/etc/nagios/hosts/bladecenter_hs22.cfg

On test la nouvelle configuration et s’il n’y a pas d’erreurs, on redémarre Nagios pour prendre en compte le BladeCenter :

# nagios -v nagios.cfg
# service nagios reload

On patiente un peu où on force la vérification pour voir le résultat.


Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *