Заменяем ping в Nagios сканером Nmap
Материал из База знаний Linux.ру
Бывают в жизни такие ситуации, когда сисадминам подстраиваться под новые правила. Одна из таких ситуаций, когда блокирется прохождение ICMP-пакетов, которые необходимы для работы команды ping. Это сильно усложняет жизнь тем, кто использует программы вроде Nagios, чтобы проверить работает ли сервер. Но тем не менее, ничто не мешает нам использовать для этих целей сканер портов nmap и написать скрипт, чтобы использовать его вместе с системой мониторинга Nagios.
Для начала, разберёмся в синтаксисе. Nmap имеет инструмент для быстрой проверки ответов от сервера:
nmap -sP 192.168.1.6
Теперь изучим получившийся вывод:
Starting Nmap 5.30BETA1 ( http://nmap.org ) at 2010-06-28 14:13 EDT Nmap scan report for argos (192.168.1.6) Host is up (0.000073s latency). Nmap done: 1 IP address (1 host up) scanned in 0.00 seconds
А теперь, обратная ситуация:
nmap -sP 192.168.1.200
Starting Nmap 5.30BETA1 ( http://nmap.org ) at 2010-06-28 14:15 EDT
Note: Host seems down. If it is really up, but blocking our ping \
probes, try -Pn
Nmap done: 1 IP address (0 hosts up) scanned in 3.01 seconds
Понятное дело, что использовать мы будем вывод получившийся из первого примера. Алгоритм простой - сканируем хост, если всё хорошо, то ничего не будет. Если получим 0, то сработает сигнал тревоги.
Теперь настало время для написания сценария. Для начала, мы его сделаем максимально простым:
#!/bin/sh /usr/local/bin/nmap -sP $1 | grep "Host seems down" if [ "$?" -eq 0 ]; then echo "NMAP PING: CRITICAL" exit 2 fi echo "NMAP PING: OK" exit 0
Сценарий получился крайне простым и не учитывает ряда ситуаций. Давайте перепишем его так, чтобы он мог обрабатывать неизвестные ему ситуации. Также потребуется где-то складывать результаты проведённой проверки, чтобы мы потом могли из посмотреть. Для этих целей у нас будет использоваться некий промежуточный файл:
#!/bin/sh NMAP="/usr/local/bin/nmap -sP" TMP=/var/tmp/nmap_ping.$$ CHECK="Nmap Ping" $NMAP $1 > $TMP grep "Host seems down" $TMP if [ "$?" -eq 0 ]; then rm -f $TMP echo "$CHECK: CRITICAL" exit 2 fi grep "Host is up" $TMP if [ "$?" -eq 0 ]; then rm -f $TMP echo "$CHECK: Ok" exit 0 fi rm -f $TMP echo "$CHECK: UNKNOWN" exit 3
Ну вот, теперь скрипт делает всё что нам надо. Но осталась ещё пара проблем. Во-первых: куда девать временный файл после того, как он отработает и надо будет запустить этот же сценарий снова? Во-вторых: а что если nmap не запустится? По идее, сценарий должен обрабатать такую ситуацию как неизвестную, но всё же будет лучше подобные случаи предусмотреть заранее. Похоже, нет смысла писать отдельную подпрограмму, которая будет удалять результаты старой проверки. Вместо этого, мы перехватим код ошибки и используем его в качестве аргумента в скрипте:
results_exit()
{
retval=$1
msg=$2
rm -f $TMP
echo "$CHECK ${msg}"
return $retval
}
Теперь решим проблему когда не запускается nmap:
#!/bin/sh
NMAP="/usr/local/bin/nmap -sP"
TMP=/var/tmp/nmap_ping.$$
CHECK="Nmap Ping"
results_exit()
{
retval=$1
msg=$2
rm -f $TMP
echo "$CHECK ${msg}"
return $retval
}
$NMAP $1 > $TMP ||
results_exit 255 "Could not execute $NMAP"
grep "Host seems down" $TMP
if [ "$?" -eq 0 ]; then
results_exit 2 "CRITICAL"
fi
grep "Host is up" $TMP
if [ "$?" -eq 0 ]; then
results_exit 0 "Ok"
fi
results_exit 3 "Unknown"
Ну вот, теперь замена стандартной пинговалке почти готова. Для полной ясности давайте поглядим получившийся вариант и слегка его подчистим для лучшего понимания:
#!/bin/sh
NMAP="/usr/local/bin/nmap -sP"
TMP=/var/tmp/nmap_ping.$$
CHECK="Nmap Ping"
results_exit()
{
rm -f $TMP
echo "$CHECK: ${2}"
return $1
}
$NMAP $1 > $TMP || results_exit 255 "Could not execute $NMAP"
grep "Host seems down" $TMP
[ $? -eq 0 ] && results_exit 2 "CRITICAL"
grep "Host is up" $TMP
[ $? -eq 0 ] && results_exit 0 "Ok"
results_exit 3 "Unknown"
Теперь настало время заменить стандартную проверку в Nagios на тот вариант, что мы придумали. Берём пример скрипта из /usr/local/nagios/local/, и файл с определениями /usr/local/nagios/etc/objects/commands.cfg. Стандартный файл с определениями выглядит так:
# 'check-host-alive' command definition
define command{
command_name check-host-alive
command_line $USER1$/check_ping -H $HOSTADDRESS$\
-w 3000.0,80% -c 5000.0,100% -p 5
}
Теперь закомментируем старый вариант текста и заменяем его нашим:
# 'check0host-alive' command definition
define command{
command_name check-host-alive
command_line /usr/local/nagios/local/nmap_ping \
$HOSTADDRESS$
}
# 'check-host-alive' command definition
#define command{
# command_name check-host-alive
# command_line $USER1$/check_ping -H \
# $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5
# }
Разумеется, есть и другие способы сделать аналогичное. Tckb cxbnfnm, что на сервере скрипты по умолчанию лежат в каталоге /usr/local/nagios/local, то можно будет использовать их, вместо того, чтобы прописывать пути напрямую в макросы $USERxx$, можно воспользоваться их заменой.
Макросы для $USER$ находятся в файле /usr/local/nagios/etc/resource.cfg. В той версии Nagios, которая использовалась для написания этой статьи, можно найти 32 готовых макроса для $USERxx$.
Например, воспользуемся 6-м макросом и поместим его в resource.cfg:
# Set $USER6$ to our local script directory $USER6$=/usr/local/nagios/local
Теперь давайте отредактируем файл commands.cfg, чтобы его было легче понимать:
# 'check-host-alive' command definition
define command{
command_name check-host-alive
command_line $USER6$/nmap_ping $HOSTADDRESS$
}
Таким образом мы убедились, что Nagios сам по себе отличное решение для мониторинга, и позволяет организовать вмешательство в его компоненты в нужных случаях, чтобы достичь желаемого результата. А сам nmap является не только замечательным инструментом для изучения сетей, но и имеет некоторые возможности для наблюдения за ними.
Оригинал статьи находится здесь.
Перевод: Буданов Евгений aka r0g3r
