Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Решение административных задач в Linux

SNMP-мониторинг с помощью Nagios

Оригинал: SNMP Monitoring with Nagios
Автор: Jason Ellison
Дата: 1 июня 2009
Перевод: Александр Тарасов aka oioki
Дата перевода: 16 сентября 2009

Nagios - это платформа мониторинга сетей и систем уровня предприятия. Nagios появился в 2002 году и его можно считать стабильным. Его взяли на вооружение такие компании как American Public Media, JP Morgan Chase и Yahoo. Nagios производит проверки служб и хостов с помощью внешних программ, называемых модулями Nagios.

SNMP (Simple Network Management Protocol, дословно Простой Протокол Управления Сетью) - сетевой протокол, разработанный для мониторинга сетевых устройств. Для определения информации, над которой ведется наблюдения (известна как MIB, Management Information Base, База Информации Управления) используются идентификаторы объектов (OID, Object IDentifiers). Эта модель расширяема, поэтому производители могут определять свои собственные элементы мониторинга.

Система OpenManage предоставляется вместе с серверами Dell и очень хорошо документирована (см. раздел Источники информации), что предоставляет широкие возможности по администрированию сервера. OpenManage работает как в Linux, так и в Windows. "Справочник SNMP" ("SNMP Reference Guide", опять же см. Источники информации) системы OpenManage - это состоящий из 732 страниц документ, "предназначенный для системных администраторов, сетевых администраторов и всех тех, кто желает написать SNMP MIB приложения для мониторинга систем". "Справочник SNMP" описывает OID/MIB для мониторинга серверов Dell.

Система, описанная в данной статье, реализована в местной коммунальной компании вместе с переходом на сервера Dell Power Edge. Как правило, из коробки Nagios делает не то, что нужно компании, но так как это проект с открытыми исходниками, то достаточно легко приспособить его под свои нужды. Все, что нам нужно - это модуль Nagios, который бы следил за нашими новыми серверами.

Не надо изобретать велосипед

Во-первых, нужно найти существующий модуль Nagios, который имел бы схожую функциональность. Есть множество различных модулей. Менее чем за час я нашел модуль check_snmp_temperature.pl, написанный Уильямом Лейбзоном (William Leibzon). Этот модуль удаленно по SNMP следит за температурой различных устройств. Наблюдение за температурами не является нашей задачей, но здесь нас интересует получение информации по SNMP и ее передача системе Nagios. Модуль написан на языке Perl, и после беглого просмотра я понял, что стиль написания кода достаточно хорош.

Четвертая глава "Справочника SNMP" носит название "System State Group" ("Группа «Системное состояние»"). Вот что там написано:

Переменные Management Information Base (MIB), представленные в этом разделе, позволяют наблюдать за различными атрибутами, описывающими состояние критических компонентов вашей системы. В группе System State наблюдаются такие компоненты, как источники питания, шнуры питания переменного тока, переключатели переменного тока и устройства охлаждения, а также датчики температуры, скоростей вращения вентиляторов, значений силы тока и напряжения.

Соответствующие OID предоставляют общее состояние всех критических подсистем, которые нас интересуют. Существуют и другие OID, которые несут в себе более подробные сведения, но в нашей ситуации требуется послать сигнал тревоги, когда у сервера будут проблемы, с указанием, в какой конкретно подсистеме имеется проблема. Одна подсистема не упоминается в главе "System State Group" - это подсистема RAID. Однако для него есть соответствующий OID, который описан в главе 23 "Storage Management Group" ("Группа «Управление хранилищами»").

Как упоминалось выше, эти OID используются для определения MIB, которые могут быть запрошены по SNMP. На сервере Dell работает SNMP-сервер. Он отвечает на запросы, имеющие вид длинных числовых строк (это и есть OID). Эта строка чисел интерпретируется SNMP-сервером как конкретный вопрос. К примеру, если вы хотите спросить у SNMP-сервера: "Как у тебя с источниками питания?", вам нужно послать OID .1.3.6.1.4.1.674.10892.1.200.10.1.9.1 (см. рисунок 1). Тогда SNMP-сервер ответит, что с ними все в порядке (3).


Рисунок 1. Пример SNMP-запроса

В таблице 1 записаны интересующие нас OID.

