Monitoring des températures via Zabbix

Le paquet d'intégration de l'agent Zabbix sur l'iPasserelle (smeserver-zabbix-agent) contient presque tout ce qu'il faut. Seulement, le monitoring des températures varie d'une machine à l'autre, il n'est pas possible de tout détecter via les templates. Le script utilisé par l'agent pour remonté les températures est /var/lib/zabbix/bin/sensors. C'est un script bash très simple, et facilement extensible pour s'adapter à n'importe quel senseur accessible sur l'hôte concerné (ipmi, lm_sensors, smart). Il peut être modifié sans crainte: il ne sera pas écrasé par les mises à jour.

Ce script prend en paramètre une clef (variable $KEY) (mb, ambiant, cpu0, hda etc...). Cette clef représente l'élément à monitorer. Un switch case permet de lancer des commandes simples à partir de la clefs. par exemple, si la clef commence par hd ou sd, on considère qu'il s'agit d'un disque dur, et l'action qui correspond sera donc

/usr/sbin/smartctl -a /dev/$KEY | grep Temperature_Celsius | awk '{print $10}'

Le retour de ces commandes doit être une valeur numérique (float accepté) ou la chaine 'ZBX_UNSUPORTED' (indiquant au serveur que la fonction souhaité n'est pas supporté)

Ainsi, il est possible de remonter n'importe quelle valeur accessible depuis un enchainement de commandes bash.

Par exemple, si l'on utilise lm_sensors, et que la température du CPU est reportée avec le tag 'temp1', quelque chose comme:

/usr/bin/sensors | grep temp1 | cut -d':' -f 2 | awk '{print $1'} | sed -e "s/+//g" -e "s/.C//g"

Devrait fonctionner

Ou encore via IPMI (pour les machines types serveurs, lm_sensors n'est pas toujours supporté, mais IPMI renvoi des informations sur les senseurs)

ipmitool sdr get 'P1 Therm Margin' | grep 'Sensor Reading' | cut -d':' -f 2 | awk '{print$1}'

Côté agent zabbix, la ligne qui permet d'appeler ce script est:

UserParameter=sensors[*],/usr/bin/sudo /var/lib/zabbix/bin/sensors $1

Une ligne dans le fichier sudoers autorise l'utilisateur zabbix à lancer ce script avec des droits root sans mot de passe car la lecture des senseurs est généralement réservé à l'utilisateur root. Attention donc à ce que vous mettez dans ce script: tout est exécuté en tant que root.

Il suffit ensuite d'ajouter de nouveaux items pour la machine, de type numeric (float) sensors[hda]

À partir de ces valeurs, on pourra créer des graphs bien sûre, mais également des triggers assez complexes.

Exemple d'expression de trigger:

({TRIGGER.VALUE}=0 & ({machine:sensors[cpu1].last(0)}>-45 | {machine:sensors[cpu0].last(0)}>-45 | {machine:sensors[ambient].last(0)}>24)) | ({TRIGGER.VALUE}=1 & ({machine:sensors[cpu1].last(0)}>-50 | {machine:sensors[cpu0].last(0)}>-50 | {machine:sensors[ambient].last(0)}>23))