5 января 2013 г. FreeBSD Nagios Мониторинг fcgiwrap

FreeBSD. Установка и настройка мониторинга Nagios

Пришло время рассказать как просто настроить систему мониторинга для ваших хостов и сервисов, настроить оповещения по email и sms и написать свой плагин для проверки каких-либо других сервисов, не входящих в поставку к Nagios.

Nagios (МФА: nɑˊgɪos) — программа мониторинга компьютерных систем и сетей с открытым кодом. Предназначена для наблюдения, контроля состояния вычислительных узлов и служб, оповещает администратора в том случае, если какие-то из служб прекращают (или возобновляют) свою работу.
http://ru.wikipedia.org/wiki/Nagios

Кроме Nagios в этот класс ПО (мониторинг unix-like систем) можно отнести:

  • Monit и Supervisord - хотя они больше для автоматизации (автоматическая перезагрузка, остановка и т.п. по каким-либо выявленным факторам);
  • Zabbix - мощный комбайн, умеет все подряд (мониторинг, оповещения, сбор данных и графики). Подробнее о Zabbix2 я постараюсь рассказать в других статьях, благо черновик уже есть;
  • Munin (тоже планирую осветить в ближайшее время), Cacti, Collectd - для сбора данных о системе (в том числе с графиками).

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

FYI: Статья была написана в 2011-ом году, но я нашел силы её актуализировать и проверить только сейчас (январь 2013).

Обсуждаемая версия Nagios 3.4.1.

Краткая памятка о статусах и опциях оповещений

Nagios имеет следующие состояния, которые используются в директиве host.notification_options и contact.host_notification_options:

  • d (DOWN) - оповещать когда хост упал;
  • u (UNREACHABLE) - оповещать когда хост недоступен (например из-за запрещающих правил в firewall);
  • r (RECOVERIES) - оповещать когда хост вернулся в состояние OK (UP state);
  • f (FLAPPING) - оповещать когда хост то доступен, то нет, т.е. плавающее состояние;
  • s (SCHEDULED DOWNTIME) - оповещать когда запланированный даунтайм начался и когда закончился;
  • n (NONE) - не оповещать вообще.

Nagios имеет следующие состояния, которые используются в директиве service.notification_options и contact.service_notification_options:

  • w (WARNING) - оповещать когда сервис возвращает WARNING, т.е. находится в сомнительном состоянии (подробности надо смотреть в реализации плагина);
  • u (UNKNOWN) - оповещать когда сервис возвращает неизвестное состояние (подробности надо смотреть в реализации плагина);
  • c (CRITICAL) - оповещать когда сервис возвращает CRITICAL, т.е. скорее всего сломался (подробности надо смотреть в реализации плагина);
  • r (RECOVERIES) - оповещать когда сервис вернулся в состояние OK (UP state);
  • f (FLAPPING) - оповещать когда сервис то доступен, то нет, т.е. плавающее состояние;
  • s (SCHEDULED DOWNTIME) - оповещать когда запланированный даунтайм у сервиса начался и когда он закончился;
  • n (NONE) - не оповещать вообще.

В некоторых других директивах вам могут попасться следующие опции:

  • o (OK/UP) - сервис/хост поднят и работает корректно;
  • p (PENDING) - хост/сервис еще не обработан мониторингом, т.е. скорее всего только что добавлен и Nagios его еще не начал обрабатывать,

Документация по всем директивам, статусам и опциям находится тут.

Установка на FreeBSD

Ставим Nagios из портов:

# Обновляем дерево портов
cd /usr/ports
portsnap fetch update
# Ставим Nagios
cd /usr/ports/net-mgmt/nagios
make install clean
echo 'nagios_enable="YES"' >> /etc/rc.conf

Для обработки php (часть интерфейса у Nagios на PHP) установим php-fpm:

cd /usr/ports/lang/php5
make deinstall clean && make distclean
make config
# Выбираем FPM
make install clean

Для обработки cgi (другая часть интерфейса) установим fcgiwrap:

cd /usr/ports/www/fcgiwrap/
make install clean

Настройка Nagios

Теперь приступим к настройке, скопируем конфиги для редактирования:

cd /usr/local/etc/nagios/
cp cgi.cfg-sample cgi.cfg
cp resource.cfg-sample resource.cfg
cp nagios.cfg-sample nagios.cfg

