Работая в технической поддержке помимо всех обязанностей была обязанность следить и за работой каналов связи, а это все осуществлялось по средством сервиса Grafana который брал нужные метрики из Zabbix. Ну а так как сама специфика работы такова что ты не всегда сидишь за своим рабочем местом, возникла идея это все немного автоматизировать и сделать так чтобы в случае падения канала связи ты получил оповещение на телефон, например в мессенджер. Но дело в том что доступа к системе zabbix у меня не было и расширенного доступа к Grafana также (и да, я знаю что grafana тоже умеет отправлять алерты).
Так как же это сделать подумал я. Подумав немного я нашел решение. Понимаю, мое решение на какое-то открытие не претендует. Так может будет полезно, а может кто-то предложит что-то. Или же кто-то скажет что все плохо.
Логика работы проста, я с помощью команды ping проверяю доступность канала, соответственно если ping не прошел, то в 99% канал недоступен.
Для начала я сделал самого бота, через slack-api.
Зашел на api slack https://api.slack.com/apps
Перешел на страницу your apps
Создал бота
Далее создал вебхук и выбрал канал с которым он будет взаимодействовать получилось что-то на подобии https://hooks.slack.com/services/xxxxxxxxxxx/xxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxx
Также сгенерировался автоматом код bash с помощью которого можно из терминала отправлять разные сообщения, Типа hello World. Вот это код будем использовать для отправки алертов
Далее переходим к созданию скрипта который будет делать нужную работу для нас
#!/bin/bash
provider1=xxx.xxx.xxx.xxx
if /bin/ping -c 2 $sevlig > /dev/null 2> /dev/null
then
echo 'канал в норме';
else
curl -X POST -H 'Content-type: application/json' --data '{"text":" недоступен канал provider1"}' https://hooks.slack.com/services/xxxx/xxxx/xxxxxx;
fi
Пояснения к коду
#!/bin/bash - это начало скрипта(UPD: правильно меня поправили, это в какой оболочке будет скрипт выполняться)
provider1=xxx.xxx.xxx.xxx
переменные которым присвоено значение, в данном случае ip-адрес провайдера
if /bin/ping -c 2 $sevlig > /dev/null 2> /dev/null
здесь мы запустили команду ping
/bin/ping -c 2 - сама команда ping, отправляем два пакета и ждем ответ
> /dev/null 2> /dev/null - перенаправление результата выполнения команды в null, так как нам текст выполнения команды не нужен, нам нужен код возврата
если код возврата равен 0, то значит все пакеты были доставлены без потерь.
then echo 'канал в норме';
- тут скрипт выводит сообщение, если был код возврата 0, т.е. потерь не было и на этом работа скрипта завершается.
else curl -X POST -H 'Content-type: application/json' --data '{"text":" недоступен канал provider1 }' https://hooks.slack.com/services/xxxxxxxx/xxxxxxxxxxx/xxxxxxxxxxxxxxxx;
если код возврата был не 0, а другой, т.е. были потери, значит есть проблемы с доступностью канала, тогда выполняется вторая часть команды и она отправляет уже сообщение через curl через webhook в канал slack
fi - оператор окончания скрипта
Сохраняем все это как скриптовый файл bash и делаем исполняемым
Далее автоматизируем работу скрипта чтобы он мог сам запускался раз в 10 минут, для этого я использовал crontab
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
*/10 * * * * /home/us/1.sh
И вот в случае падения канала, мы в slack видим такое:
Спасибо что дочитали.