Увеличение возможностей Nagios с помощью плагинов собственной разработки

Преимущества и новые возможности для мониторинга систем

Эта статья знакомит с Nagios и рассказывает, какие новые возможности для мониторинга систем возникают при использовании этого пакета программ. Nagios - это разработанное в рамках проекта open source программное обеспечение для мониторинга, которое выявляет проблемы в работе компьютеров, сервисов и сетей. У Nagios есть два важных отличия от аналогичных утилит мониторига - оно использует только три типа состояний ("работающий", "ненадежный" и "неисправный") и поддерживает крайне богатую экосистему плагинов Эти возможности приводят к эффективному решению, где пользователи получают только ту информацию, которая необходима для диагностики и устранения проблем.

Камерон Лейрд, вице-президент, Phaseit, Inc

Камерон Лейрд (Cameron Laird) – давний сотрудник и бывший обозреватель developerWorks. Он часто пишет о проектах с открытыми исходными кодами, которые ускоряют разработку приложений его работодателя, сфокусированных на надёжности и безопасности.



Косьян Войцех, разработчик программного обеспечения, IBM

Косьян Войцех (Kocjan Wojciech) несколько лет занимается разработкой программного обеспечения и консультированием. Среди его коммерческих клиентов Motorola и IBM. Он также в течение нескольких лет занимался поддержкой ряда проектов open-source. Сейчас он является разработчиком программного обеспечения в IBM.



02.10.2009

Отслеживание и анализ больших объемов информации о состоянии разных компьютеров (например, степень загруженности процессоров и сетевой карты) требует больших усилий, но Nagios с открытым исходным кодом (см. раздел Ресурсы) успешно справляется с задачами мониторинга и оперативного оповещения.

Крайне важно понимать, что Nagios - это не инструмент для замеров параметров работы системы, например, степени загруженности процессоров, а утилита, выдающая результаты мониторинга в виде состояний "работающий", "ненадежный" и "неисправный". Эта особенность Nagios помогает оператору сфокусироваться на самых главных и критических проблемах, основываясь на заранее определенных и настраиваемых критериях.

ПО Nagios реализует функциональность для подготовки отчетов о количестве времени, потерянного из-за простоев, что может быть полезным для отслеживания качества предоставления услуг согласно соглашению об уровне сервиса (service level agreement - SLA). Как будет показано в последующих статьях, Nagios также предлагает возможности для учета времени простоя и создания зависимостей от служб и систем. Эта вводная статья показывает, как легко можно создавать небольшие персонализированные решения для конкретных требований по мониторингу.

Установка

Большинство дистрибутивов Linux® поставляются с встроенной версией Nagios. В этом случае продукт легко интегрируется с Web-сервером Apache. Для активизации или обновления такой конфигурации необходимо выполнить команду:

yum install nagios

или apt-get install nagios-text. Исполняемые файлы для платформы AIX® доступны для загрузки с Web-сайта NagiosExchange (см. раздел Ресурсы).

Для других платформ исходный код Nagios можно загрузить с Web-сайта Nagios.org (см. раздел Ресурсы). Для создания Nagios "с чистого листа" необходимы следующие инструменты разработчика.

  • Инструменты:
    • gcc
    • make
    • autoconf
    • automake
  • Исполняемые файлы:
    • libgd
    • openssl
  • Пакеты (библиотек и заголовочных файлов)

Многие плагины, связанные с SNMP (Simple Network Management Protocol - простой протокол сетевого управления) также потребуют наличия Perl и пакета Net::SNMP.

После установки и настройки Nagios можно получить к нему доступ через стандартный URL http://your.host.name/nagios. На рисунке 1 показано, какие системы и службы включены или отключены.

Рисунок 1. Скриншот Tactical Monitoring Overview
Рисунок 1. Скриншот Tactical Monitoring Overview

Настройка Nagios

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

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

Контакты хранятся в файле contacts.cfg и определяются, как показано в листинге 1.

Листинг 1. Конфигурация 1: Базовая информация о контактах
define contact{
        contact_name                    jdoe
        alias                           John Due
        service_notification_commands   notify-by-email
        host_notification_commands      host-notify-by-emailes
        email                           john.doe@yourcompany.com
        }