cd objects
cp contacts.cfg-sample contacts.cfg
cp localhost.cfg-sample localhost.cfg
cp templates.cfg-sample templates.cfg
cp commands.cfg-sample commands.cfg
cp timeperiods.cfg-sample timeperiods.cfg

Далее, я буду указывать относительный путь от /usr/local/etc/nagios, например objects/contacts.cfg это /usr/local/etc/nagios/objects/contacts.cfg.

Настройка контактов

Для того, чтобы получать оповещения о состоянии хостов и сервисов вам надо указать свои контактные данные. По умолчанию Nagios предоставляет возможность отправлять оповещения по email, но можно легко написать команду, которая сможет отправлять оповещения любым удобным способом, например sms или jabber.

Настроим контакт администратора, откройте на редактирование файл objects/contacts.cfg:

define contact{
    use                 generic-contact      ; Имя шаблона, в котором определены умолчательные настройки
    contact_name       adw0rd               ; Никнейм администратора
    alias               Mikhail Andreev      ; Полное имя администратора
    email               info@adw0rd.com      ; Адрес электронной почты
    }

В этом же файле, ниже, добавьте пользователя "adw0rd" в группу:

define contactgroup{
    contactgroup_name     admins                     ; Имя группы
    alias                   Nagios Administrators      ; Описание группы
    members                 adw0rd, <another_username> ; Список пользователей через запятую
    }

Настройка хостов

С помощью Nagios мы хотим мониторить наши сервера, для этого надо сначала задать настройки для хостов и их групп. Определим локальный хост и группу в файле objects/localhost.cfg:

define host{
    use                freebsd-server   ; Имя шаблона, в котором определены умолчательные настройки
    host_name          localhost       ; Произвольное имя хоста, можно оставить "localhost",
                                        ; но я обычно меняю на что-то более осмысленное,
                                        ; самое главное не забыть потом всем сервисам указать правильный "host_name",
                                        ; но еще лучше использовать директиву "hostgroups" для сервисов, ниже я так и буду делать
    alias              localhost
    address             127.0.0.1
    }

define hostgroup{
    hostgroup_name  freebsd-servers   ; Имя группы
    alias            FreeBSD Servers   ; Описание группы
    members          localhost        ; Укажите через заяпятую список хостов относящихся к этой группе
    }

Определим ещё пару хостов, только теперь они будут удаленными (внешние хосты), для этого создадим файл objects/remotehosts.cfg:

define host{
    use                remote-server
    host_name           RemoteServer1
    address             203.0.113.42
    }

define host{
    use                remote-server
    host_name           RemoteServer2
    address             203.0.113.43
    }

define hostgroup{
    hostgroup_name  remote-servers
    alias             Remote Servers
    members           RemoteServer1, RemoteServer2
    }

После чего, надо сообщить Nagios о новом конфигурационном файле, добавьте следующий код в nagios.cfg:

cfg_file=/usr/local/etc/nagios/objects/remotehosts.cfg

Настройка сервисов

Я всегда рекомендую помещать хост в группу и настривать сервисы только для групп, так как сегодня у вас один хост, а завтра появляются десятки и сотни схожих для мониторинга хостов, лучше с самого начала указывать "hostgroups" в сервисах вместо "host_name".

Сервисы мы будем определять непосредственно в файлах хостов: objects/localhost.cfg (для локального хоста) и objects/remotehosts.cfg (для всех дополнительных хостов).

Начнем с локального хоста (откройте "objects/localhost.cfg"), и для примера разберем сервис по проверке ping:

define service{
    use                     local-service      ; Используем шаблон local-service, определенный в objects/templates.cfg
    hostgroups              freebsd-servers     ; Принадлежность сервиса к группе хостов
    service_description     PING                ; Описание сервиса, в свободной форме
    check_command           check_ping!100.0,20%!500.0,60%    ; Вызываем команду check_ping с аргументами
    notifications_enabled   1                   ; Если "1", то оповещать о изменениях в сервисе, если "0", то нет. По умолчанию "1"
    }

Давайте теперь настроим сервисы для удаленных хостов, добавьте в objects/remotehosts.cfg:

define service{
    use                             remote-service     ; Используем шаблон remote-service, определенный в objects/templates.cfg
    hostgroups                      remote-servers      ; Принадлежность сервиса к группе хостов
                                                        ; (сервис будет выполняться на всех хостах относящихся к группе)
    service_description             PING                ; Описание сервиса, в свободной форме
    check_command                   check_ping!100.0,20%!500.0,60%  ; Команда и аргументы
    }

