Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Настройка системы мониторинга состояния сервера на основе демона Monit

Оригинал: How to set up server monitoring system with Monit
Автор: Iulian Murgulet
Дата публикации: 25 марта 2015 г.
Перевод: А.Панин
Дата перевода: 15 августа 2016 г.

Многие системные администраторы, имеющие дело с Linux-серверами, полагаются на централизованные удаленные системы мониторинга (такие, как Nagios или Cacti) для наблюдения за подконтрольной сетевой инфраструктурой. Хотя централизованный мониторинг и значительно упрощает жизнь системного администратора при работе с множеством узлов и устройств, удаленный сервер системы мониторинга становится единой точкой отказа; если этот сервер выйдет из строя или прекратит отвечать на запросы по какой-либо причине (например, из-за некачественного аппаратного обеспечения или неработоспособности сети), вы не сможете контролировать всю сетевую инфраструктуру.

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

Что такое Monit?

Monit является кроссплатформенным инструментом с открытым исходным кодом, предназначенным для мониторинга состояния систем Unix/Linux (то есть, Linux, BSD, OSX, Solaris). Monit крайне просто установить, он является достаточно легковесным (занимает всего 500 КБ дискового пространства) и не требует каких-либо сторонних программ, плагинов или библиотек. К тому же, Monit осуществляет полноценный мониторинг состояния системы, включающий мониторинг состояния процессов, изменений файловой системы, а также осуществляет отправку уведомлений по электронной почте, выполняет заданные действия при наступлении тех или иных событий и так далее. Комбинация из простоты установки, легковесной реализации и широкого спектра возможностей делает Monit идеальным кандидатом на роль резервной системы мониторинга состояния сервера.

Я использую Monit уже несколько лет на множестве узлов и очень доволен стабильностью его работы. Даже в качестве полнофункциональной системы мониторинга состояния сервера, Monit может оказаться очень полезным инструментом для любого системного администратора, обслуживающего Linux-серверы. В данной статье я постараюсь описать методику установки Monit на локальный сервер (в качестве резервной системы мониторинга его состояния) с целью мониторинга состояния его основных служб. С помощью данного примера я продемонстрирую лишь малую часть возможностей Monit.

Установка Monit в Linux

В репозиториях большинства дистрибутивов Linux уже присутствует пакет с компонентами Monit.

Debian, Ubuntu или Linux Mint:

$ sudo aptitude install monit

Fedora или CentOS/RHEL:

В CentOS/RHEL вам в первую очередь придется подключить либо репозиторий EPEL, либо репозиторий Repoforge.

# yum install monit

В комплекте поставки Monit присутствует очень хорошо документированный файл конфигурации с множеством примеров. Основной файл конфигурации расположен по пути /etc/monit.conf в дистрибутивах Fedora/CentOS/RHEL или /etc/monit/monitrc в дистрибутивах Debian/Ubuntu/Mint. Файл конфигурации Monit содержит две секции параметров: секцию глобальных параметров "Global" и секцию параметров сервисов "Services".

Секция глобальных параметров файла конфигурации: веб-страница с информацией о состоянии сервера

Monit может использовать несколько почтовых серверов для отправки уведомлений о наступлении событий и/или веб-страницу с информацией о состоянии веб-сервера, доступную по протоколам HTTP/HTTPS. Давайте начнем с формулирования требований к этой веб-странице.

  • Monit должен принимать соединения на порту 1966.
  • Доступ к веб-странице должен быть организован с применением защищенного протокола SSL.
  • Для доступа к веб-странице должны использоваться слова "monituser" и "romania" в качестве имени пользователя и пароля соответственно.
  • Доступ к веб-странице должен быть разрешен лишь с локального узла, с узла myhost.mydomain.ro, а также из внутренней сети (192.168.0.0/16).
  • Monit должен хранить SSL-сертификат в формате pem.

При выполнении всех последующих операций, связанных с настройкой Monit, я буду использовать систему, созданную специалистами компании Red Hat. Аналогичные операции могут выполняться и в системе, основанной на дистрибутиве Debian.

В первую очередь следует сгенерировать самостоятельно подписанный сертификат (monit.pem) в директории /var/certs.

# mkdir /var/certs
# cd /etc/pki/tls/certs
# ./make-dummy-cert monit.pem
# cp monit.pem /var/certs
# chmod 0400 /var/certs/monit.pem 

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

set httpd port 1966 and
     SSL ENABLE
     PEMFILE  /var/certs/monit.pem
     allow monituser:romania
     allow localhost
     allow 192.168.0.0/16
     allow myhost.mydomain.ro

