opened image

Как создать телеграм бота для мониторинга удаленных хостов

Для мониторинга серверов или сетевых устройств существует множество программных решений, многие из которых требует ресурсов сервера для развертывания и знаний по настройке. Но если у Вас один или несколько серверов или маршрутизатор с белым* 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.