Для мониторинга серверов или сетевых устройств существует множество программных решений, многие из которых требует ресурсов сервера для развертывания и знаний по настройке. Но если у Вас один или несколько серверов или маршрутизатор с белым* IP то нет надобности развертывать сложную структуру мониторинга только для того, чтобы проверять, доступен ли сервер или маршрутизатор. Достаточно создать простого телеграм бота, который будет отправлять Вам уведомление в телеграм, если проверяемый IP недоступен (down) и когда снова доступен (up). Сам бот будет работать 24/7 на виртуальном сервере под управлениям операционной системы Linux, с минимальной нагрузкой на ресурсы.
* белый IP адрес - это уникальный IP адрес, выданный на устройство или сервер и доступен из интернета. Такой IP является публичным.
Что необходимо сделать:
1. В Telegram создать бота и приватный канал, в который добавить бота. В канал Вы можете приглашать тех, кто тоже может наблюдать за мониторингом
2. Установить на сервере python3. В этой статье мы рассмотрим размещение бота на виртуальном сервере с ОС Ubuntu 20.04 (можно разместить на любой ОС, на которой можно установить пакет python3)
3. Создать скрипт-файл, прописать в нем IP хостов (серверов или маршрутизаторов), установить период мониторинга и запустить с крипт в режиме работы 24/7.
Приступим к выполнению.
1. Для регистрации нового телеграм бота, необходимо в приложении Telegram найти бот-сервис @BotFather и отправить ему команду регистрации нового бота
/newbot
Далее @BotFather запросит название для нашего бота. Ограничений в названии нет, введем, например:
IP monitoring
Теперь необходимо ввести уникальное имя бота в системе Telegram. Название бота должно оканчиваться на _bot. Назовем, для примера
ip_monitoring_super_bot
После этого, @BotFather предоставит нам TOKEN, с помощью которого можно управлять ботом. TOKEN необходимо сохранить, так как он понадобиться нам позже.
Телеграм бот зарегистрирован.
Теперь создадим приватный канал, в который наш новый бот с именем @ip_monitoring_super_bot будет отправлять сообщения.
Для этого в окне чатов программы Telegram нажимаем на иконку создания нового сообщения и выбираем New chanel - Create chanel - придумываем название каналу (например, IP monitoring chanel) - выбираем тип канала Private и добавляем бота @ip_monitoring_super_bot.
В результате мы получаем приватный канал, в который бот @ip_monitoring_super_bot будет отправлять сообщения о состоянии оборудования, которое мы мониторим. Также в этот канал можно пригласить по специальной ссылке любого пользователя телеграм.
Следует обратить внимание и проверить в свойствах канала IP monitoring chanel, добавлен ли бот @ip_monitoring_super_bot в качестве администратора канала. Чтобы перейти в свойства канала, достаточно нажать на названии канала.
Также нам понадобится значение chat_id. Для этого необходимо:
- перейти в чат бота @ip_monitoring_super_bot и отправить сообщение /start (это запустит бота в работу)
- сделать тестовое сообщение (любое) в канале IP monitoring chanel
- перейти в браузере по ссылке https://api.telegram.org/botTOKEN/getUpdates
В нашем примере ссылка будет в таком виде:
https://api.telegram.org/bot5921115541:AAHltzyZpC_MBZzydhrOD_Brn8lnKNf7XXX/getUpdates
Результат на экране будет таким:
Итак, запомним 2 важных значения для управления ботом:
token= 5921115541:AAHltzyZpC_MBZzydhrOD_Brn8lnKNf7XXX
chat_id = -100185915XXX
2. Подключимся к серверу по SSH (как это сделать)
Проверим установлен ли python3:
python3 --version
Если python3 не установлен (ошибка: -bash: python3: command not found), необходимо установить командой
- для Ubuntu:
apt install python3 -y
- дляCentOS
yum install python3 -y
Дополнительно установим модуль requests:
pip3 install requests
После установки можно проверить еще раз версию. Может быть приблизительно так:
Более подробно об установке python3: Как установить Python 3.10 на Ubuntu 20.04
3. Создадим папку, в которой будет размещен скрипт мониторинга. Для этого выполним команду:
cd && mkdir pingmonitor && cd pingmonitor
Создадим и откроем файл
vim main.py
и разместим в нем скрипт:
#----------------------------------------------------
import os
import requests
import time
#-------------------------
hostname = ['8.8.8.8','1.1.1.1']
time_pause = 30
#-------------------------
def SendMsgToTelegramChanel(msg):
token="TOKEN"
chat_id = 'CHAT_ID'
params = {'chat_id': chat_id,'text': msg}
response = requests.get('https://api.telegram.org/bot'+token+'/sendMessage', params=params)
def IsHostAlive(host):
ret = os.system('ping -c 2 {} > /dev/null'.format(host))
if ret == 0:
return True
return False
while True:
for i in range(len(hostname)):
file_signal = hostname[i] +'_down'
if IsHostAlive(hostname[i]):
if os.path.isfile(file_signal):
os.remove(file_signal)
SendMsgToTelegramChanel(hostname[i] + ' is up')
#print(hostname + ' is up!')
else:
if not os.path.isfile(file_signal):
open(file_signal,'tw').close()
SendMsgToTelegramChanel(hostname[i] + ' is down')
#print(hostname + ' is down!')
time.sleep(time_pause)
#------------------------------------------------
- в скрипте следует заменить TOKEN и CHAT_ID на сохраненные ранее значения token и chat_id.
- в строке hostname = ['8.8.8.8','1.1.1.1'], вместо IP 8.8.8.8 и 1.1.1.1 укажите IP (или hostname) Вашего сервера или маршрутизатора, которые необходимо мониторить*. IP адреса устройств следует указывать в одинарных кавычках и через запятую (если IP больше чем один)
- значение переменной time_pause = 30, указывает период проверки (в секундах). Не рекомендуется устанавливать меньше 10-15 секунд, особенно, если список проверяемых IP большой.
- не удаляйте отступы строк в скрипте. Это может привести к синтаксической ошибке.
(*)скрипт использует метод проверки через отправку icmp пакетов (ping), по этой причине, следует убедится, что на сервере или маршрутизаторе (которые мониторятся) не блокируются ping-запросы.
Теперь все готово для запука скрипта.
Так как скрипт должен работать 24/7, чтобы его работа не отображалась на основном экране консоли, запустим его в отдельном "окне" с помощью утилиты screen (если не установлена, установите ее. Более подробно: Основы работы с утилитой screen).
Для этого выполним команду:
screen -S pingmonitor
и перейдем к папку с файлом скрипта:
cd && cd pingmonitor
Запустим скрипт в работу командой:
python3 main.py
Чтобы выйти из сеанса и оставить работающим наш скрипт, нажмите Ctrl+a+d. Теперь SSH консоль можно закрывать.
Чтобы подключиться к сеансу с работающим скриптом, подключитесь к серверу по SSH и выполните команду:
screen -r pingmonitor
В случае, если сервер или маршрутизатор станет недоступен и после того, как станет доступным, Вы получите сообщение в канале IP monitoring chanel.