Далее просто дополняйте файл нужными сервисами и пишите свои команды, впринципе вы можете скопировать из objects/localhost.cfg в objects/remotehosts.cfg все сетевые сервисы, так как нет разницы проверять их локально или удаленно (за исключением хостов закрытых фаерволлом, читающие только внутренние интерфейсы и т.п.). А для сервисов, которые могут работать только локально (проверка диска, Load Average и т.п.) надо использовать NRPE, он позволит создавать команды на удаленных хостах и запускать их с сервера мониторинга.

Что такое команды и плагины в Nagios?

Продолжаем обсуждать пример с вызовом команды check_ping, как мы видили аргументы для команды разделяются символом "!", теперь посмотрим на определение команды в файле objects/commands.cfg:

# 'check_ping' command definition
define command{
    command_name    check_ping
    command_line    $USER1$/check_ping -H $HOSTADDRESS$ -w $ARG1$ -c $ARG2$ -p 5
    }

Где,

  • $USER1$ - пользовательская переменная объявленная в resource.cfg, которая содержит путь до каталога с плагинами
    $USER1$=/usr/local/libexec/nagios
  • $HOSTADDRESS$ - адрес хоста, который был определен нами ранее в host.address;
  • $ARG1$ и $ARG2$ - переданные в команду аргументы.
Эти и многие другие переменные называются макросами, о них можно подробнее почитать тут:

То есть команда вызывает плагин /usr/local/libexec/nagios/check_ping и передает ему аргументы, посмотрим справку по плагину:

$ /usr/local/libexec/nagios/check_ping
Usage:
check_ping -H <host_address> -w <wrta>,<wpl>% -c <crta>,<cpl>%
 [-p packets] [-t timeout] [-4|-6]

Теперь понятно зачем плагину эти аргументы, вы можете вручную вызывать эти плагины при написании команд и понять какие аргументы надо передавать.

Я думаю, к этому моменту, вам стала понятна цепь работы: Хост -> Сервис -> Команда -> Плагин.

Настройка шаблонов

При создании дополнительных хостов и сервисов мы указали что будем пользоваться шаблонами remote-server и remote-service, теперь надо их создать. Откройте на редактирование файл objects/templates.cfg:

define host{
    name                       remote-server    ; Имя шаблона
    use                        generic-host     ; Наследуемся от шаблона "generic-host", который определен в этом же файле
    check_period              24x7             ; Проверять хосты в режиме 24 часа, 7 дней в неделю
    check_interval            5                ; Проверять каждые 5 минут
    retry_interval            1                ; Проверять расписание проверки хоста каждую минуту
    max_check_attempts       10               ; Максимальное количество попыток проверки
    check_command             check-host-alive ; Команда для проверки хостов
    notification_period      workhours        ; Оповещать только в рабочие часы (Вы можете указать "24x7" чтобы оповещать всегда)
    notification_interval    60               ; Переотправлять оповещение каждые 60 минут
    notification_options     d,u,r            ; Отправлять только при этих событиях
                                                 ;    (смотрите памятку в начале статьи, вкратце: Down, Unreachable, Recoveries)
    contact_groups            admins           ; Какой группе пользователей отправлять уведомдения
    register                   0                ; Указываем что это просто шаблон и его не надо регистрировать как хост
    }

define service{
    name                      remote-service    ; Имя шаблона для сервисов
    use                       generic-service   ; Наследуемся от шаблона "generic-service", который определен в этом же файле
    max_check_attempts      4                 ; Проверять сервис 4 раза прежде чем убедится в его статусе
    normal_check_interval   5                 ; Проверять сервис каждые 5 минут в нормальном состоянии (когда сервис работает корректно)
    retry_check_interval    1                 ; Перепроверять сервис каждую минут после того как сервис стал работать некорректно
    register                  0                 ; Указываем что это просто шаблон и его не надо регистрировать как сервис
    }

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

И наконец запускаем Nagios:

/usr/local/etc/rc.d/nagios start

Если будут ошибки - пишите комментарии, помогу.

Настройка веб-интерфейса Nagios

Теперь настроим веб-интерфес, и начнем с fcgiwrap, для этого отредактируйте /etc/rc.conf:

fcgiwrap_enable="YES"
fcgiwrap_profiles="nagios"
fcgiwrap_nagios_socket="unix:/var/run/fcgiwrap/nagios.socket"
fcgiwrap_nagios_user="www"

Запускаем fcgiwrap:

/usr/local/etc/rc.d/fcgiwrap start

