Überwachung von Softwareraids

Posted: 22nd August 2012 by marcel in OpenNMS, Serveradministration
Tags: , ,

Zusatz: Hiermit sieht wohl alles anders aus. Wenn ich Zeit habe, teste ich das. http://www.opennms.org/wiki/Linux_Mdadm_monitoring_thru_snmp

Leider bietet mdadm kein Support für snmpd. Allerdings gibt es verschiedene Ansätze eine Überwachung mit Linux Boardmitteln und OpenNMS einzurichten.

Spontan sind mir eingefallen:

  • mdadm kann Emails schicken
    Aber ich persönlich mag es nicht von allen möglichen Systemen Emails zu bekommen.
  • mdadm kann auch Syslog
    Aber ich will kein syslog-ng mit OpenNMS nutzen, da ich a) schon einen rsyslog Server im Lan habe für reines Logging und b) keine Ahnung habe, wie ich das alles unter einen Hut bekommen soll
  • Mit einem Script dass der snmpd ausführt
    An sich die schönste Methode wie ich finde, da man hier nicht viel am zu überwachenden Host einstellen muss. Allerdings hatte ich dabei auf Anhieb keine Möglichkeit gefunden, bestimmte Daten mit an OpenNMS zu übermitteln. Z.B. solche Infos wie: /dev/md0 oder [UU_U] falls jemand dazu eine Idee hat: Immer her damit! Als Basis dazu diente mir das hier: http://www.opennms.org/wiki/Net-snmp_extend_collections
  • per send-event.pl Script
    Und um diese Variante geht es hier heute.
  • Als erstes muss der NMS wissen auf welcher Schnittstelle er lauschen muss. Zu ändern wäre hier die TCPAddress (auf die IP des NMS).

    /etc/opennms/eventd-configuration.xml

    <EventdConfiguration
           TCPAddress="0.0.0.0"
           TCPPort="5817"
           UDPAddress="0.0.0.0"
           UDPPort="5817"
           receivers="5"
           getNextEventID="SELECT nextval('eventsNxtId')"
           socketSoTimeoutRequired="yes"
           socketSoTimeoutPeriod="3000">
    </EventdConfiguration>

    (0.0.0.0 bedeutet, dass sowohl localhost als auch die externe IP akzeptiert wird)

    Dann muss man dieses Script auf dem zu überwachenden Host erstellen. Das send-event.pl Script muss natürlich dort bereitgestellt werden. Dieses findet man unter [/usr/share|/opt]/opennms/bin/send-event.pl auf dem NMS.

    # checkRaidStatus.sh
    #!/bin/bash
    #Pfad zum send-event Script
    SEND_EVENT=/usr/share/opennms/bin/send-event.pl
    # DIE UEI zum Event
    ONMS_UEI_OK=uei.opennms.org/custom/opennms/softraidError
    # Die Node ID
    ONMS_NODEID=NODEID
    # Das Interface
    ONMS_IF=NODEIP
    # Der NMS Server
    ONMS_IP=IP:5817

    [ -e /proc/mdstat ] || exit 0
    mdstat=`cat /proc/mdstat`
    mount=`mount | grep '\/dev\/md'`
    df=`df -h | grep '\/dev\/md'`

    if echo "$mdstat" | grep -q '\(F\)'; then
    ${SEND_EVENT} ${ONMS_UEI_OK} ${ONMS_IP} -n ${ONMS_NODEID} -i ${ONMS_IF} -x 6 -p "mdstat $mdstat" -p "df $df" -p "mount $mount"
    else
    fi

    Wie unschwer zu erkennen ist, muss man noch die NodeID, NodeIP und die IP des NMS-Servers definieren.
    Das Event enthält eine Ausgabe von mount, df und mdstat.

    Das Script muss regelmäßig per cron auf dem Host ausgeführt werden.
    Als root:

    crontab -e
    30       *      *       *       *       /jobs/checkRaidStatus.sh

    Im OpenNMS muss ein Eventfile angelegt werden.

    Z.B.:
    /etc/opennms/events/softraid.events.xml

    <events>
        <event>
            <uei>uei.opennms.org/custom/opennms/softraidError</uei>
            <event-label>User defined Trap: mdadm RAID failure</event-label>
            <descr>Some disks in your RAID arrays seem to have failed!</descr>
            <logmsg dest="logndisplay">%parm[all]%.</logmsg>
            <severity>Major</severity>
        </event>
    </events>

    In /etc/opennms/eventconf muss man diese Events noch hinzufügen:

    <event-file>events/softraid.events.xml</event-file>

    So! Nun nur noch eine Notification:

    <notification name="SoftwareRaidFehler" status="on" writeable="yes">
     <uei>uei.opennms.org/custom/opennms/softraidError</uei>
     <description>Überwachung mdadm Raids</description>
     <rule>(IPADDR IPLIKE *.*.*.*)</rule>
     <destinationPath>administratoren</destinationPath>
     <text-message>Raidstatus:&#xd;
     %parm[mdstat]%&#xd;
     &#xd;
     Mountpoints:&#xd;
     %parm[mount]%&#xd;
     &#xd;
     Belegung:&#xd;
     %parm[df]%&#xd;
     &#xd;
     </text-message>
     <subject>Notice #%noticeid%: Raid failure on %nodelabel%</subject>
            <numeric-message>111-%noticeid%</numeric-message>
        </notification>