Cisco Unified Communication Monitoring mit Icinga

Wo ein Cisco Unified Communication Manager (Callmanager) betrieben wird, ist der Wunsch dessen Services ins Monitoring einzubinden nicht weit.

Hier kommt jetzt ein zusätzliches Plugin fürs Icinga / Nagios zu Einsatz.

Zuerst brauchen wir das Bash-Script, welches die Checks über snmp-Abfragen durchführt.
/usr/lib/nagios/plugins/check_cisco_uc.sh

#!/bin/bash

# check_snmp_cisco_uc
# Description : Check Service status on cisco uc (Callmanager)
# Version : 0.1
# Author : Georg Gren
# Licence : GPLv2

# Commands
CMD_BASENAME="/usr/bin/basename"
CMD_SNMPGET="/usr/bin/snmpget"
CMD_SNMPWALK="/usr/bin/snmpwalk"
CMD_GREP="/bin/grep"
CMD_AWK="/usr/bin/awk"
CMD_EXPR="/usr/bin/expr"


# Script name
SCRIPTNAME=`$CMD_BASENAME $0`

# Version
VERSION="0.1"

# Plugin return codes
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3

#Service-states from cisco MIB
SERVICESTATE_1="running"
SERVICESTATE_2="runable, but waiting for CPU"
SERVICESTATE_3="runable, but waiting for event"
SERVICESTATE_4="exiting"
SERVICESTATE_5="other"

# Default OID
OID_NAME="1.3.6.1.2.1.54.1.1.1.1.3"
OID_STATUS="1.3.6.1.2.1.54.1.2.3.1.6"

# Default variables
DESCRIPTION="Unknown"
STATE=$STATE_UNKNOWN

# Default options
COMMUNITY="public"
HOSTNAME="127.0.0.1"
SERVICEID="3"

# Option processing
print_usage() {
	echo "Usage: ./check_cisco_uc.sh -H 10.60.100.1 -C verysecret -S 3"
	echo "  $SCRIPTNAME -H ADDRESS"
	echo "  $SCRIPTNAME -C STRING"
	echo "  $SCRIPTNAME -S Service-ID"
	echo "  $SCRIPTNAME -h"
	echo "  $SCRIPTNAME -v"
}

print_version() {
	echo $SCRIPTNAME version $VERSION
	echo ""
	echo "The nagios plugins come with ABSOLUTELY NO WARRANTY."
	echo "You may redistribute copies of the plugins under the terms of the GNU General Public License v2."
}

print_help() {
	print_version
	echo ""
	print_usage
	echo ""
	echo "-H ADDRESS"
	echo "   Name or IP address of host (default: 127.0.0.1)"
	echo "-C STRING"
	echo "   Community name for the host's SNMP agent (default: public)"
	echo "-S SERVICE-ID"
	echo "   Service-ID to check (default: 3 (Callmanager))"
	echo "-h"
	echo "   Print this help screen"
	echo "-V"
	echo "   Print version and license information"
	echo ""
	echo ""
	echo "This plugin uses the 'snmpget' command and 'snmpwalk' command included with the NET-SNMP package."
}

while getopts H:C:S:hv OPT
do
	case $OPT in
		H) HOSTNAME="$OPTARG" ;;
		C) COMMUNITY="$OPTARG" ;;
		S) SERVICEID="$OPTARG" ;;
		h)
			print_help
			exit $STATE_UNKNOWN
		;;
		v)
			print_version
			exit $STATE_UNKNOWN
		;;
		*) exit $STATE_UNKNOWN ;;

	esac
done

#get service-name + instances
SERVICE_NAME=$($CMD_SNMPGET -t 2 -r 2 -Ovq -v 2c -c $COMMUNITY $HOSTNAME ${OID_NAME}.${SERVICEID})
SERVICE_STATUS=($($CMD_SNMPWALK -t 2 -r 2 -Ovq -v 2c -c $COMMUNITY $HOSTNAME ${OID_STATUS}.${SERVICEID}))

