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

Пришло время рассказать как просто настроить систему мониторинга для ваших хостов и сервисов, настроить оповещения по email и sms и написать свой плагин для проверки каких-либо других сервисов, не входящих в поставку к Nagios.
Nagios (МФА: nɑˊgɪos) — программа мониторинга компьютерных систем и сетей с открытым кодом. Предназначена для наблюдения, контроля состояния вычислительных узлов и служб, оповещает администратора в том случае, если какие-то из служб прекращают (или возобновляют) свою работу.
Кроме 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 на странице
Управление в веб-интерфейсе
Помимо мониторинга и вывода информации о системе мы можем управлять хостами и сервисами: останавливать оповещения, заказывать "проверку", отсылать вручную оповещения и т.п.
Для демонстрации два скриншота:


Комментарии
Вроде всё сделал правильно
но при заходе на веб страницу выводит 403 Forbidden
Значит что-то сделали неправильно, возможные причины:
Добрый день!
Не совсем понял, на каком этапе мы устанавливаем 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"? Немного подумайте и укажите правильный путь до файла
Вот что значит "Прежде чем получить ответ на вопрос, задай его правильно". Подумал и указал )
А вот по поводу nginx не понял: мы его, получается, заранее устанавливаем? Вот прям перед тем как
Спасибо за помощь! Уже поставил. Теперь бьюсь над 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, но это и понятно, нет его там.
Спасибо большое за ответ, в любом случае буду разбираться дальше.
Оставьте свой комментарий