HP ILO - Temperatur -> Cacti

Auf dem ILO-Interface von HP-Servern (hier im Beispiel waren das ProLiant DL380 G5) kann man als Sensorwert diverse Temperaturwerte abfragen.

Dieses Script macht das (mit SSH 1)) und bereitet die Daten so auf, dass man sie als Data Input Methode für Cacti verwenden kann.

#!/usr/bin/env python
"""
Cacti-Input-Script (you can use this also without cacti)

Usage:
hpilo-hw1-tempstatus-cacti.py server1.ilo.example.com

Typical Output:
IOBoardZone_Celsius:39 AmbientZone_Celsius:15 CPU1_Celsius:31 PowerSupplyZone_Celsius:42 CPU2_Celsius:31

Prerequisites:
you can log in to the HP-ILO Interface with SSH
ilouser on the ILO
attached SSH-Key to that user
-> the user running cacti poller.php can use this + the script

http://www.unixwitch.de, Hella Breitkopf, 2009-08-11
"""

import os
import sys
import re


sshuser="ilouser"
keyfile="/home/ilouser/.ssh/ilo_id_dsa"

def sshcmderr(server,cmd):
    """sshcmd(server,cmd) -> string
    connect via ssh to server,
    do command cmd on that server,
    return output and error in tupple
    """
    cmdsum= "ssh -o ConnectTimeout=9 -i %s %s@%s '%s'" % (keyfile,sshuser,server,cmd)
    myin,myout,myerr=os.popen3(cmdsum)
    txt=myout.read(99999)
    myerror=myerr.read(99999)
    return(txt,myerror)


if __name__ == '__main__':

    scriptname=sys.argv[0]
    zielserverliste=sys.argv[1:]

    # depending on Hardware you might ask different Sensors
    # this is for HP ProLiant DL380 G5

    query="""
    show system1/sensor3\n\r
    show system1/sensor4\n\r
    show system1/sensor5\n\r
    show system1/sensor7\n\r
    show system1/sensor8\n\r
    """

    for zielserver in zielserverliste:
        ausgabezeile=""
        sshausgabe,fehler=sshcmderr(zielserver,query)

        if len(fehler)>0:
            sys.exit(fehler)

        sensorliste=re.findall("(ElementName=.*\r\n.*\r\n.*\r\n.*)\r\n",sshausgabe)
        for sensor in sensorliste:
            try:
                # von  "ElementName=I/O Board Zone" -> IOBoard
                bezeichnung=sensor.splitlines()[0].split('=')[1]
                bezeichnung=re.sub('[^\w]','',bezeichnung)
                einheit=sensor.splitlines()[2].split('=')[1]
                wert=sensor.splitlines()[3].split('=')[1]
            except:
                continue
            ausgabezeile="%s %s_%s:%s" % (ausgabezeile,bezeichnung,einheit,wert)

        ausgabezeile=ausgabezeile.strip()
        print ausgabezeile

Links

siehe auch: python Spickzettel


gilt für alle Tipps, Tricks & Spickzettel:
dies sind einfache, teils banale Notizen für meinen persönlichen Gebrauch, die hier eher zufällig auch öffentlich lesbar sind (vielleicht hilft es ja jemandem weiter). Verwendung auf eigene Gefahr :!:

Fehler-Hinweise, Dankesschreiben :-), etc. bitte an: web.1105@unixwitch.de

weitere Tools / Spickzettel

1) Die XML-Push-Methode dauerte bei mir tatsächlich langsamer
 
de/sysadmin/tools/hpilo-temperatur-cacti-input-script.txt · Last modified: 2009-08-12 by hella
Valid XHTML 1.0 Valid CSS German Unix User Group