Контакты можно группировать, и вместо отдельных людей, которые должны быть извещены в случае изменения статуса системы или службы, Nagios будет оповещать соответствующую группу. Иногда имеет смысл задать пользователя несколько раз, чтобы определить различные адреса или команды для отправки извещений и затем добавить все способы связаться с пользователем к группе контактов, к которой он принадлежит (листинг 2).

Листинг 2. Конфигурация 2: Группировка контактов
define contactgroup{
        contactgroup_name               server-admins
        alias                           Server Administrators
        members                         jdoe,albundy
        }

Следующий шаг - это настроить системы, за которыми Nagios будет осуществлять мониторинг. Необходимо добавить каждый компьютер, на котором имеются службы, которые предстоит отслеживать или периодически проверять на активность. Конфигурационный файл для хранения система - это файл hosts.cfg. В листинге 3 приведен пример определения компьютера.

Листинг 3. Конфигурация 3: Добавление нового компьютера
define host{
        host_name                       ubuntu_1_2
        alias                           Ubuntu test server
        address                         192.168.1.2
        check_command                   check-host-alive
        max_check_attempts              20
        notifications_enabled           1
        event_handler_enabled           0
        flap_detection_enabled          0
        process_perf_data               1
        retain_status_information       1
        retain_nonstatus_information    1
        notification_interval           60
        notification_period             24x7
        notification_options            d,u,r
        }

Последний этап конфигурации Nagios - это определение служб для сконфигурированных систем. Показанный в листинге 4 пример использует заранее определенный ping-плагин для Nagios, который отправляет эхо-запросы по протоколу ICMP (Internet Control Message Protocol), чтобы определить, отвечает компьютер или нет.

Листинг 4. Конфигурация 4: Добавление новой службы
define service{
        use                             service-template
        host_name                       ubuntu_1_2
        service_description             PING
        check_period                    24x7
        contact_groups                  server-admins
        notification_options            c,r
        check_command                   check_ping!300.0,20%!1000.0,60%
        }

После подготовки этой конфигурации необходимо перезапустить демона Nagios, а затем, подождав несколько секунд, пока Nagios инициализируется, проверить, появились ли ping-службы в Web-интерфейсе администратора.

Написание плагинов для Nagios

Наиболее интересный аспект Nagios - это то, что к нему можно легко написать собственный плагин, для чего требуется изучить несколько простых правил. Для управления плагином Nagios просто порождает дочерний процесс каждый раз, когда запрашивает состояние службы и использует выходную информацию и код возврата этой команды для определения состояния. Коды возврата с состоянием службы интерпретируются следующим образом:

  • OK - код возврата 0 - означает, что сервис работает нормально;
  • WARNING - код возврата 1 - это предупредительный сигнал о том, что у сервиса могут быть проблемы;
  • CRITICAL - код возврата 2 - критическое состояние сервиса;
  • UNKNOWN - код возврата 3 - неизвестное состояние сервиса.

Последнее состояние просто означает, что плагин не смог определить состояние службы. Это может произойти, например, в результате внутренней ошибки.

В листинге 5 приведен пример сценария на языке Python, который проверяет среднюю загрузку ОС UNIX®. В нем предполагается, что уровень выше 2.0 соответствует предупредительному состоянию, а уровень выше 5.0 -критическому состоянию. Эти значения "вшиты" в код, и также всегда используется среднее значение загрузки за последнюю минуту.

Листинг 5. Python плагин - пример работающего плагина
#!/usr/bin/env python

import os,sys

(d1, d2, d3) = os.getloadavg()

if d1 >= 5.0:
    print "GETLOADAVG CRITICAL: Load average is %.2f" % (d1)
    sys.exit(2)
elif d1 >= 2.0:
    print "GETLOADAVG WARNING: Load average is %.2f" % (d1)
    sys.exit(1)
else:
    print "GETLOADAVG OK: Load average is %.2f" % (d1)
    sys.exit(0)

Подготовив небольшой исполняемый компонент, необходимо зарегистрировать этот плагин в Nagios и создать определение службы, которая будет проверять среднюю нагрузку.

Это довольно просто: сначала создается файл /etc/nagios-plugins/config/mygetloadavg.cfg с содержимым, приведенным ниже, и добавляется служба в файл services.cfg, как показано в примере ниже. Напомню, что localhost должен присутствовать в конфигурационном файле hosts.cfg.

