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