Содержание
Скрипты для системы мониторинга Nagios
Отправка СМС
В скрипте для отправки сообщений используется программа gnokii. С небольшими правками скрипта можно переделать на использование gammu. Описаний настройки gnokii/gammu не привожу, они выходят за рамки описания скрипта.
Для диагностических целей скрипт пишет свои действия в лог-файл /var/log/nagios4/sendsms.log
"set -o pipefail" в данном скрипте необязателен, но я почти всегда задаю опцию pipefail, которая указывает оболочке, что код завершения конвейера будет совпадать с первым ненулевым кодом завершения одной из команд конвейера или же нулю в случае, если все команды завершились корректно
Если отправка оповещений делается нескольким адресатам, то параллельное обращение к модему/телефону приведет к тому, что какие-то смс не будут доставлены. Чтобы этого избежать я делаю отправку в цикле, пока она не будет успешной (код возврата 0). Чтоб в случае постоянной ошибки скрипт не ушел в бесконечный цикл ограничиваю число попыток отправки (100 попыток думаю достаточно)
"LANG=ru_RU.UTF-8" перед выполнением программы gnokii нужно, чтоб кириллический текст в смс нормально отображался.
Отправка оповещений в Telegram
Для работы скрипта в нем нужно задать правильные параметры телеграм-канала: TOKEN и CHAT_ID
Проверка загрузки CPU
Для проверки загрузки процессора используется программа mpstat (входит в состав пакета sysstat)
Проверка состояния сетевого интерфейса
Пинг большими нефрагментированными пакетами
Зачем? Ну например для проверки линков с включенным JumboFrame.
Сравнение локального файла с файлом на удаленной системе
Область применения - например проверка идентичности конфиг-файла на двух серверах.
Сравнение делается с помощью подключения по ssh. Для корректной работы скрипта требуется настроить ключи ssh для пользователя из под которого будет работать скрипт.
Модифицированная версия. Может сравнивать несколько файлов заданных шаблоном (напр. /etc/application/*.conf)
Проверка DNS-записей на соответствие заданным
В nagios-plugins есть check_dns, который позволяет (кроме другого функционала) проверить соответствуют ли записи о домене на днс-сервере желаемым. Однако check_dns не дружит с интернациональными доменами, даже если указать домен в punycode. Поэтому может потребоваться скрипт ниже.
Пример запуска скрипта
check_dns_recs.sh domain.com 1.1.1.1,2.2.2.2 8.8.8.8
В этом примере проверяется соответствуют ли записи домена domain.com на сервере 8.8.8.8 списку 1.1.1.1, 2.2.2.2
Адреса в списке можно указывать разделяя их между собой запятыми. Скрипт проверяет только А-записи (может позже это исправлю).
В основном действия в скрипте несложные. Немного описать имеет смысл следующую строку:
host -t $TYPE $DOMAIN $SERVER|grep "$DOMAIN has address "|grep -oE '[^ ]+$'|sort|tr '\n' ','|sed s/,$//
- grep -oE '[^ ]+$' - эта команда удаляет из строк все кроме последнего слова, а в последнем слове содержатся требуемые адреса домена. Если разделителем слов будет не только пробел, но и другие разделители, то может понадобиться преобразовать регулярное выражение [^ ] к виду [^[:space:]]
- sort - если не отсортировать вывод, то порядок запиесей может меняться и при сравнении один и тот же список адресов не совпадет с заданным шаблоном.
- tr '\n' ','|sed s/,$// - зменяем все переводы строк запятыми (объединяем строки в одну с разделителем запятая) и удаляем лишнюю запятую в конце строки.
Проверка является ли заданный сервер кластера PgPool-II primary-хостом
check_pgpool_node_is_primary.sh pg_master_host
Проверка состояния streaming-репликации PostgreSQL-серверов через PgPool-II
Скрипт на пгпуле определяет который из серверов является мастером. Затем на мастере проверяется статистика по репликации.
Если позиции (LSN) в журналах различаются (не все отправлено на слейв, не все записано, не все подтверждено), то будет выдано предупреждение
Если состояние репликации будет не streaming, то будет выдано критическое состояние
В графики из получаемых данных ничего не запишешь, но все-таки я вывожу в них код завершения нагиос-скрипта. Это будет полезно для статистики. Коды возврата: E_OK=0;E_WARN=1;E_CRIT=2;E_UNKNOWN=3