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 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 1) 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).
Les commandes disponibles via IPMI
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é.
Il existe un grand nombre de sondes matériels 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.
La sortie de “sdr list all” est la plus complète qui soit et vous pouvez en voir un exemple avec ce 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 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”
/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
/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
/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
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
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 ?
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 ?
Dans cette 3eme partie, il faut que nagios + pnp soient installés.
# vi /usr/local/nagios/etc/objects/commands.cfg
define command{
command_name check_temperature
command_line $USER1$/check_temperature $HOSTADDRESS$ $ARG1$ $ARG2$
}
# 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 :