Написание плагина под Opsview


После установки системы мониторинга opsviews, описанной в предыдущей статье, приступаем к написания плагина, который будет собирать важную информацию на удаленном хосте. После чего возьмемся за написание модуля opsviews, который будет обрабатывать информацию поступающею от плагина запущенного на удаленном хосте.

2 Написание плагина opsview(nagios)

Note: The Opsview unix agent package is based upon the NRPE daemon.
Хочу заметить, что плагин(скрипт) будет запускаться через NRPE демон, для которого нужно устанавливать дополнительно агента на каждом хосте.

2.1 Установка агента на хостовой машине

Для установки opsview-agent на ubuntu 12.04 можно использовать репозитории lucid (т.е. Ubuntu 10.04 repo):

sudo vim /etc/apt/sources.list
[...]
deb http://downloads.opsera.com/opsview-community/latest/apt lucid main
[...]
sudo apt-get update

* Сначала будет получено сообщение об ошибке:
W: GPG error: http://downloads.opsera.com lucid Release: The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY 327C70CD0FC6984B
Для фикса нужно сделать следующее:

sudo gpg --keyserver subkeys.pgp.net --recv-key 0FC6984B
sudo gpg --export --armor 0FC6984B

Далее копируем ключик, который видим на консоле:

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.11 (GNU/Linux)

mQENBE+RJcUBCACufp+mfI70ZUTPx9gaebIQEpg11OGp0y068gB5UZzhZ+hf8T9p
0YYUgRQ4qv8VL+YY+mvqLcoISkBLvYE7NQWm7xCmKCLpR3rdO/f2T0qS8s2Cl1V9
QV+MtZD9DvgWtwXSJDf9Ne6qgayyhdazMFTV/4pxMkkfRG2jYixDwx4RlgvJ0fgK
s9oS1REdXZ0LoNcwJ2eBqZljtXELUs38IYaoZNGAMzggTnfqxD0yV6NA87wxslpj
Ek5Zx1IsPf87odMnDshynb/rJG20SqouEFBeGGIZg9mR6/1n05ht2C7UmxFXw3am
w0eqAZ2Mv6gRQHrjeLy/N8a2/GCjN8iXW1D9ABEBAAG0T09wc3ZpZXcgUmVwb3Np
dG9yaWVzIChodHRwczovL2Rvd25sb2Fkcy5vcHN2aWV3LmNvbSkgPHJlcG9zaXRv
cmllc0BvcHN2aWV3LmNvbT6JATgEEwECACIFAk+RJcUCGwMGCwkIBwMCBhUIAgkK
CwQWAgMBAh4BAheAAAoJEDJ8cM0PxphLo40H/3Mi6zSWT2Gs6/R2tBr893zxATmh
Wp+VD9V9+i01dk5molEsetqwydj2IXIJWw3JIGODuRj8xzl8LW9vBNIxSOFtdml8
9VH5oEQdzsikLo69914PNRy5nXNMnH40weAkm5xCKH4a7qSWN37KIhHjS2ZDD89b
UzIT82eBDdAFbUodNxLR9WSHTKISiAeRUkHGfJU8d2YLZCfzCvFR7c1uwzr3XC6p
ORIK1yNu9dL3y2ZgjyTB2W1OR0XPGXCFOXOA5hIpGt4We1TcShEgOqpLzYYUlrmh
VePUcjAqoA20JWttT5xOsJnnZqEJRTknnBKbDzZUtSqekjLBnqIXEE4I8kW5AQ0E
T5ElxQEIAK65S8VDrha8j8H6zMLOSKT83mQf9fmouxzCtxqsfkjRik5/6ZRnYY6c
k4DPj+2nN4hJNKa2VQ9f1qQTQ1Q/8AEhA/ljg8a9E8neClUyCfOq0HQ9TKlFbQN/
gdvEOdspyWSEJxbFCX/IQy1kDhMf1DJRpUKUU1gJUOQiHsobM9FMX9jf4at+N9qD
i2N1tBlFK2v+T6du32Vfukxv56D+rozCr/EkJZmD6DT/enpQG6tK6+lhitmr1AgB
kLegV9RIJWSulu08RqpBgXNV7Hru8EI/MZWfdzuasiXA3I+umjXoch8wuF8I5R0P
GS25mit3DNs1o+6jV7TogsIv2PiC1ysAEQEAAYkBHwQYAQIACQUCT5ElxQIbDAAK
CRAyfHDND8aYS9xmCACQUNq33dBrNQz5ggXLXeOfwEgzrDAcd1TeTn7bDF5viXiW
EfoDw302jafYybtR4iojXC+r78EdEIPzPN21tUzN6o3HqZfgzDS0r7YBRsid/0x0
0Doc//ebZBJVMXe+MtzGYpkYQojSCYIS6WXdrRv/NRWlfMajqIkAliqggZFaRRuJ
L1tszaI0+2Ep1I7I8TRlmhvmd6S6w12HZtaQGBzv9ylI23m5LbSsLDYrZtIqeRBo
ucfnvywHuqgrgxgO+x8PRG7v7gfFT0QaJcWf6PwuxsqNsOq4UqZCRnfj3jg/aUoO
JE37AT9NT+b06NS5cSJVhWfky4fblE9bhPxjLDOZ
=HqD/
-----END PGP PUBLIC KEY BLOCK-----