Секция глобальных параметров файла конфигурации: уведомления по электронной почте

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

  • Имя узла, на котором установлен почтовый сервер: smtp.monit.ro
  • Адрес электронной почты отправителя, используемый Monit (поле "From"): monit@monit.ro
  • Адрес получателя сообщений электронной почты от демона Monit (поле "To"): guletz@monit.ro
  • Порт почтового сервера, использующего протокол SMTP: 587 (по умолчанию 25)

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

set mailserver  smtp.monit.ro port 587
set mail-format {
 from: monit@monit.ro
 subject: На уровне сервиса $SERVICE произошло событие $EVENT в $DATE на узле $HOST
 message: Monit выполнил действие $ACTION для сервиса $SERVICE ввиду наступления события $EVENT в $DATE на узле $HOST : $DESCRIPTION.
     
       Искренне ваш,
          Monit
  
  }
 
set alert guletz@monit.ro

Как вы могли заметить, Monit позволяет использовать некоторые встроенные переменные ($DATE, $EVENT, $HOST и другие), поэтому вы можете использовать любой формат уведомлений, соответствующий вашим потребностям. Если вы желаете отправлять сообщения электронной почты непосредственно с узла, на котором была осуществлена установка Monit, вам придется установить на нем sendmail-совместимую программу (такую, как postfix или ssmtp).

Секция глобальных параметров файла конфигурации: демон Monit

На следующем этапе необходимо настроить демон monit. Мы будем настраивать его в соответствии со следующими требованиями:

  • Необходимо осуществить первую проверку состояния сервисов по прошествии 120 секунд.
  • Следует проверять состояние сервисов через каждые 3 минуты.
  • Нужно использовать сервис syslog для ведения журнала событий.

Для выполнения приведенных выше требований достаточно разместить следующий блок директив в файле конфигурации:

set daemon 120
   with start delay 240
set logfile syslog facility log_daemon

Также мы должны указать путь к файлу для хранения уникального идентификатора демона monit ("idfile") и путь к директории для хранения сообщений электронной почты, отправленных monit, но не доставленных адресату из-за ошибок сервера SMTP или сети ("eventqueue"). Перед использованием данных директив вы должны убедиться в том, что родительская директория (/var/monit) уже существует. В результате в файл конфигурации следует добавить еще и следующий блок директив:

set idfile /var/monit/id
 set eventqueue
     basedir /var/monit

Тестирование глобальных параметров файла конфигурации

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

#  Секция глобальных параметров
 
# Страница с информацией о состоянии сервера и данные для доступа к ней
set httpd port 1966 and
     SSL ENABLE
     PEMFILE  /var/certs/monit.pem
     allow monituser:romania
     allow localhost
     allow 192.168.0.0/16
     allow myhost.mydomain.ro
 
# Сервер электронной почты для отправки уведомлений о событиях 
set mailserver  smtp.monit.ro port 587
# Формат сообщения электронной почты (уведомления)
set mail-format {
 from: monit@monit.ro
 subject: На уровне сервиса $SERVICE произошло событие $EVENT в $DATE на узле $HOST
 message: Monit выполнил действие $ACTION для сервиса $SERVICE ввиду наступления события $EVENT в $DATE на узле $HOST : $DESCRIPTION.
     
       Искренне ваш,
          Monit
  
  }
 
set alert guletz@monit.ro
 
# Задержки перед проверками состояния сервисов
set daemon 120
   with start delay 240
set logfile syslog facility log_daemon
 
# Пути к файлу с идентификатором демона monit и директории для хранения недоставленных уведомлений
set idfile /var/monit/id
 set eventqueue
     basedir /var/monit

Пришло время проверить корректность заполнения файла конфигурации. Вы можете проверить корректность существующего файла конфигурации (/etc/monit.conf), выполнив следующую команду:

# monit -t
Control file syntax OK

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

monit: Cannot stat the SSL server PEM file '/var/certs/monit.pem' -- No such file or directory
/etc/monit/monitrc:10: Warning: hostname did not resolve 'smtp.monit.ro'

После того, как вы проверите синтаксис файла конфигурации, следует запустить демон monit и подождать 2-3 минуты:

# service monit start

Если вы используете systemd, выполните следующую команду:

# systemctl start monit

Теперь откройте окно веб-браузера и перейдите по адресу https://<узел_с_monit>:1966. Замените <узел_с_monit> на имя узла, на котором была осуществлена установка Monit или его IP-адрес.

Учтите, что в том случае, если вы будете использовать самостоятельно подписанный SSL-сертификат, вы увидите страницу с предупреждением в окне веб-браузера сразу же после перехода по указанному выше адресу.

Страница с предупреждением в окне веб-браузера

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

Веб-страница с информацией о состоянии сервера