Листинг 6. Пример плагина - регистрация в Nagios
define command{
        command_name    check_mygetloadavg
	command_line    /path/to/check_getloadavg
	}
Листинг 7. Создание службы, использующей пример плагина
define service{
        use                             service-template
        host_name                       localhost
        service_description             LoadAverage
        check_period                    24x7
        contact_groups                  server-admins
        notification_options            c,r
        check_command                   check_mygetloadavg
        }

Написание полноценного плагина

В предыдущем примере были показаны ограничения "жестко запрограммированного" плагина, который не позволяет менять конфигурации во время исполнения. На практике лучше создавать конфигурируемые плагины, тогда можно будет создать и поддерживать только один плагин, зарегистрировав его как отдельный плагин в Nagios, и передавать ему аргументы настройки предупредительного и критических уровней под различные обстоятельства. Следующий пример также включает сообщения с информацией об использовании, это особенно полезно для плагинов, используемых или поддерживаемых несколькими разработчиками или администраторами.

Другой полезный прием - это перехватывание всех исключительных ситуаций и возврат в отчет о состоянии службы значения UNKNOWN, чтобы Nagios мог соответствующим образом оповестить об этом событии. Плагины, которые допускают "выход" исключительных ситуаций за свои границы, чаще всего возвращают значение 1, которое трактуется Nagios как WARNING-состояние. Важно чтобы плагин правильно отличал состояние WARNING (предупредительное) от UNKNOWN (неизвестное). Стоит заметить, что обычно извещения об отдельных состояниях WARNING отключаются, но не стоит отключать извещения о состоянии UNKNOWN.

Написание Python-плагина

Допущения, указанные выше (параметризация во время исполнения, сообщение об использовании и улучшенная обработка исключительных ситуаций) приводят к плагину, исходный код которого в несколько раз больше, чем у предыдущего. Однако при этом добавляется безопасная обработка ошибок и способность повторно использовать плагин в различных ситуациях.

Листинг 8. Python-плагин - полноценный плагин для получения данных о средней загрузке
#!/usr/bin/env python

import os
import sys
import getopt

def usage():
    print """Usage: check_getloadavg [-h|--help] [-m|--mode 1|2|3] \
    [-w|--warning level] [-c|--critical level]"

Mode: 1 - last minute ; 2 - last 5 minutes ; 3 - last 15 minutes"
Warning level defaults to 2.0
Critical level defaults to 5.0"""
    sys.exit(3)

try:
    options, args = getopt.getopt(sys.argv[1:],
        "hm:w:c:",
        "--help --mode= --warning= --critical=",
        )
except getopt.GetoptError:
    usage()
    sys.exit(3)

argMode = "1"
argWarning = 2.0
argCritical = 5.0

for name, value in options:
    if name in ("-h", "--help"):
        usage()
    if name in ("-m", "--mode"):
        if value not in ("1", "2", "3"):
            usage()
        argMode = value
    if name in ("-w", "--warning"):
        try:
            argWarning = 0.0 + value
        except Exception:
            print "Unable to convert to floating point value\n"
            usage()
    if name in ("-c", "--critical"):
        try:
            argCritical = 0.0 + value
        except Exception:
            print "Unable to convert to floating point value\n"
            usage()

try:
    (d1, d2, d3) = os.getloadavg()
except Exception:
    print "GETLOADAVG UNKNOWN: Error while getting load average"
    sys.exit(3)

if argMode == "1":
    d = d1
elif argMode == "2":
    d = d2
elif argMode == "3":
    d = d3

if d >= argCritical:
    print "GETLOADAVG CRITICAL: Load average is %.2f" % (d)
    sys.exit(2)
elif d >= argWarning:
    print "GETLOADAVG WARNING: Load average is %.2f" % (d)
    sys.exit(1)
else:
    print "GETLOADAVG OK: Load average is %.2f" % (d)
    sys.exit(0)

Для использования нового плагина необходимо зарегистрировать его в файле /etc/nagios-plugins/config/mygetloadavg2.cfg, как показано в листинге 9.

Листинг 9. Python-плагин - регистрация в Nagios
define command{
        command_name    check_mygetloadavg2
	command_line    /path/to/check_getloadavg2 -m $ARG1$ -w $ARG2$ -c $ARG3$
	}