Вставляем ключ после команды add и жмем дважды ctrl+d. Теперь опять обновляемся. Ошибка должна исчезнуть.

sudo apt-key add -
sudo apt-get update
sudo apt-get install opsview-agent

2.2 Установка/настройка скрипта (nagios plugin-а)

В данном случаи плагин имеет название check_mtr.sh. Его задача заключается в предоставлении среднего (average) значения пинга и трасировки пути от хоста к нужным серверам (сайтам). Т.е. показывает доступность веб-ресурса из разных серверов (в разных странах, регионах по разными провайдерами и дата-центрами). Напишу теперь как все это работает:

Теперь сделаем настройку плагина. Для этого подключаемся на удаленный хост и копируем скрипт в папку nrpe агента.

sudo cp check_mtr.sh /usr/local/nagios/libexec/nrpe_local
sudo chown nagios:nagios /usr/local/nagios/libexec/nrpe_local/check_mtr.sh
sudo cat /usr/local/nagios/libexec/nrpe_local/check_mtr.sh
#!/bin/bash

# Variables Warning, critical level and number of cycles to be made to remote host
LV_W=$1
LV_C=$2
NUMBER_OF_CYCLES=$3
GLOBAL_STATUS=0

# Explorer instruction
usage() {
	 echo -e "\nERROR!!!"
	 echo -e "Usage: $0 \"warning level\" \"critical level\" \"number of  cicles\" \"IP server 1\" \"IP server 2\" ...\n "
         echo -e "Example: $0 100 300 5 192.168.1.6 google.com 172.16.0.19\n"
         exit 1
}

# Check bc install
if ! type -p bc > /dev/null
	then
    	echo "Need to install bc program "
    exit 1
fi

# If args are numerical
check_number() {
if ! [[ $1 =~ ^[0-9]+$ ]]
	then
   	exec >&2
	echo "Error: argument $1 is not a number"
	usage
	exit 1
fi
}

check_number $1
check_number $2
check_number $3