Имя Object ID Описание
systemStateChassisStatus 1.3.6.1.4.1.674.10892.1.200.10.1.4 Определяет системное состояние этого корпуса.
systemStatePowerSupplyStatusCombined 1.3.6.1.4.1.674.10892.1.200.10.1.9 Определяет состояние всех источников питания этого корпуса.
systemStateVoltageStatusCombined 1.3.6.1.4.1.674.10892.1.200.10.1.12 Определяет состояние всех датчиков напряжения этого корпуса.
systemStateCoolingDeviceStatusCombined 1.3.6.1.4.1.674.10892.1.200.10.1.21 Определяет состояние всех устройств охлаждения в этом корпусе. Результат возвращается в виде значения - комбинированного статуса. Значение обладает тем же типом, что и DellStatus.
systemStateTemperatureStatusCombined 1.3.6.1.4.1.674.10892.1.200.10.1.24 Определяет состояние всех температурных датчиков в этом корпусе. Результат возвращается в виде комбинированного статуса. Значение обладает типом DellStatus.
systemStateMemoryDeviceStatusCombined 1.3.6.1.4.1.674.10892.1.200.10.1.27 Определяет состояние всех устройств памяти этого корпуса.
systemStateChassisIntrusionStatusCombined 1.3.6.1.4.1.674.10892.1.200.10.1.30 Определяет состояние вторжения всех устройств обнаружения вторжений в этом корпусе. Результат возвращается в виде комбинированного статуса. Значение обладает типом DellStatus.
systemStateEventLogStatus 1.3.6.1.4.1.674.10892.1.200.10.1.41 Определяет общее состояние журнала событий этого корпуса (ESM).
agentGlobalSystemStatus 1.3.6.1.4.1.674.10893.1.20.110.13 Сведения об общем "здоровье" подсистемы, управляемой программным обеспечением Storage Management. Это глобальное состояние должно использоваться приложениями, отличными от HP OpenView. HP OpenView должен обращаться к globalStatus на корневом уровне группы объектов. Это сводные данные всего агента, включающие все наблюдаемые устройства. Состояние предназначено для передачи инициативы SNMP-монитору по получению дополнительных данных. Когда это состояние ненормально - нужно получать дополнительные данные.

Одним из преимуществ выбора именно такого набора OID - это то, что ответы на эти запросы приходят в одинаковом формате. В документации Dell этот формат именуется DellStatus, он отображает целые числа на состояния подсистем следующим образом:

Имя переменной:          DellStatus
Тип данных:              Integer
Возможные значения       Смысл этого значения
  other(1)               Состояние объекта не является одним из нижеследующих:
  unknown(2)             Состояние объекта неизвестно.
  ok(3)                  Состояние объекта нормально.
  nonCritical(4)         Предупреждение, объект пока еще не в критическом состоянии.
  critical(5)            Объект в критическом состоянии (отказ).
  nonRecoverable(6)      Объект в невосстановимом состоянии (умер).

Теперь мы определили параметры, за которыми будем следить, пришла пора модифицировать скрипт check_snmp_temperature.pl под свои нужды. Итоговый скрипт check_dell_openmanager.0.7-test.pl слишком велик, чтобы показывать его в статье, поэтому я разместил его на FTP-сервере Linux Journal (см. в конце статьи Источники информации).

Проверяем

Нужно протестировать получившийся скрипт. Но у меня не было под рукой лишнего сервера Dell Power Edge, поэтому я решил проверить его работоспособность другим способом. Прочитав man-страницу по snmpd.conf, я понял, что можно воспользоваться внешними программами, которые отвечают на определенные OID с помощью "сквозных" скриптов. Bash-скрипт, приведенный ниже как раз является таким сквозным проверочным скриптом. Я назвал его dell_open_manager_test.sh. С помощью этого скрипта мы можем симулировать все состояния, которые может возвращать сервер Dell:

#!/bin/bash
#
# bash-скрипт, симулирующий работающий SNMP-агент Dell OpenManage
# Работает с демоном Net-SNMP. infotek@gmail.com
#

REQUEST_OID="$2"

echo "$REQUEST_OID"; case "$REQUEST_OID" in .1.3.6.1.4.1.674.10892.1.200.10.1.4.1) echo "integer"; echo "3"; exit 0 ;; .1.3.6.1.4.1.674.10892.1.200.10.1.9.1) echo "integer"; echo "5"; exit 0 ;; .1.3.6.1.4.1.674.10892.1.200.10.1.12.1) echo "integer"; echo "3"; exit 0 ;; .1.3.6.1.4.1.674.10892.1.200.10.1.21.1) echo "integer"; echo "4"; exit 0 ;; .1.3.6.1.4.1.674.10892.1.200.10.1.24.1) echo "integer"; echo "3"; exit 0 ;; .1.3.6.1.4.1.674.10892.1.200.10.1.27.1) echo "integer"; echo "3"; exit 0 ;; .1.3.6.1.4.1.674.10892.1.200.10.1.30.1) echo "integer"; echo "3"; exit 0 ;; .1.3.6.1.4.1.674.10892.1.200.10.1.41.1) echo "integer"; echo "3"; exit 0 ;; .1.3.6.1.4.1.674.10893.1.20.110.13.0) echo "integer"; echo "3"; exit 0 ;; *) echo "string"; echo "$@"; exit 0 ;; esac exit

