Следим за сервером целиком

Задача

Почти для всех серверов нужно следить за рядом стандартных вещей, как то средняя загрузка (load average), открытые порты, свободное место на диске, итд. И хочется, чтобы это делалось легко.

Быстрое решение

Давайте сначала быстро решим поставленную задачу, а потом разберемся, что мы сделали.

В прошлой задаче мы установили okerrclient командой sudo pip install okerrclient. Давайте установим его конфигурацию по умолчанию:

cp /usr/local/okerrclient/conf/okerrclient.conf /etc

Затем, отредактируем файл конфига:

textid=YourProjectTextID
secret
keyuser = client
keypass
sequence = [ MKSEQ servers:$_name|conf:anyserver ]
tpconf = [ RUN:safebin=dig ]

Укажите textid вашего проекта (как его узнать, описано в прошлой задаче), а прочее содержимое можно пока оставить по-умолчанию.

И теперь, сам магический момент - выполните команду sudo okerrclient (да, просто так, без параметров). Вы увидите что-то вроде:

xenon@braconnier:~$ sudo okerrclient 
okerr updated braconnier:uptime = 360814
okerr updated braconnier:la = 0.41
okerr updated braconnier:df-/ = 43.7
okerr updated braconnier:myip = 11.22.33.44
okerr updated braconnier:opentcp = 22(sshd) 25(master) 80(apache2) 139(sm..
okerr updated braconnier:version = 2.0.26 (oneline)
okerr updated braconnier:df-inodes-/ = 5
okerr updated braconnier:maxlogsz = 2841698

И все! Вы сообщили на okerr все ключевые данные о состоянии сервера.

Небольшой обзор

Итак, давайте посмотрим, что мы имеем "из коробки".

В контрольной панели индикаторов нажмите на название индикатора чтобы перейти на страницу с его параметрами.

Свободное место на дисках (df, df-inodes)

Наблюдаются все подмонтированные разделы (кроме тех, что монтируются на loop устройства), отслеживается как место, так и количество inode.

По-умолчанию, для объема свободного места на дисках в качестве порогового значения используется 80%. Если вы хотите, вы можете изменить это значение (параметр maxlim в разделе "Аргументы"). Okerr вышлет алерт только если полученное значение превышает этот предел. (Но вы можете при желании даже настроить его хитрее, например, получать оповещение если место забивается гораздо быстрее чем обычно - далее мы опишем, как это сделать)

Загрузка сервера (la)

Load average, как выводится в команде uptime.

На некоторых серверах значение Load Average часто "скачет" (если там скачет нагрузка на сервер), а получать частые ложные алерты про это - не хочется. Чтобы избавиться, есть три варианта. Во-первых, можно "задрать" пороговое значение (maxlim) повыше, в соответствии с той нагрузкой, которая для вашего сервера считается действительно необычно высокой и заслуживающей внимания. Скажем, не 1, а 5. В этом случае, вы получите оповещение если сервер уж очень сильно перегружен. Во-вторых, можно просто установить флаг silent ("тихий") на индикатор - и тогда он в принципе не будет никогда высылать оповещения. Но при этом, информация будет собираться, и вы будете ее видеть из контрольной панели. И в третьих, на страничке индикатора справа вверху есть "Пользовательские настройки". Флажок subscribe (по-умолчанию он включен всегда для всех индикаторов) означает, что вы подписаны на оповещения от этого индикатора. Если вы его уберете - вы отпишитесь и не будете получать больше оповещений от него (но другие участники вашего проекта - будут).

Максимальный размер лог-файла (maxlogsz)

Проверяются все файлы внутри /var/log/. Это очень удобно, чтобы обнаружить какие-то логи, по которым не настроена (или не работает) ротация, и они постоянно растут. Или же на сервере постоянно сложилась какая-то нездоровая ситуация, и лог-файлы с сообщениями об ошибках очень быстро растут. Лучше заметить такую ситуацию как можно раньше, до того как кончится место.

IP адрес (myip)

Внешний адрес сервера. Мы узнаем его командой:

dig +short myip.opendns.com @resolver1.opendns.com

(поэтому okerrclient хочет чтобы на сервере была установлена утилитка dig). Спасибо сервису OpenDNS за такую удобную возможность.

Очень удобно, если вы вдруг забыли доменное имя сервера, или если два сервера сообщают на okerr данные используя одинаковый префикс (имя сервера).

Открытые TCP порты (opentcp)

Этот индикатор - один из примеров того, как okerr отличается от других систем мониторинга. Индикатор имеет тип (метод проверки) String, c тремя флагами: reinit, dynamic, text. Дальше эти флаги будут описаны подробнее, но сейчас важно свойство этого индикатора - этот индикатор (благодаря флагу dynamic) будет всегда "зеленым" (статус OK), но будет оповещать вас об изменении своего значения. Если вдруг на системе появится новый слушающий порт или перестанет слушаться порт, который слушался до этого - окерр сгенерирует оповещение.

uptime

Просто - аптайм сервера. С одной стороны - это просто информация, которую иногда хочется знать (и видеть аптайм всех сервером). С другой - это пример числового типа индикатора (Numerical). B его аргументах вы увидите текущее значение uptime в секундах, а так же diffmin (равно нулю). Diffmin - минимально допустимое отклонение наблюдаемой величины. Если сервер перезагрузится, следующая проверка сообщит новое значение uptime, оно будет гораздо меньше предыдущего, то есть, разница между ними будет отрицательной (меньше нуля). Так как это меньше значения diffmin - окерр пошлет вам оповещение, и вы будете знать, что сервер почему-то был перезагружен.

Версия okerrclient (version)

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

Как все это шайтанство работает!?

Все скрипты для выполняемых проверок хранятся на сервере. Стандартные - в разделе Okerr script library. Можно изменять, удалять или добавлять новые проверки. Если вы сделаете изменение на сервере - оно автоматически отразится на всех клиентах, которые используют эту проверку. Это очень удобно для управления большими количествами серверов. Подробнее, в документации, в разделе Справочник, глава Управление мониторингом.

При запуске, okerrclient читает файл конфигурации (/etc/okerrclient.conf). Значения из него аналогичны '--' параметрам. Например, строчки конфига:

textid=YourProjectTextID
secret

действуют аналогично параметрам --textid=YourProjectTextID --secret, устанавливающим id проекта и пустой секрет для обновления.

Среди прочих параметров, нам интересен: sequence = [ MKSEQ servers:$_name|conf:anyserver ]. Это скрипт (правда, всего из одной команды) на языке "Sequence". Команда MKSEQ обращается к базе ключей проекта, сначала по адресу servers:$_name ($_name заменяется на имя сервера, по-умолчанию - имя хоста), если по этому адресу ничего нет - то обращается к conf:anysever. Получает из базы ключей код скриптов и исполняет их. (Подробнее - в справочнике по языку Sequence). Именно эти скрипты выполняют все вышеописанные проверки.

Автозапуск

Было бы удобно, чтобы okerrclient автоматически сам сообщал на сервер свежие данные. Можно это сделать несколькими путями:

Запуск из cron

Cамый обычный способ. Просто раз в час запускайте /usr/local/okerrclient (лучше не в 0 минут, а в случайное время - так будет меньше пиковая нагрузка и ниже риск, что сервер не сможет принять обновление). Можно сократить время до 20 минут (меньше, для обычной серверной информации - не рекомендуется). Таким образом, даже в случае временной потери связи между вашим сервером и сервером okerr следующее обновление пройдет успешно до срабатывания таймаута. crontab, /etc/cron.d/, /etc/cron.hourly/ - любой удобный вам способ.

Обратите внимание, для индикаторов с политикой по умолчанию период - 1 час. Если вы будете обновлять их раз в час, и случайно проверка задержится на несколько секунд или даже минут - ничего страшного не случится, так как есть еще и Patience (20 мин) - время ожидания, в течение которого статус индикатора не будет сброшен в ERR. (Обновление должно случиться в течение period+patience=80 минут от момента предыдущего обновления).

systemd сервис

Если ваша система поддерживает systemd, вы можете удобно запускать okerrclient как systemd сервис.

Убедимся, что наша система на systemd. Запустите команду systemctl, если она выведет длинный список unit'ов - все отлично, двигаемся дальше. Если такой команды нет - этот вариант не для вас, используйте другой (cron, init.d).

Установим (от root) unit-файл сервиса okerrclient: cp /usr/local/okerrclient/systemd/okerrclient.service /etc/systemd/system/okerrclient.service

Запустим его работать прямо сейчас: systemctl start okerrclient

Убедимся, что он запустился:

root@mx:~# systemctl status okerrclient
● okerrclient.service - okerr client daemon
   Loaded: loaded (/etc/systemd/system/okerrclient.service; enabled)
   Active: active (running) since Thu 2017-02-02 17:08:35 CET; 3s ago
 Main PID: 30288 (python)
   CGroup: /system.slice/okerrclient.service
           └─30288 /usr/bin/python /usr/local/bin/okerrclient -d --fg

Feb 02 17:08:36 mx python[30288]: okerr updated mx:df-/ = 49.1
Feb 02 17:08:36 mx python[30288]: okerr updated mx:df-/opt = 52.1
Feb 02 17:08:36 mx python[30288]: okerr updated mx:myip = 11.22.33.44
Feb 02 17:08:36 mx python[30288]: okerr updated mx:opentcp = 22(sshd)
Feb 02 17:08:36 mx python[30288]: 25(master..
Feb 02 17:08:37 mx python[30288]: okerr updated mx:version = 2.0.23 (_dict_)
Feb 02 17:08:37 mx python[30288]: okerr updated mx:df-inodes-/ = 13
Feb 02 17:08:37 mx python[30288]: okerr updated mx:df-inodes-/opt = 8
Feb 02 17:08:37 mx python[30288]: okerr updated mx:maxlogsz = 17471521

Включим его для автозапуска при загрузке: systectl enable okerrclient

Все готово!

init.d (SysV)

Если система построена на SysV, а не systemd, то тогда:

Скопируем (от root) init.d скрипт:

cp /usr/local/okerrclient/init.d/okerrclient /etc/init.d/

Запустим:

/etc/init.d/okerrclient start

Проверим:

/etc/init.d/okerrclient status

Включим в автозапуск при загрузке:

update-rc.d okerrclient defaults

Безопасность

Для безопасности так же стоит установить пароли для базы ключей и доступа к индикаторам. Подробнее про это - в разделе "Безопасность" справочника.

Для того, чтоб okerrclient мог выполнить все проверки, нужно его запускать от root. Для полной проверки требуется, например, взять размер всех файлов внутри /var/log, и некоторые каталоги могут быть открыты только для пользователя root. Если вам не хочется запускать от рута - можно запускать от обычного пользователя, но для этого лучше под каждый сервер настроить на okerr такие проверки, которые успешно работают не требуя доступа от имени root.

Второй раз уже проще

Итак, короткий чеклист, что нужно сделать чтобы подключить новый сервер к okerr:

  • Установить okerrclient (sudo pip install okerrclient)
  • Вспомнить или посмотреть textid (А так же, возможно, параметры безопасности: keyuser, keypass, secret)
  • Скопировать конфиг /usr/local/okerrclient/conf/okerrclient.conf в каталог /etc/
  • Отредактировать файл /etc/okerrclient.conf и указать там эти значения
  • В зависимости от используемого типа инициализации системы (SysV / systemd) организовать запуск okerrclient при загрузке, либо установить в cron.

Все это суммарно занимает около 10 минут.

Ooops!

Если что-то пошло не так - перейдите в раздел Решения проблем. Все решается достаточно просто.