# Check minimal amount of arguments
if [ $# -lt 4  ]
        then
		echo "Too few arguments!"
		usage
fi

# Check the diffrence between the critical and warning values
if (( ${LV_W} > ${LV_C}  ))
    then
        echo "Please adjust levels. The critical level must be higher than the warning level!"
        exit 666
    fi

# Mtr to listed IPs
while [ `expr $# - 3` -gt 0 ]
	do
	IP_ADDRESS=`mtr -n --report --report-cycles $NUMBER_OF_CYCLES  $4 | tail -1 | awk '{print $2;}'`
	AVERAGE=`mtr -n --report --report-cycles $NUMBER_OF_CYCLES $4 | tail -1 | awk '{print $6;}'`

	if [ ! -z "$LV_W" -a ! -z "$LV_C" ]
    		then
		#if [ ${AVERAGE_1} -ge ${LV_W} -a ${AVERAGE_1} -lt ${LV_C} ]
		if [ $(echo "${AVERAGE} >= ${LV_W}"|bc) -eq 1 -a $(echo "${AVERAGE} < ${LV_C}"|bc) -eq 1 ]         		then             		STATUS_INFO="WARNING - average mtr to $IP_ADDRESS is: $AVERAGE" 					PERFOR_DATE="$IP_ADDRESS=$AVERAGE"             		EXIT_STATUS=1 			 		#elif [ ${AVERAGE_1} -ge ${LV_C} ]         	elif [ $(echo "${AVERAGE} >= ${LV_C}"|bc) -eq 1 ]
       			then
            		STATUS_INFO="CRITICAL - average mtr to $IP_ADDRESS is: $AVERAGE"
                    PERFOR_DATE="$IP_ADDRESS=$AVERAGE"
					EXIT_STATUS=2
          		#  echo "exit status is: $ST_CR"
          		#  exit $ST_CR
        	else
				STATUS_INFO="OK - average mtr to $IP_ADDRESS is: $AVERAGE"
                PERFOR_DATE="$IP_ADDRESS=$AVERAGE"
				EXIT_STATUS=0

        	fi
   	else
        STATUS_INFO="OK - average mtr to $IP_ADDRESS is: $AVERAGE"
        PERFOR_DATE="$IP_ADDRESS=$AVERAGE"
        EXIT_STATUS=0

    	fi
STATUS_INFO_MAIN="$STATUS_INFO_MAIN $STATUS_INFO\n"
PERFOR_DATE_MAIN="$PERFOR_DATE_MAIN $PERFOR_DATE"
GLOBAL_STATUS=`expr $EXIT_STATUS + $GLOBAL_STATUS`

shift ;
done

echo "$STATUS_INFO_MAIN | $PERFOR_DATE_MAIN"
if (( $GLOBAL_STATUS > 0 ))
	then
	exit 1
else
	exit 0
fi

Далее плагину нужно добавить в конфиг nrpe.

sudo chmod +w /usr/local/nagios/etc/nrpe.cfg
sudo vim /usr/local/nagios/etc/nrpe.cfg
[...]
command[check_mtr.sh]=/usr/local/nagios/libexec/nrpe_local/check_mtr.sh $ARG1$
[...]
sudo chmod -w /usr/local/nagios/etc/nrpe.cfg
sudo /etc/init.d/opsview-agent restart

Теперь можно добавить наш сервис (plugin) на стороне сервера:
Переходим на Веб-морду нашего opsview сервера http://192.168.2.120

-H $HOSTADDRESS$ -c check_mtr.sh -t 1000 -a ‘100 200 5 127.0.01 ya.ru’

где,
-H — адрес хоста, на котором установлен плагин;
-с — название скрипта, который запускаем на в удаленном хосте;
-t — timeout in seconds на выполнение скрипта;
-а ‘’ — все, что в кавычках — это аргументы, которые принимает скрипт.

2.3 Тестируем

Тестировать сначала нужно локально на хосте, где находиться скрипт:

sh check_mtr.sh 100 150 5 ya.ru 8.8.8.8

OK - average mtr to www.yandex.ru is: 88.5
OK - average mtr to google-public-dns-a.googl is: 74.4

или

sh -x check_mtr.sh 100 150 5 ya.ru 8.8.8.8

Если локально все заработало — переходим на opsview-сервер і тестим с консоли.
Запускаем скрипт от юзера nagios.

su - nagios
cd /usr/local/nagios/libexec
check_nrpe -H 192.168.2.127 -c check_mtr.sh -a '100 150 5 ya.ru 8.8.8.8'

OK - average mtr to www.yandex.ru is: 73.7
OK - average mtr to google-public-dns-a.googl is: 76.2

2.4 Частые ошибки

Сообщение:
NRPE: Command timed out after 60 seconds
Фикс:
На стороне хоста в настройках nrpe добавить:

vim /usr/local/nagios/etc/nrpe.cfg
[...]
command_timeout=600
[...]

Сообщение:
NRPE: Script timed out after 60 seconds
На стороне сервера добавить:

vim /usr/local/nagios/etc/opsview.conf
$overrides = <<'EOF';
nagios_service_check_timeout=600
nagios_event_handler_timeout=600
EOF

Если должны рисоваться графики, но не рисуются:
Note: The service must run at least once an hour for the graph line to be produced. The RRDs are created with a default timeout of one hour, so if there are no results within an hour, the graph line will not be created.

su - nagios
cd /usr/local/nagios/var/rrd
rm -rf

Полезное:
http://docs.opsview.com/doku.php?id=opsview-core:smeserver&s[]=nrpe
https://docs.opsview.com/doku.php?id=opsview4.1:unix_customise_agent
http://www.opsview.com/forum/opsview-community-edition/how-do-i/backupexec-plugin-nagios
http://docs.opsview.com/doku.php?id=opsview-community:faq&s[]=graphs#performance_graph_combines_several_pieces_of_data_how_do_i_graph_individually
Исходники: check_mtr

Автор: admin, 18 ноября 2012
Рубрики: Системы мониторинга
Метки: , , ,

Написать комментарий

Последние статьи

Яндекс.Метрика
?>