Nagios
Nagios - мощная система мониторинга и уведомлений о состоянии серверов и сетей.
Рассмотрим установку, конфигурирование и принципы работы на базе системы, работающей под Debian GNU/Linux.
Установка
Для запуска Nagios на нашем сервере понадобится установить следующие пакеты:
- nagios3 - подтянет остальные необходимые пакеты
- nagios-images - логотипы систем и сервисов
- nagios-plugins-basic - набор плагинов - мини-программ, выполняющихся для проверки того или иного параметра. Подтянется автоматически при установке пакета nagios3
Командуем:
apt-get install nagios3 nagios-images
и приступаем к настройке. В процессе установки будет задан вопрос о пароле администратора Nagios - пользователе nagiosadmin.
Помимо основных пакетов, будет установлен также php и веб-сервер (при желании можно переопределить устанавливаемый веб-сервер, указав его явно. По умолчанию ставится Apache)
Настройка и принципы конфигурирования
Основной файл настроек - /etc/nagios3/nagios.cfg. Для удобства работы будет полезно создать (и объявить в файле настроек) каталоги, где будут находиться конфиг-файлы наших хостов и собственных плагинов. Допишем где-нибудь в начале конфига:
cfg_dir=/etc/nagios3/hosts cfg_dir=/etc/nagios3/custom_plugins
и создадим указанные каталоги:
mkdir -pm 755 /etc/nagios3/hosts /etc/nagios3/custom_plugins
Nagios обрабатывает только конфиги с расширением .cfg (поэтому, например, можно не обращать внимания на файлы .cfg-sample в некоторых системах).
В Nagios есть несколько типов описаний, одни описания могут служить шаблонами для других. Рассмотрим описание какого-либо хоста.
В созданном подкаталоге hosts/ создадим конфиг-файл с удобным для себя названием, позволяющим быстро определить, к какому хосту он относится. В файле описания хоста ожидается как минимум одна основная секция:
define host{ use generic-host host_name FTP alias ftp.linuxoid.in display_name FTP Server address ftp.linuxoid.in }
где:
- use - отсылка на описание темплейта generic-host в /etc/nagios3/conf.d/generic-host_nagios2.cfg
- host_name - имя хоста для использования далее по конфигу. Также используется для отображения в веб-интерфейсе.
- alias - псевдоним хоста
- display_name - имя для отображения в веб-интерфейсе (в будущем, на данный момент не работает). Иначе говоря, можно задать имя хоста = имени домена, а для отображения использовать понятное человеку слово
- address - IP-адрес или домен, для которого будет делаться проверка
generic-host - темплейт, описанный в файле /etc/nagios3/conf.d/generic-host_nagios2.cfg. Там для него описываются основные параметры, вроде включения уведомлений и периодов проверки. В свою очередь, в описании идут отсылки еще к нескольким шаблонам:
- check_command - команда для проверки доступности хоста.
- notification_period - шаблон расписания, которое описывается в файле /etc/nagios3/conf.d/timeperiods_nagios2.cfg
- contact_groups - адрес группы получателей уведомлений; описывается в /etc/nagios3/conf.d/contacts_nagios2.cfg, в свою очередь там есть 2 подраздела:
- contactgroup - то, на что, собственно, и идет отсылка. В группе описываются участники, по умолчанию это root, для которого идет отсылка на:
- contact - тут задается email для отправки уведомлений, переопределяются настройки периодов уведомлений и т.п., в том числе задается команда для выполнения при отправке уведомления о сервисах и хостах (о ней ниже).
Далее в конфиге хоста описываются проверяемые сервисы, например:
define service{ use generic-service host_name FTP service_description Disk Usage check_command ssh_all_disk!75!90 }
где:
- use - отсылка на шаблон описания сервиса. generic-service по умолчанию описывается в файле /etc/nagios3/conf.d/generic-service_nagios2.cfg
- host_name - то, для чего будет делаться проверка сервиса - отсылка на описанный выше хост
- service_description - описание сервиса - то, как оно будет выглядеть в веб-интерфейсе
- check_command - отсылка на команду для проверки параметра. Восклицательными знаками разделяются передаваемые команде аргументы.
generic-service и его описание в /etc/nagios3/conf.d/generic-service_nagios2.cfg переопределяет настройки уведомлений для конкретного сервиса. Т.е., например, один параметр (сервис) одного и того же хоста может мониториться только в рабочие дни с уведомлением группе людей, а другой - 24 часа в сутки с уведомлением админу.
check_command - отсылка на описание команды, заданной в одном из конфигурационных файлов каталога с плагинами - в Debian это /etc/nagios-plugins/config/, плюс, как условились выше, свои команды будем размещать в /etc/nagios3/custom_plugins
В Debian команды плагинов разделены по отдельным группам: disk, load, mail и так далее. Рассмотрим упомянутую выше команду ssh_all_disk. Команда не входит в базовую поставку пакета с плагинами, поэтому была описана дополнительно в файле /etc/nagios3/custom_plugins/disk.cfg:
define command{ command_name ssh_all_disk command_line /usr/lib/nagios/plugins/check_by_ssh -H '$HOSTADDRESS$' -C "/usr/lib/nagios/plugins/check_disk -w '$ARG1$' -c '$ARG2$' -e" }
Описание крайне простое:
- command_name задает имя команды - то, на что будет идти отсылка в других конфигах
- command_line - выполняемая команда, которая должна вернуть OK, WARNING или CRITICAL, плюс опционально - результат. В данном случае одна команда вложена в другую - при проверке выполняется /usr/lib/nagios/plugins/check_by_ssh, которая подключается по SSH на удаленный хост, указанный в переменной $HOSTADDRESS$ (где идет отсылка на address в описании конкретного хоста) с пользователем, под которым работает nagios (по умолчанию nagios). Подключение происходит по ключам, так что предварительно надо позаботиться о создании нужного пользователя на удаленном хосте (useradd -rml nagios), создания и обмена с ним ключами. Далее на удаленном хосте выполняется команда, переданная в кавычках - /usr/lib/nagios/plugins/check_disk -w '$ARG1$' -c '$ARG2$' -e - т.е., выполняется команда для проверки диска (не забываем поставить на удаленном хосте nagios-plugins-basic), для которой первым аргументом передается значение для предупреждения, вторым - критическое значение заполненности диска.
Помимо команд плагинов, Nagios также подключает файл /etc/nagios3/commands.cfg, в котором описываются команды, выполняемые при создании уведомлений.
Дополнительные параметры конфигурации
Помимо перечисленных выше основных параметров, можно задавать ряд дополнительных, предназначенных больше для удобства.
- /etc/nagios3/conf.d/extinfo_nagios2.cfg описывает логотип, отображаемый возле хоста. В свою очередь там идет отсылка на описание debian-servers, которое находится в hostgroups_nagios2.cfg
- /etc/nagios3/conf.d/hostgroups_nagios2.cfg. Тут описываются группы хостов. В members через запятую перечисляются хосты - так, как они указаны в host_name в конфиге хоста.
- /etc/nagios3/conf.d/services_nagios2.cfg - файл, делающий проверки основного сервиса для хоста, включенного в определенную группу в предыдущем файле. Например, для всех хостов, указанных как ssh-servers в группах хостов автоматически включится проверка работоспособности SSH
- /etc/nagios3/conf.d/service_groups.cfg - здесь можно сгруппировать несколько хостов в одну группу, например:
define servicegroup { servicegroup_name Hosting members FTP,FTP,Mail,Mail,MySQL,MySQL,Web Server,HTTP }
где:
- servicegroup_name - название группы, которое будет отображаться в веб-интерфейсе
- members - пары "имя,сервис", где "имя" - название хоста, включенного в группу, "сервис" - сервис для проверки работоспособности хоста
Приложение 1
Скрипт для мониторинга используемой памяти на Linux-системах. Это немного переделанный вариант этого скрипта, позволяющий не использовать (не устанавливать) bc.
Скрипт необходимо сохранить в /usr/lib/nagios/plugins/check_memory.sh
#!/bin/bash
#
# Script to check memory usage on Linux. Ignores memory used by disk cache.
#
print_help() {
echo "Usage:"
echo "[-w] Warning level as a percentage"
echo "[-c] Critical level as a percentage"
exit 0
}
while test -n "$1"; do
case "$1" in
--help|-h)
print_help
exit 0
;;
-w)
warn_level=$2
shift
;;
-c)
critical_level=$2
shift
;;
*)
echo "Unknown Argument: $1"
print_help
exit 3
;;
esac
shift
done
if [ "$warn_level" == "" ]; then
echo "No Warning Level Specified"
print_help
exit 3;
fi
if [ "$critical_level" == "" ]; then
echo "No Critical Level Specified"
print_help
exit 3;
fi
free=`free -m | grep "buffers/cache" | awk '{print $4}'`
used=` free -m | grep "buffers/cache" | awk '{print $3}'`
total=$(($free+$used))
result=$(($used*100/$total))
if [ "$result" -lt "$warn_level" ]; then
echo "Memory OK. $result% used."
exit 0;
elif [ "$result" -ge "$warn_level" ] && [ "$result" -le "$critical_level" ]; then
echo "Memory WARNING. $result% used."
exit 1;
elif [ "$result" -gt "$critical_level" ]; then
echo "Memory CRITICAL. $result% used."
exit 2;
fi