====== Supervision Hardware IPMI ======
L'Interface de gestion intelligente de matériel, (ou IPMI, Intelligent Platform Management Interface) est un ensemble de spécifications d'interfaces communes avec du matériel informatique (principalement des serveurs) permettant de surveiller certains composants (ventilateur, sonde de température, ...). Les principaux constructeurs de serveurs implémentent tous ce standard.
Pour la supervision, **IPMI est intéressant car il permet de pouvoir contrôler tous les aspects matériels d'un serveur sans installer le moindre agent supplémentaire**. Il est en général possible d'activer les fonctions IPMI sur un serveur via le BIOS ou via le logiciel de gestion du constructeur.
L'ensemble du document suivant a été rédigé avec un serveur Dell comme cible mais peut être transposé pour tous les constructeurs respectant le standard. Pour interroger ce serveur, c'est [[http://ipmitool.sourceforge.net/ | ipmitool]] pour Linux qui a été utilisé sur le serveur Nagios. Il convient de préparer votre serveur (celui que vous voulez superviser) à accepter les requêtes distantes IPMI. Sur Dell, il faut activer le mode BMC sur DRAC et soit dédier une interface réseau soit en partager une pour ce type de requêtes. Si vous ne souhaitez pas ((c'est toujours mieux)) travailler avec le compte root et des privilèges Administrateur sur IPMI, il faut également créer un nouvel utilisateur de type USER (utilisateur que nous appelons nagios dans ces exemples).
===== Commandes disponibles =====
Les commandes disponibles via IPMI
* //raw// : Send a RAW IPMI request and print response
* //lan// : Configure LAN Channels
* //chassis// : Get chassis status and set power state
* //event// : Send events to MC
* //mc// : Management Controller status and global enables
* //sdr// : Print Sensor Data Repository entries and readings
* //sensor// : Print detailed sensor information
* //fru// : Print built-in FRU and scan for FRU locators
* //sel// : Print System Event Log (SEL)
* //pef// : Configure Platform Event Filtering (PEF)
* //sol// : Configure and connect IPMIv2.0 Serial-over-LAN
* //tsol// : Configure and connect Tyan IPMIv1.5 Serial-over-LAN
* //isol// : Configure Intel IPMIv1.5 Serial-over-LAN
* //user// : Configure Management Controller users
* //channel// : Configure Management Controller channels
* //session// : Print session information
* //sunoem// : Manage Sun OEM Extensions
* //exec// : Run list of commands from file
* //set// : Set runtime variable for shell and exec
Pour la supervision, c'est surtout la commande 'sdr' qui est utlisée. Cette commande nécessite uniquement des privilèges d'utilisateur sur la carte IPMI du serveur supervisé.
===== La commande sdr =====
Il existe un grand nombre de sondes matérielles qu'il est possible d'interroger avec la commande IPMI sdr. En voici une liste retournée par notre serveur Dell.
Types de sondes disponibles via IPMI
Temperature Voltage
Current Fan
Physical Security Platform Security
Processor Power Supply
Power Unit Cooling Device
Other Memory
Drive Slot / Bay POST Memory Resize
System Firmwares Event Logging Disabled
Watchdog System Event
Critical Interrupt Button
Module / Board Microcontroller
Add-in Card Chassis
Chip Set Other FRU
Cable / Interconnect Terminator
System Boot Initiated Boot Error
OS Boot OS Critical Stop
Slot / Connector System ACPI Power State
Watchdog Platform Alert
Entity Presence Monitor ASIC
LAN Management Subsystem Health
Battery Session Audit
Version Change FRU State
Le moyen le plus simple d'utiliser la commande sdr la première fois est de l'appeler avec le minimum d'options et arguments comme ceci
/usr/bin/ipmitool -I lanplus -H ip_address -U utilisateur -P passe sdr list all
Cette commande peut être à la fois lancé en local ou à distance. C'est cette variante qui est utlisée.
* L'option -I précise le type de requête entre lan, lanplus et open. Comme notre serveur possède la version 2.0 du protocole, il est possible d'utiliser ici lanplus.
* -H l'adresse IP ou nom FQDN du serveur à interroger.
* -U l'utilisateur
* -P le mot de passe de cet utilisateur.
La sortie de "sdr list all" est la plus complète qui soit et vous pouvez en voir un exemple avec ce {{:supervision:dell-ipmi-list-all.txt.zip|fichier de sortie}}. Il faut noter l'option '-c' qui permet d'avoir une sortie de cette liste formatée en CSV, très facile à parcourir ensuite.
/usr/bin/ipmitool -c -I lanplus -H ip_address -U utilisateur -P passe sdr list all
nous donne cet extrait de sortie ou ce {{:supervision:list-all.csv.zip|fichier}}.
Temp,,,ns
Temp,,,ns
Temp,,,ns
Temp,,,ns
Ambient Temp,26,degrees C,ok
CMOS Battery,10h,ok,7.1,
ROMB Battery,11h,ns,26.3,No Reading
VCORE,12h,ok,3.1,State Deasserted
VCORE,13h,ok,3.2,State Deasserted
CPU VTT,16h,ok,7.1,State Deasserted
1.5V PG,17h,ok,7.1,State Deasserted
1.8V PG,18h,ok,7.1,State Deasserted
3.3V PG,19h,ok,7.1,State Deasserted
5V PG,1Ah,ok,7.1,State Deasserted
Backplane PG,1Dh,ok,7.1,State Deasserted
Flexbay PG,1Fh,ok,7.1,State Deasserted
Linear PG,20h,ok,7.1,State Deasserted
0.9V PG,21h,ok,7.1,State Deasserted
1.5V ESB2 PG,22h,ok,7.1,State Deasserted
0.9V Over Volt,23h,ok,7.1,State Deasserted
CPU Power Fault,24h,ok,7.1,State Deasserted
FAN 1 RPM,2775,RPM,ok
FAN 2 RPM,2625,RPM,ok
FAN 3 RPM,2700,RPM,ok
FAN 4 RPM,2700,RPM,ok
FAN 5 RPM,2700,RPM,ok
FAN 6 RPM,2700,RPM,ok
FAN 7 RPM,,,ns
FAN 8 RPM,,,ns
Presence,50h,ok,3.1,Present
Voici quelques commandes pour relever des compteurs "classiques"
=== Température ===
/usr/bin/ipmitool -c -I lanplus -H ip_address -U utilisateur -P passe sdr type "Temperature"
Temp | 01h | ns | 3.1 | Disabled
Temp | 02h | ns | 3.2 | Disabled
Temp | 05h | ns | 10.1 | Disabled
Temp | 06h | ns | 10.2 | Disabled
Ambient Temp | 08h | ok | 7.1 | 24 degrees C
CPU Temp Interf | 76h | ns | 7.1 | Disabled
=== Ventilateurs ===
/usr/bin/ipmitool -c -I lanplus -H ip_address -U utilisateur -P passe sdr type "Fan"
FAN 1 RPM | 30h | ok | 7.1 | 2400 RPM
FAN 2 RPM | 31h | ok | 7.1 | 2625 RPM
FAN 3 RPM | 32h | ok | 7.1 | 2550 RPM
FAN 4 RPM | 33h | ok | 7.1 | 2550 RPM
FAN 5 RPM | 34h | ok | 7.1 | 2475 RPM
FAN 6 RPM | 35h | ok | 7.1 | 2550 RPM
FAN 7 RPM | 36h | ns | 7.1 | Disabled
FAN 8 RPM | 37h | ns | 7.1 | Disabled
Fan Redundancy | 75h | ok | 7.1 | Fully Redundant
=== État RAID Disques ===
/usr/bin/ipmitool -c -I lanplus -H ip_address -U utilisateur -P passe sdr type "Drive Slot / Bay"
Drive | 80h | ok | 26.1 | Drive Present
==== Utilisation de sdr avec cache ====
Le problème de cette commande, surtout avec "list all" est son temps d'exécution qu'il est possible de grandement amélioré en utilisant les fonctions de cache disponibles comme ci-dessous.
Il faut d'abord générer un fichier de cache
/usr/bin/ipmitool -I lanplus -H ip_address -U utilisateur -P passe sdr dump ipmi.cache
ipmi.cache est le fichier de cache qui va être généré dans le répertoire où est appelé la commande (pwd).
Ce fichier permet alors d'accélérer toutes les requêtes suivantes comme le prouve ce petit tableau
^ Temp Exécution ^ Sans cache ^ Avec cache ^
| real | 0m7.325s | 0m1.598s |
| user | 0m0.020s | 0m0.016s |
| sys | 0m0.028s | 0m0.012s |
Il suffit maitenant d'ajouter l'option -s et le nom de fichier de cache à notre commande
/usr/bin/ipmitool -S ipmi.cache -I lanplus -H ip_address -U utilisateur -P passe
==== Utilisation de sdr comme simple utilisateur ====
Si vous ne précisez rien sur la ligne de commande, ipmitool se connecte toujours sur le serveur à requêter avec des privilèges d'administrateur, ce qui n'est pas souhaité pour juste relever des indicateurs. Il faut donc explicitement ajouter l'option -L USER pour se connecter comme tel.
/usr/bin/ipmitool -L USER -S ipmi.cache -I lanplus -H ip_address -U utilisateur -P passe
C'est tout pour le moment. Peut-être une suite à donner avec l'intégration à Nagios et l'écriture d'un plugin ?
==== Ecriture du plugin pour la température ====
Bon, je me lance pour l'écriture du plugin (en bash).
Pour pouvoir utiliser le plugin, il faut tout d'abord avoir créer un utilisateur de type "USER" comme dans la partie juste en dessus sur les serveurs à surveiller.
Aller sur votre serveur nagios et taper :
//**# vi /usr/local/nagios/libexec/check_temperature**//
#!/bin/bash
HOST2=$1
TempWarning=$2
TempCritical=$3
if [ $# -lt 3 ]
then echo "utilisation : ./check_temperature @IpHost TempWarning TempCritical"
exit 3
fi
AMBIENT1=`ipmitool -L USER -H $HOST2 -U utilisateur -Ppasse sensor get "Ambient Temp"`
AMBIENT2=`echo ${AMBIENT1} | awk '{print $(22)}'`
if [[ $AMBIENT2 -ge ${TempCritical} ]]
then echo "Temperature Critical = $AMBIENT2|Temperature = $AMBIENT2;${TempWarning};${TempCritical}"
exit 2
elif [[ ${AMBIENT2} -lt ${TempWarning} ]]
then echo "Temperature Ok = $AMBIENT2|Temperature = $AMBIENT2;${TempWarning};${TempCritical}"
exit 0
else echo "Temperature warning = $AMBIENT2|Temperature = $AMBIENT2;${TempWarning};${TempCritical}"
exit 1
fi
Voilà c'est terminé pour le plugin, c'est pas sorcier non ? :-)
==== Intégration à Nagios ====
Dans cette 3eme partie, il faut que nagios + pnp soient installés.
* Ajout de quelques lignes dans le commands.cfg :
//**# vi /usr/local/nagios/etc/objects/commands.cfg**//
define command{
command_name check_temperature
command_line $USER1$/check_temperature $HOSTADDRESS$ $ARG1$ $ARG2$
}
* Exemple d'un host avec le service check_temperature. Ajouter un host :
//**# vi /usr/local/nagios/etc/hosts.cfg**//
define host{
use linux-server
host_name serveur
alias serveur
address 192.168.0.1
}
define service{
use generic-service
host_name serveur
service_description Temperature Salle Systeme
check_command check_temperature!28!34
action_url /nagios/pnp/index.php?host=$HOSTNAME$&srv=$SERVICEDESC$
}
On reçoit une alerte de type Warning lorsque la température atteint 28° et de type Critical losrque la température atteint 34°. Voici un petit aperçu :
{{:supervision:ipmitemp.jpg|}}