Настроим php-fpm, отредактируйте файл /usr/local/etc/php-fpm.conf, самое главное указать следующие настройки:

[www]
listen = /var/run/php5/fpm.sock;
user = www
group = www
...

Настроим Nginx, для этого создайте файл /usr/local/etc/nginx/sites-available/monitoring.conf:

server {
    listen 80;
    server_name monitoring.example.org;
    root /usr/local/www;
    auth_basic "Password, please!";
    auth_basic_user_file /path/to/htpasswd;

    location /nagios/ {
        index index.html index.php;
    }
    location ~ ^/nagios/.+\.php$ {
        fastcgi_pass unix:/var/run/php5/fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param QUERY_STRING $query_string;
        include fastcgi_params;
    }
    location ~ ^/nagios/.+\.cgi$ {
        fastcgi_pass unix:/var/run/fcgiwrap/nagios.socket;
        # У нас свой htpasswd файл, в котором нет пользователя "nagiosadmin", но так как мы доверяем своему файлу,
        # то подменяем $remote_user с нашим пользователем на "nagiosadmin" чтобы Nagios не паниковал:
        fastcgi_param AUTH_USER "nagiosadmin";
        fastcgi_param REMOTE_USER "nagiosadmin";
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Не забываем сгенерировать htpasswd:

# Создаем новый
htpasswd.py -cb /path/to/htpasswd <username> <password>

# Или обновляем существующий
htpasswd.py -b /path/to/htpasswd <username> <password>

Во FreeBSD я пользуюсь скриптом на python для генерации htpasswd-файлов, установить его можно так:

cd /usr/ports/security/py-htpasswd
make install clean

Теперь сделаем симлинк и перезапустим Nginx:

ln -s /usr/local/etc/nginx/sites-available/monitoring.conf /usr/local/etc/nginx/sites-enabled/monitoring.conf
nginx -s reload

Теперь мы уже можем лицезреть Nagios на странице http://monitoring.example.org/nagios/

Управление в веб-интерфейсе

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

Для демонстрации два скриншота:

Host Commands
Service Commands

Что ещё почитать?

Комментарии

Вроде всё сделал правильно
но при заходе на веб страницу выводит 403 Forbidden

Значит что-то сделали неправильно, возможные причины:

  • Нехватает прав веб-серверу, смотри из под кого он запущен и смотрите какие права установлены на файлы
  • Смотрите логи "/var/log/nginx/error.log" и "/var/log/messages" (или "/var/log/syslog")

Добрый день!
Не совсем понял, на каком этапе мы устанавливаем nginx?
И при попытке выполнить команду htpasswd.py -cb /path/to/htpasswd
пишет

```
# htpasswd.py -cb /path/to/htpasswd nagiosadmin nagios
Traceback (most recent call last):
File "/usr/local/bin/htpasswd.py", line 123, in
main()
File "/usr/local/bin/htpasswd.py", line 119, in main
passwdfile.save()
File "/usr/local/bin/htpasswd.py", line 54, in save
open(self.filename, 'w').writelines(["%s:%s\n" % (entry[0], entry[1])
IOError: [Errno 2] No such file or directory: '/path/to/htpasswd'
````

А у вас существует файл "/path/to/htpasswd"? Немного подумайте и укажите правильный путь до файла

IOError: [Errno 2] No such file or directory: '/path/to/htpasswd'

Вот что значит "Прежде чем получить ответ на вопрос, задай его правильно". Подумал и указал )
А вот по поводу nginx не понял: мы его, получается, заранее устанавливаем? Вот прям перед тем как

Настроим Nginx, для этого создайте файл /usr/local/etc/nginx/sites-available/monitoring.conf:>

Спасибо за помощь! Уже поставил. Теперь бьюсь над 403, как в первом комменте. Говорит нет доступа к /usr/local/www хотя я ему chmod 755 сделал. Странно.

Да, предусматривается что у вас уже есть Nginx, о его установке и настройке можно прочитать в других моих статьях http://adw0rd.com/tag/nginx/

Странно.

Попробуйте перезапустить Nginx, смотрите логи

Я из логов и писал
[erroe] 10883#0: *3 directory index of "/usr/local/www/" is forbidden ну и дальше там клиент такой-то и т.д.
ну и жалуется что фавикон найти не может в каталоге www, но это и понятно, нет его там.
Спасибо большое за ответ, в любом случае буду разбираться дальше.

Оставьте свой комментарий

Markdown