# check SERVICE_STATUS is not numeric
if ! [[ "$SERVICE_STATUS" =~ ^[0-9]+$ ]]; then
	#set error description
	DESCRIPTION=$SERVICE_NAME": "${SERVICE_STATUS[*]}
	STATE=$STATE_CRITICAL
else
	#arange  values
	SERVICE_STATUS_MAX=$( printf "%d\n" "${SERVICE_STATUS[@]}" | sort -n | tail -1 )
	SERVICE_STATUS_SIZE=${#SERVICE_STATUS[@]}

	#
	eval SERVICESTATE=\$SERVICESTATE_${SERVICE_STATUS_MAX}
	DESCRIPTION="${SERVICE_NAME} - instances: ${SERVICE_STATUS_SIZE} - ${SERVICE_STATUS_MAX}: ${SERVICESTATE}"

	case $SERVICE_STATUS_MAX in
	[1-3])
		STATE=$STATE_OK
		;;
	[4-5])
		STATE=$STATE_WARNING
		;;
	*)
		STATE=$STATE_UNKNOWN
	esac;
fi

echo $DESCRIPTION
exit $STATE

Welche Argumente benötigt werden, erfährt man mittels ./check_cisco_uc.sh -h

Nicht vergessen das Script ausführbahr zu  machen:

chmod +x ./check_cisco_uc.sh

Aktuell wird nur snmp v1 + v2c unterstützt, später vielleicht auch mal snmp v3.

Testen kann man die Funktion:

user@icinga:/home/user# /usr/lib/nagios/plugins/check_cisco_uc.sh -H 172.16.33.30 -C verysecret -S 3
"Cisco CallManager" - instances: 1 - 2: runable, but waiting for CPU

Danach definieren wir das entsprechende Icinga-Command:
/etc/nagios-plugins/config/snmp_cucm.cfg

define command{
        command_name    check_snmp_cucm
        command_line    $USER1$/check_cisco_uc.sh -H '$HOSTADDRESS$' -C verysecret -S $ARG1$
        }

Jetzt müssen wir den Check noch in unser Monitoring einbauen (Hier gehts nur um die CUCM-Services, nicht um die generelle Einrichtung der Icinga-Hosts). Dazu legen wir exemplarisch den Host an.
/etc/icinga/objects/cucm.cfg

define host{
        use                     generic-host
        host_name               cucm
        alias                   Cisco Callmanager
        address                 172.16.33.30
        }
define service {
        service_description             CallManager
        check_command                   check_snmp_cucm! 3
        use                             generic-service
        host_name                       cucm12
        notification_interval           0 ; set > 0 if you want to be renotified
        }

Der Parameter der über check_command mit check_snmp_cucm! übergeben wird stellt den jeweiligen CUCM-Service dar.
Den ermitteln wir über einen snmpwalk oder auch snmpbulkwalk:
 

user@icinga:/home/user# snmpbulkwalk -v2c -c verysecret 172.16.33.30 1.3.6.1.2.1.54.1.1.1.1.3
iso.3.6.1.2.1.54.1.1.1.1.3.1 = STRING: "Cisco Serviceability Reporter"
iso.3.6.1.2.1.54.1.1.1.1.3.2 = STRING: "Cisco DirSync"
iso.3.6.1.2.1.54.1.1.1.1.3.3 = STRING: "Cisco CallManager"
iso.3.6.1.2.1.54.1.1.1.1.3.4 = STRING: "Cisco IP Voice Media Streaming App"
iso.3.6.1.2.1.54.1.1.1.1.3.5 = STRING: "Cisco CTIManager"

Die letzte Stelle der abgerufenen OID, ist die einzutragende CUCM-Service-ID. Bei mir im Beispiel "Cisco CallManager" = 3.

Welche Services auf der jeweiligen Installation laufen muss man nur selber raus suchen.
Das Ergenis im Icinga sieht dann so aus:

 

Neuen Kommentar schreiben

Plain text

  • Keine HTML-Tags erlaubt.
  • Internet- und E-Mail-Adressen werden automatisch umgewandelt.
  • HTML - Zeilenumbrüche und Absätze werden automatisch erzeugt.