Также необходимо добавить или изменить запись об этой службе в файле services.cfg, как показано в листинге 10. Стоит отметить, что восклицательный знак ! разделяет параметры плагина. Как и прежде, необходимо, чтобы localhost был определен в конфигурационном файле hosts.cfg.

Листинг 10. Создание сервиса, использующего плагин Python
define service{
        use                             service-template
        host_name                       localhost
        service_description             LoadAverage2
        check_period                    24x7
        contact_groups                  server-admins
        notification_options            c,r
        check_command                   check_mygetloadavg2!1!3.0!6.0
        }

Написание плагина Tcl

Последний пример - это плагин, написанный на Tcl и проверяющий курсы валют с сайта xmethods.net с помощью протокола SOAP (Simple Object Access Protocol) и технологии WSDL (Web Services Description Language). SOAP предоставляет плагину текущие значения курсов валют, чтобы сравнить их с конфигурированными значениями. Если значение находится внутри предупредительного диапазона, то считается, что это состояние OK. Если значение выше или ниже предупредительного уровня, но не выходит за критический предел, то считается, что это состояние WARNING. В противном случае состояние считается как CRITICAL, если не происходит сетевого сбоя, в случае которого состояние устанавливается в UNKNOWN.

Плагин распознает конфигурируемые параметры, так что можно проверять различные курсы с различными диапазонами для проверки. Также его можно использовать для проверки курсов валют различных стран (листинг 11).

Листинг 11. Tcl-плагин - проверка текущих значений курсов обмена валют
#!/usr/bin/env tclsh

# parse arguments
package require cmdline
set options {
    {country1.arg "" "Country 1"}
    {country2.arg "" "Country 2"}
    {lowerwarning.arg "" "Lower warning limit"}
    {upperwarning.arg "" "Upper warning limit"}
    {lowercritical.arg "" "Lower critical limit"}
    {uppercritical.arg "" "Upper critical limit"}
}

array set opt [cmdline::getoptions argv $options {: [options]}]

# если пользователь не предоставил все аргументы,
# то показать справочное сообщение
for each necessary [array names opt] {
    if {$opt($necessary) == ""} {
        set argv "-help"
        catch {cmdline::getoptions argv $options {: [options]}} usage
	puts stderr $usage
        exit 3
    }
}

# загрузить пакет TclWebServices
package require WS::Client

if {[catch {
    # загрузить WSDL-файл
	WS::Client::GetAndParseWsdl \
        http://www.xmethods.net/sd/2001/CurrencyExchangeService.wsdl \
	{} currency

    # команды для создания объектов-заглушек
	WS::Client::CreateStubs currency

    # загрузка реальных обменных курсов
	set result [lindex \
        [currency::getRate "England" "Japan"] 1]
} error]} {
    # если по какой-либо причине не удалось загрузить курс, то сообщить об этом
	puts "EXCHANGERATE UNKNOWN: $error"
    exit 3
}
    
if {($result < $opt(lowercritical)) || ($result > $opt(uppercritical))} {
    puts "EXCHANGERATE CRITICAL: rate is $result"
    exit 2
}
if {($result < $opt(lowerwarning)) || ($result > $opt(upperwarning))} {
    puts "EXCHANGERATE WARNING: rate is $result"
    exit 1
}
puts "EXCHANGERATE OK: rate is $result"
exit 0

Теперь необходимо зарегистрировать эту команду, чтобы Nagios знал, как вызывать ее. Для того чтобы сделать это, надо создать файл /etc/nagios-plugins/config/exchangerate.cfg с содержимым, похожим на предыдущие конфигурации и следующим определением команды:

command_line    /path/to/check_exchangerate
-country1 $ARG1$ -country2 $ARG2$ -lowercritical \
 $ARG3$ -lowerwarning $ARG4$ -upperwarning $ARG5$ -uppercritical $ARG6$


Имя команды check_exchangerate используется в примере, приведенном ниже.

Затем необходимо создать службу, которая будет использовать созданный плагин для отслеживания курсов валют. Ниже приведен пример определения службы, ассоциирующий службу с сервером localhost. Хотя проверка на самом деле не связана с каким-либо реальным компьютером, ее все равно необходимо привязать к системе. Если проверка включает вызов SOAP-методов серверов внутри контролируемой сети, то необходимо добавить реальный сервер, для которого будет выполняться мониторинг, и привязать службу к этому серверу. Код в листинге 12 проверяет, что курс британского фунта по отношению к японской йене находится в диапазоне от 225 до 275.

