Пришло время рассказать как просто настроить систему мониторинга для ваших хостов и сервисов, настроить оповещения по 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
Теперь приступим к настройке, скопируем конфиги для редактирования:
Далее, я буду указывать относительный путь от /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:
Я всегда рекомендую помещать хост в группу и настривать сервисы только для групп, так как сегодня у вас один хост, а завтра появляются десятки и сотни схожих для мониторинга хостов, лучше с самого начала указывать "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:
Теперь понятно зачем плагину эти аргументы, вы можете вручную вызывать эти плагины при написании команд и понять какие аргументы надо передавать.
Я думаю, к этому моменту, вам стала понятна цепь работы: Хост -> Сервис -> Команда -> Плагин.
Настройка шаблонов
При создании дополнительных хостов и сервисов мы указали что будем пользоваться шаблонами 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:
Настроим 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?
И при попытке выполнить команду 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'
````
Вот что значит "Прежде чем получить ответ на вопрос, задай его правильно". Подумал и указал )
А вот по поводу nginx не понял: мы его, получается, заранее устанавливаем? Вот прям перед тем как
Настроим Nginx, для этого создайте файл /usr/local/etc/nginx/sites-available/monitoring.conf:>
Спасибо за помощь! Уже поставил. Теперь бьюсь над 403, как в первом комменте. Говорит нет доступа к /usr/local/www хотя я ему chmod 755 сделал. Странно.
Я из логов и писал
[erroe] 10883#0: *3 directory index of "/usr/local/www/" is forbidden ну и дальше там клиент такой-то и т.д.
ну и жалуется что фавикон найти не может в каталоге www, но это и понятно, нет его там.
Спасибо большое за ответ, в любом случае буду разбираться дальше.
Комментарии
Вроде всё сделал правильно
но при заходе на веб страницу выводит 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, но это и понятно, нет его там.
Спасибо большое за ответ, в любом случае буду разбираться дальше.
Оставьте свой комментарий