Далее в данном руководстве я продемонстрирую методику настройки Monit для мониторинга состояния локального сервера и его основных сервисов. Вы же можете найти огромное количество полезных примеров файлов конфигурации на официальной странице wiki проекта. Все эти примеры готовы к использованию, поэтому вы можете, не опасаясь за последствия, использовать функции копирования/вставки.

Секция параметров сервиса файла конфигурации: мониторинг параметров использования оперативной памяти и центрального процессора

Давайте начнем с организации мониторинга параметров использования оперативной памяти и центрального процессора. Скопируйте следующий блок директив и вставьте его в файл конфигурации:

check system localhost
    if loadavg (1min) > 10 then alert
    if loadavg (5min) > 6 then alert
    if memory usage > 75% then alert
    if cpu usage (user) > 70% then alert
    if cpu usage (system) > 60% then alert
    if cpu usage (wait) > 75% then alert

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

В том случае, если значения каких-либо из рабочих параметров не должны отслеживаться в рамках каждого цикла мониторинга, вы можете использовать следующий формат директивы. Например, в данном случае будет осуществляться проверка значения средней нагрузки на центральный процессор в рамках каждого второго цикла мониторинга (то есть, через каждые 240 секунд):

if loadavg (1min) > 10 for 2 cycles then alert

Секция параметров сервиса файла конфигурации: мониторинг состояния сервиса SSH

Давайте убедимся в том, что в нашей системе присутствует бинарный файл sshd, расположенный по пути /usr/sbin/sshd:

check file sshd_bin with path /usr/sbin/sshd

Нам также нужно убедиться в том, что существует сценарий инициализации для sshd:

check file sshd_init with path /etc/init.d/sshd

Наконец, нам следует убедиться в том, что демон sshd запущен, исполняется и принимает соединения на порту 22:

check process sshd with pidfile /var/run/sshd.pid
   start program  "/etc/init.d/sshd start"
   stop program  "/etc/init.d/sshd stop"
   if failed port 22 protocol ssh then restart
   if 5 restarts within 5 cycles then timeout

В частности, мы можем интерпретировать приведенный выше блок директив следующим образом. В первую очередь осуществляется проверка наличия в системе процесса с именем sshd и pid-файла демона (/var/run/sshd.pid). Если в системе не обнаруживается хотя бы одной из двух упомянутых сущностей, осуществляется перезапуск демона sshd с помощью его сценария инициализации. После этого осуществляется проверка поддержки процессом, принимающим соединения на порту 22, протокола SSH. В том случае, если процесс не обслуживает клиентов по протоколу SSH, осуществляется перезапуск демона sshd. Если в рамках 5 последних циклов мониторинга (то есть, в течение последних 5x120 секунд) было осуществлено как минимум 5 операций перезапуска, демон sshd признается некорректно функционирующим и никаких попыток проверки его состояния более не предпринимается.

Мониторинг состояния сервиса SSH

Секция параметров сервиса файла конфигурации: мониторинг состояния сервиса SMTP

Теперь давайте настроим механизм проверки состояния удаленного почтового сервера, использующего протокол SMTP (запущенного на узле с адресом 192.168.111.102). Давайте предположим, что посредством сетевого интерфейса упомянутого узла можно получить доступ к серверам, использующим протоколы SMTP, IMAP и SSH.

check host MAIL with address 192.168.111.102
   if failed icmp type echo within 10 cycles then alert
   if failed port 25  protocol smtp then alert
             else if recovered then exec "/scripts/mail-script"
   if failed port 22  protocol ssh  then alert
   if failed port 143 protocol imap then alert

Здесь в первую очередь проверяется, отвечает ли узел на запросы по протоколу ICMP. Если не удается получить ответ по протоколу ICMP в рамках 10 циклов мониторинга, отправляется соответствующее уведомление. В том случае, если сервер, принимающий соединения на порту 25, не обслуживает клиентов по протоколу SMTP, также отправляется уведомление. Если же следующая после неудачной проверка завершается успешно, исполняется указанный сценарий (/scripts/mail-script). Кроме того, если серверы, принимающие соединения на портах 22 и 143 не обслуживают клиентов по протоколам SSH и IMAP соответственно, также отправляется уведомление.

Заключение

В данной статье я постарался продемонстрировать методику настройки демона Monit с целью организации мониторинга состояния локального сервера. В плане возможностей Monit была показана лишь вершина айсберга. Вам стоит выделить немного времени и самостоятельно прочитать страницу руководства Monit (которая содержит очень полезную информацию). Monit может стать отличным помощником любого администратора Linux-систем благодаря простому и понятному синтаксису файлов конфигурации. Если вы добавите Monit к уже существующей централизованной системе мониторинга, использующей удаленный сервер, вы, без сомнения, повысите ее надежность. А что вы думаете о Monit?