Листинг 12. Добавление Tcl-плагина в качестве новой службы
define service{
        use                             service-template
        host_name                       localhost
        service_description             EXCHANGERATE
        check_period                    24x7
        contact_groups                  other-admins
        notification_options            c,r
        check_command                   check_exchangerate!England!Japan!200!225!275!300
        }

Заключение

Nagios можно использовать для мониторинга всех типов ПО и компьютерного оборудования. Возможность создавать собственные плагины позволяет выполнять мониторинг всего, с чем может общаться сервер Nagios. Для этого можно использовать любой язык программирования, который принимает аргументы с командной строки и поддерживает коды возврата, так что возможности оказываются почти безграничными!

Опытный системный администратор может расширить SOAP-пример с помощью Tcl или любого другого языка для взаимодействия с Web-службами в Интранет-сети и написания плагинов для проверки правильности функционирования этих служб.

Также можно использовать С-плагины или возможности С-программирования, встроенные в используемый динамический язык (Pyinline в Python, Inline в Perl или Critcl в Tcl) для комбинирования сочетания системных API ОС на языке С с плагином, написанном на языке высокого уровня.

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

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

Ресурсы

Научиться

  • Leverage Nagios with plug-ins you write: оригинал статьи (EN).
  • Nagios: официальный Web-сайт Nagios с дополнительной информацией. Этот Web-сайт содержит последние версии приложений, RPM-пакетов и самостоятельную версию для платформы Linux. На странице propaganda рассказывается, какие компании и почему используют Nagios. (EN)
  • Про Nagios было написано несколько книг . (EN)
  • Nagios Exchange: центральный репозитарий, содержащий множество общедоступных плагинов для Nagios. (EN)
  • Исполняемые файлы для платформы AIX доступны для бесплатной загрузки с Web-сайта NagiosExchange. Исходные коды Nagios для других платформ могут быть загружены с Web-сайта Nagios.org. (EN)
  • Nagiosplug Developer guidelines(EN): эта страница содержит идеи и приемы для написания собственных плагинов для Nagios. (EN)
  • Passive Host and Service Checks (EN): отправка оповещений в Nagios непосредственно из приложений
  • Python homepage: эта страница содержит дополнительную информацию для изучения языка Python, также предлагается информация для загрузки и использования языка Python. Еще один источник информации о Python - это колонка Девида Мертца (David Mertz) Charming Python на сайте developerWorks. (EN)
  • " Пользователи, которые хотя быстро изучить язык Tcl, могут найти полную документацию по различным версиям Tcl на сайте www.tcl.tk. Tcl/Tk можно также бесплатно скачать с его раздела на портале Sourceforge. (EN)
  • Писать код на языке С внутри Python можно с помощью модуля PyInline, который можно бесплатно загрузить с его Web-сайта на портале Sourceforge. (EN)
  • Для пользователей Tcl, желающих использовать "родные" API ОС в своих плагинах, Critcl предоставляет возможность добавить язык C к Tcl. ПО Starkit, позволяющее запускать, собирать и использовать Critcl на компьютере, можно загрузить с Web-сайта critcl.kit. (EN)
  • " Другие статьи, написанные Кемероном Лейрдом:
  • Popular content: популярные материалы об AIX и UNIX.
  • Раздел developerWorks AIX and UNIX содержит сотни информативных статей для читателей начальной, средней и высокой квалификации.
  • Новичок в AIX и UNIX?: страница AIX и UNIX для новичков.
  • AIX 5L Wiki: совместная разработка документации AIX.
  • Разделы библиотеки информации по темам AIX и UNIX:
  • Safari bookstore: сайт магазина книг по ИТ.
  • Команда IBM developerWorks проводит по всему миру сотни бесплатных технических консультаций.

Получить продукты и технологии

  • IBM trial software: ознакомительные версии программного обеспечения для разработчиков, которые можно загрузить прямо со страницы сообщества developerWorks.

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=AIX и UNIX
ArticleID=432691
ArticleTitle=Увеличение возможностей Nagios с помощью плагинов собственной разработки
publish-date=10022009