Проверка запущенных демонов

Задача

Есть linux сервер на SystemD, нужно убедиться, что на нем запущены нужные нам службы.

Скрипт

LIST apache2 postfix
FORK
NAME $_name:$_str
RUN /bin/systemctl status $_str
EVAL _data['code']==0

Пояснение

LIST apache2 postfix - Создаем список сервисов, которые будем наблюдать. (Если понадобиться добавить еще - просто добавим его сюда)

FORK - Так как в данных у нас список, то fork создаст 2 потока исполнения, один для каждого элемента.

NAME $_name:$_str - $_str будет заменено на строковое значение данных. Если изначально $_name было именем сервера (www1, например), то потоки будут теперь называться www1:apache2 и www1:postfix

RUN /bin/systemctl status $_str - Аналогично, $_str заменится, будет вызвана команда systemctl (e.g. /bin/systemctl status apache2), которая возвратит словарь (структуру) с результатами исполнения. Поле code в том словаре будет содержать код завершения systemctl

EVAL _data['code']==0 - Выполняется проверка, что systemctl завершился с кодом 0. Если это так, то будет "OK". Иначе - "ERR".

Примечание

Для того чтобы RUN мог запустить /bin/systemctl, нужно явно это разрешить. При использовании okerrclient из командной строки, это можно сделать опцией:

$ okerrclient --tpconf RUN:safebin=/bin/systemctl ...

Либо же нужно добавить это в файл конфигурации (/etc/okerrclient.conf):

tpconf = [ RUN:safebin=dig, RUN:safebin=/bin/systemctl ]

Проверка бэкапов

Задача

Есть сервер бэкапов, на нем, в каталоге /opt/backup/physical/ хранятся бэкапы с физических серверов, каждый в своем подкаталоге:

./formagginix/formagginix-etc.20161203.master.tar.gz
./formagginix/formagginix-etc.20161204.master.tar.gz
./formagginix/formagginix-etc.20161205.master.tar.gz
./formagginix/formagginix-etc.20161202.master.tar.gz
./formagginix/formagginix-etc.20161206.master.tar.gz
./obelix/obelix-all-mysql-databases.20161202.sql.gz
./obelix/obelix-etc.20161202.master.tar.gz
./obelix/obelix-usr-local-apache-htdocs.20161206.master.tar.gz
./obelix/obelix-etc.20161203.master.tar.gz
./obelix/obelix-all-mysql-databases.20161204.sql.gz
./obelix/obelix-etc.20161205.master.tar.gz
./obelix/obelix-etc.20161206.master.tar.gz
./obelix/obelix-usr-local-apache-htdocs.20161202.master.tar.gz

Периодически добавляются новые бэкапы. Например, мы начинаем бэкапировать не только файлы вебсайтов, но и базу данных. Так же периодически появляются новые сервера.

Каждый бэкап содержит свою дату в виде 8 цифр, в формате YYYYMMDD (20161206).

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

Так же, в этом подкаталоге есть и другие файлы (например, логи скриптов бэкапа), которые не должны обрабатываться как бэкапы.

Скрипт

NAME $_name:backup
METHOD numerical minlim=102400
TAG backup
DIR path=/opt/backup/physical/ maxdepth=2
FILTER type=="REG"
GREP field=basename re="\.gz$"
FILTER mage<86400
REPLACE field=basename search="\d{8}" replace=DATE dest=tplname
FORK
NAME $_name:$tplname
DETAILS $basename: $size bytes
FORMAT $size

Пояснение

NAME - добавляем ':backup' к имени индикатора. Например, если скрип исполняется на сервере alpha, имя будет alpha:backup

METHOD - создаваемый индикатор будет содержать размер файла бэкапа. Поэтому тип индикатора - numerical, minlim = 102400 (бэкап менее 100кб выглядит очень подозрительно)

TAG - для удобства, все создаваемые индикаторы будут иметь метку 'backup'.

DIR path=/opt/backup/physical/ maxdepth=2 - Получаем список всех файловых записей в этом подкаталоге и во вложенных подкаталогах.

FILTER type=="REG" - Оставляем только те из них, где type=="REG", то есть - обычные файлы.

GREP field=basename re="\.gz$" - Снова фильтруем, на этот раз по регулярным выражениям. В списке останутся только файлы формата .gz, не будет файлов .log итд.

FILTER mage<86400 - И еще раз фильтруем (можно было соединить обе команды FILTER в одну, через 'and'), на этот раз по времени модификации (mtime). Оставляем только свежие файлы, которые модифицированы менее суток назад.

REPLACE field=basename search="\d{8}" replace=DATE dest=tplname - Для каждой записи о файле, ищем в ней шаблон времени и заменяем его на строку "DATE". Результат записываем в новое поле 'tplname' (имя шаблона). Таким образом, запись про файл servername-etc-20161205.tar.gz будет теперь содержать поле tplname: servername-etc-DATE.tar.gz . tplname будет одинаков для файлов от любой даты, а благодаря фильтрации выше, мы будем обрабатывать только бэкапы за последние сутки.

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

NAME $_name:$tplname - Каждая последовательность устанавливает себе новое имя. Например: alpha:backup:servername-etc-DATE.tar.gz

DETAILS $basename: $size bytes - Устанавливаем текстовые детали (пояснение) к значению индикатора.

FORMAT $size - извлекаем из структуры данных только поле size.

Теперь в индикатор alpha:backup:servername-etc-DATE.tar.gz запишется размер сегодняшнего бэкапа. Если индикатора нет - он будет создан.

Если бэкап пустой или очень маленький - okerr установит статус ERR и вышлет алерт, так как нарушится условие minlim.

Если вдруг на сервере бэкапов перестанут появляться новые бэкапы с какого-то сервера, то после команды FILTER mage<86400 данные о старых бэкапах будут отброшены, и индикатор не будет обновлен. По истечении времени (в соответствующей политике) okerr переведет индикатор в состояние ERR и вышлет алерт.