Чтобы воспользоваться скриптом, нужно добавить следующие строки в конец файла /etc/snmp/snmpd.conf:

### Проверка агента Dell OpenManager
view systemview included .1.3.6.1.4.1.674
pass .1.3.6.1.4.1.674 /bin/bash /usr/local/bin/dell_open_manager_test.sh

Чтобы эти изменения возымели действие, нужно перезапустить демона snmpd. В системе Slackware это делается следующим образом:

# /etc/rc.d/rc.snmpd restart
Shutting down snmpd: . DONE
Starting snmpd: /usr/sbin/snmpd -A -p /var/run/snmpd -a -c /etc/snmp/snmpd.conf

Чтобы послать запрос SNMP-серверу, мы воспользуемся утилитой командной строки snmpget из пакета Net-SNMP:

# snmpget -v 1 -c public 127.0.0.1 .1.3.6.1.4.1.674.10892.1.200.10.1.9.1
SNMPv2-SMI::enterprises.674.10892.1.200.10.1.9.1 = INTEGER: 3

В данном случае ответом является целочисленное значение 3. Число 3 в DellStatus (см. выше) означает "ok(3) Состояние объекта нормально". Это означает, что сквозной скрипт работает нормально. Теперь нужно протестировать Perl-скрипт check_dell_openmanager.pl:

# ./check_dell_openmanager.pl -H 127.0.0.1 -C public -T pe2950
OK

Чтобы проверить другие значения, нужно просто модифицировать bash-скрипт dell_open_manager_test.sh. К примеру, чтобы сымитировать ошибку в охлаждающем устройстве (OID .1.3.6.1.4.1.674.10892.1.200.10.1.21), нужно изменить строку с этим OID, чтобы возвращался код 4 (nonCritical):

.1.3.6.1.4.1.674.10892.1.200.10.1.21.1)
  echo "integer"; echo "4"; exit 0 ;;

Теперь если запустить Perl-скрипт, вернется предупреждение:

# ./check_dell_openmanager.pl -H 127.0.0.1 -C public -T pe2950
WARNING:Cooling Device Status=Non-Critical

Давайте сымитируем критическую ошибку. Заменим ответ на OID источника питания на 5:

.1.3.6.1.4.1.674.10892.1.200.10.1.9.1)
  echo "integer"; echo "5"; exit 0 ;;

# ./check_dell_openmanager.pl -H 127.0.0.1 -C public -T pe2950
CRITICAL:Cooling Device Status=Non-Critical, Power Supply Status=Critical

Чтобы протестировать скрипт на живой рабочей системе, мы добавили модуль check_dell_openmanager.pl на работающий Nagios-сервер. Мы сняли крышку корпуса на рабочем сервере, при этом сформировался сигнал ошибки Chassis Intrusion Status. Через несколько секунд на мобильный телефон администратора было послано SMS-сообщение о том, что кто-то открывает крышку.

Продолжаем

После написания этого модуля, я загрузил его на веб-сайт разработчиков модулей для Nagios, называется этот сайт Nagios Exchange. Почти сразу я получил несколько электронных писем, касающихся моего модуля Nagios. В некоторых письмах были предложения, другим людям требовалась помощь в его установке. Нельзя сказать, что поток был сногсшибательным. Максимум, было 2 письма в неделю, может больше. Но этого было достаточно, чтобы понять, что моим модулем пользуются и другие люди.

Мне хотелось бы внести несколько улучшений в модуль. Во-первых, мне кажется, что есть способ сократить число SNMP-запросов до одного - проверить лишь общий глобальный статус машины. Затем, лишь если состояние не равно "ok(3)", отправить запрос по другому OID, чтобы получить более подробное описание ошибки.

Было бы неплохо узнавать существование других различных подсистем, таким образом, можно было бы узнавать, есть ли на машине RAID-массив. Если есть, наблюдать за ним, если же нет - то игнорировать.

Чаще всего люди писали, что Perl не может найти модуль Net::SNMP. Нужно также сделать проверку на отсутствие этого модуля, и если его нет, печатать следующее:

Не хватает Perl-модуля Net::SNMP.
Чтобы установить его, введите:
  perl -MCPAN -e shell
  cpan> install "Net::SNMP"

Так пользователям будет проще разобраться с использованием моего модуля, особенно новичкам Linux.

Источники информации

Джейсон Эллисон (Jason Ellison, www.jasonellison.net) - независимый IT-консультант в Гулф-Коаст. С ним можно связаться по адресу infotek@gmail.com.