После установки системы мониторинга 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) значения пинга и трасировки пути от хоста к нужным серверам (сайтам). Т.е. показывает доступность веб-ресурса из разных серверов (в разных странах, регионах по разными провайдерами и дата-центрами). Напишу теперь как все это работает:
- Opsview-server дает команду удаленной ноде (хосту) запустить скрипт
- Удаленный хост получает запрос (через NRPE demon сервера к NRPE agent-у хоста) и, если все ок, запускает скрипт (плагин)
- Локальный оpsview-agent, после запуска скрипта передает результат выполнения на opsview-server
- На сервере nrpe-demon получает этот вывод и записывает его в базу данных и выводит на веб-морду
Теперь сделаем настройку плагина. Для этого подключаемся на удаленный хост и копируем скрипт в папку 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
- Configuration -> Service Checks -> New Service Check (Плюсик)
- Записать Check Name and Description
- Выбрать plugin check_nrpe
- Вставить аргументы для плагина. В данном случаи:
-H $HOSTADDRESS$ -c check_mtr.sh -t 1000 -a ‘100 200 5 127.0.01 ya.ru’
где,
-H — адрес хоста, на котором установлен плагин;
-с — название скрипта, который запускаем на в удаленном хосте;
-t — timeout in seconds на выполнение скрипта;
-а ‘’ — все, что в кавычках — это аргументы, которые принимает скрипт.
- Сохраняем все
- Заходим в Configuration -> Hosts -> Edit <нужные хост> -> Вкладка Monitors -> Ищем наш плагин и добавляем нужные аргументы
- Приминяем все изменения -> заходим в Server -> Status and reload -> Reload Configuration
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