3 Способа описано тут на serveradmin
Так как у меня версия zabbix 4.2 первый способ из коробки мне не подходит Администрирование -> Способы оповещений и выбирайте там Telegram Webhook. Его просто нет, есть он начиная с версии zabbix 5.
Создаем Телеграм Бота.
В контакты @BotFather и пишем ему сначала /start, потом /newbot.
Придумываем имя для бота и отправляем Например: @dst_bot
Сделано! Поздравляю с вашим новым ботом. Вы найдете его по адресу t.me/dst_bot .
Теперь вы можете добавить описание, раздел "О боте" и фотографию профиля для своего бота, список команд см. в разделе /справка.
Кстати, когда вы закончите создавать своего классного бота, свяжитесь с нашей службой поддержки ботов, если вам нужно лучшее имя пользователя для него.
Просто убедитесь, что бот полностью работоспособен, прежде чем вы это сделаете.
Используйте этот токен для доступа к HTTP API: 0000000000:AAH83NQPM4ejWj5IcrA6ICgwok9rmYfV-Gs
Имя бота и токен не настоящие выдуманные для примера.
Описание API-интерфейса бота см. На этой странице: https://core.telegram.org/bots/api
Ботфатер, [08.12.2021 15:00]
Я могу помочь вам создавать телеграмм-ботов и управлять ими.
Если вы новичок в API ботов, пожалуйста, ознакомьтесь с руководством (https://core.telegram.org/bots).
Вы можете управлять мной, посылая эти команды:
/newbot - создайте нового бота
/mybots - отредактируйте своих ботов [бета-версия]
редактировать ботов
/setname - изменить имя бота
/setdescription - изменить описание бота
/setabouttext - изменить информацию о боте
/setuserpic - изменить фотографию профиля бота
/setcommands - изменить список команд
/deletebot - удалить бота
Настройки бота
/токен - сгенерировать токен авторизации
/отозвать - отозвать токен доступа бота
/setinline - переключить встроенный режим (https://core.telegram.org/bots/inline)
/setinlinegeo - переключение встроенных запросов на местоположение (https://core.telegram.org/bots/inline#l ... ed-results)
/setinlinefeedback - изменение встроенной обратной связи (https://core.telegram.org/bots/inline#c ... g-feedback) настройки
/setjoingroups - можно ли добавить вашего бота в группы?
/setprivacy - переключение режима конфиденциальности (https://core.telegram.org/bots#privacy-mode) в группах
Игры
/mygames - редактировать свои игры (https://core.telegram.org/bots/games ) [бета-версия]
/newgame - создать новую игру (https://core.telegram.org/bots/games)
/listgames - получить список ваших игр
/editgame - редактировать игру
/удалить игру - удалить существующую игру
Начните чат с @myidbot Отправьте ему сообщение с командой /getid
Получаем id личного аккаунта. Чтобы его узнать, добавьте бота @my_id_bot и напишите ему /start
Проверяем работу бота
Слово bot и дальше token бота. Пишется все в одно слово.
Код: Выделить всё
curl --header 'Content-Type: application/json' --request 'POST' --data '{"chat_id":"ID-личного телеграм","text":"Проверяю отправку оповещений ботом"}' "https://api.telegram.org/bot0000000000:AAH83NQPM4ejWj5IcrA6ICgwok9rmYfV-Gs/sendMessage"
Предварительно создадим пользователей с правом только на чтение в самом zabbix и базе данных например read, они понадобятся чуть позже
Пример: Для БД (кнопки будут удалить изменить и тд но работать не будут) Так как у меня еще Debian9 x64 последняя версия python 3.5 а требовалась минимум 3.6 установка из исходного когда описана тут
Установка python source code на Debian
Переходим к первому скрипту от автора ableev Zabbix-in-Telegram
Получаем описание, различные контакты, Справку из 23 страниц, и сам скрипт для отправки уведомлений.
Предварительная подготовка если у вас еще не установлен python устанавливаем.
apt-get update
Ставим пакеты:
apt-get install python3-venv python3-pip python-virtualenv
В моем случае установка будет по следующему пути /usr/local/share/zabbix/alertscripts/ может быть /usr/lib/zabbix/alertscripts/ если вы не знаете смотрите в конфигурации заббикс сервера что у вас указано.
Переходим в папку
cd /usr/local/share/zabbix/alertscripts/
Загружаем
git clone https://github.com/ableev/Zabbix-in-Telegram
Переходим
cd /usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram
можно удалить в ней папки .git , bash-old-version
Ставим модули:
(в моем случае я указываю pip3.9 install)
pip3 install -r requirements.txt
Либо если не ставится ставим вручную отдельно
pip3 install PySocks==1.6.8
pip3 install requests==2.20.0
pip3 install requests-oauthlib==0.6.2
pip3 install pyzabbix
pip3 install pysocks - если нужен прокси для подключения
Копируем файл с новым именем:
cp zbxtg_settings.example.py zbxtg_settings.py
Настраиваем конфигурацию
nano zbxtg_settings.py
True - включено
False - выключено
Проверка доступность должно быть код 200 для вашего zabbix
curl -sI http://localhost/zabbix/chart3.php | head -1
ответ должен быть 200 , но localhost - может быть недоступен нужен используем IP
Другие проверки
Код: Выделить всё
# -*- coding: utf-8 -*-
tg_key = "0000000000:AAH83NQPM4ejWj5IcrA6ICgwok9rmYfV-Gs" # api-ключ telegram-бота
zbx_tg_prefix = "zbxtg" # переменная для отделения текста от информации о скрипте
zbx_tg_tmp_dir = "/tmp/" + zbx_tg_prefix # каталог для сохранения кэшей, идентификаторов, файлов cookie и т. Д.
zbx_tg_signature = False
zbx_tg_update_messages = True
zbx_tg_matches = {
"problem": "PROBLEM: ",
"ok": "OK: "
}
zbx_server = "http://192.168.175.111/zabbix/" # полный url-адрес zabbix сервера
zbx_api_user = "read"
zbx_api_pass = "пароль"
zbx_api_verify = False # True - не игнорировать самозаверяющие сертификаты, False - игнорировать
#zbx_server_version = 2 # для версии Zabbix 2.x
#zbx_server_version = 3 # для версии Zabbix 3.x, по умолчанию, еще не все обновились до 4.x
zbx_server_version = 4 # для версии Zabbix 4.x значение по умолчанию будет изменено в будущем с помощью этого
zbx_basic_auth = False
zbx_basic_auth_user = "[b]read[/b]"
zbx_basic_auth_pass = "[b]пароль[/b]"
proxy_to_zbx = None
proxy_to_tg = None
# proxy_to_zbx = "http://proxy.local:3128"
# proxy_to_tg = "https://proxy.local:3128"
# proxy_to_tg = "socks5://user1:password2@hostname:port" # socks5 с именем пользователя и паролем
# proxy_to_tg = "socks5://hostname:port" # socks5 без имени пользователя и пароля
# proxy_to_tg = "socks5h://hostname:port" # разрешение имени хоста на прокси-сервере SOCKS.
# Это помогает, когда интернет-провайдер изменяет DNS-запросы.
# Найдено здесь: https://stackoverflow.com/a/43266186/957508
google_maps_api_key = None # возьми свой ключ для отправки местоположения устройств на карте, смотри https://developers.google.com/maps/documentation/geocoding/intro
zbx_tg_daemon_enabled = False
zbx_tg_daemon_enabled_ids = [6931850, ]
zbx_tg_daemon_enabled_users = ["ableev", ]
zbx_tg_daemon_enabled_chats = ["Zabbix in Telegram Script", ]
zbx_db_host = "localhost"
zbx_db_database = "zabbixdb"
zbx_db_user = "read"
zbx_db_password = "пароль"
emoji_map = {
"Disaster": "🔥",
"High": "🛑",
"Average": "❗",
"Warning": "⚠️",
"Information": "ℹ️",
"Not classified": "🔘",
"OK": "✅",
"PROBLEM": "❗",
"info": "ℹ️",
"WARNING": "⚠️",
"DISASTER": "❌",
"bomb": "💣",
"fire": "🔥",
"hankey": "💩",
}
ZbxTgDaemon.py
Первая строка #!/usr/bin/env python3.9
zbxtg.py
Первая строка #!/usr/bin/env python3.9
Проверка от пользователя zabbix
su - zabbix -s /bin/bash
Проверка из командной строки:
По ИД:
/usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram/zbxtg.py "ID-Личный" "тест" "тестовое сообщение" --debug
По логину:
/usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram/zbxtg.py "@Логин-личный" "тест" "тестовое сообщение" --debug
Если получаем ошибку
User 'Логин-личный' needs to send some text bot in private Пользователю 'Логин-личный' необходимо отправить текстовое сообщение боту в частном порядке
Пишем боту любое сообщение и пробуем снова.
проверьте ваше подключение к телеграмме api:
curl https://api.telegram.org/bot${API_KEY}/getUpdates
curl https://api.telegram.org/bot0000000000: ... /getUpdate
если вы видите " User 'username' needs to send some text bot in private", это означает, что вы не отправляли сообщение своему боту
Отправить в чат:
zbxtg.py "Zabbix in Telegram" ololo ololo --group
Для записи ошибок в лог из заббикс zabbix_server.log добавить --debug
Выбрать ошибки из лога заббикс сервера: grep zbxtg.py zabbix_server.log
протестировать прокси-сервер:
curl -IL --socks5 host:port --proxy-user username:password https://api.telegram.org
установить pip install pysocks
проверить: pip freeze | grep -iE 'sock|req'
Проверка графика отправки:
./zbxtg.py "Логин-Личный" test "$(echo -e 'zbxtg;graphs: \nzbxtg;graphs_period=3600\nzbxtg;itemid:34939\nzbxtg;title:ololo')"
Проверка смайликов:
./zbxtg.py "Логин-Личный" "Test trigger with emoji" "Some {{info}} and {{ok}}. Omg, we have {{disaster}} in production. Looks like {{hankey}}, it's a {{problem}}. {{fire}} {{fire}} {{fire}}, {{bomb}}"
Получите chatid частного канала
Сохраните его вручную в uids.txt со случайным именем пользователя, например "123".
echo "name;private;-uidPrivateGroup" > uids.txt
Используйте "123" как телеграмму для любого пользовател
Скрипт не получит никакой информации о chat_id, если найдет chat_id в файле кеша
Как отправить сообщение в групповой чат
Пригласите своего бота в групповой чат
Упомяните своего бота: "/ start @ MyBot" в групповом чате, проверьте в командной строке.
Попробуйте пнуть его и пригласить еще раз, иногда платформа Telegram с этим не работает.
Переходим в zabbix: Администрирование > Способы оповещений > Создать способ оповещения
Имя: Telegram ableev персональных сообщений
Тип: Скрипт
Имя скрипта: Zabbix-in-Telegram/zbxtg.py
Параметры скрипта (входные аргументы в скрипт)
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
От версии zabbix 3.2
--group - для групповых оповещений использовать
--debug - Отладка (просмотр в логе заббикс сервера командой grep zbxtg.py zabbix_server.log)
--signature - Подпись бота для нескольких серверов zabbix
https://zabbix.localhost - Подпись бота для нескольких серверов zabbix
Подробнее о signature
Получаем Имя: Telegram ableev для групповых сообщений
Тип: Скрипт
Имя скрипта: Zabbix-in-Telegram/zbxtg.py
Параметры скрипта (входные аргументы в скрипт)
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
От версии zabbix 3.2
--group - для групповых оповещений использовать
Способы оповещения созданы: Сразу же можно протестировать сбоку нажимает Тест Успешная отправка Переходим в zabbix: Администрирование > Пользователи
Открываем текущего пользователя или создаем нового при необходимости и добавляем новый способ оповещения.
Выбираем Тип: наш созданный способ оповещения и указываем Отправлять на @Логин-Личный или группы, далее по вашему усмотрению.
Пример: Переходим к последнему пункту создание действий
Настройка > Действия > Триггеры Создать Действие
Пишем имя: Telegram ableev
И добавляем условия например для теста
Важность триггеров равно Высокая
Активировано: V Далее у нас идут 3 вкладки:
Операции
Операции восстановления
Операции обновления
Их нужно заполнить тем что мы хотим получать в сообщении какую информацию. Тема по умолчанию: {{WARNING}} {HOST.NAME} - {TRIGGER.STATUS}: {TRIGGER.NAME}
Сообщение по умолчанию:
Последнее значение: {ITEM.VALUE1} ({TIME})
zbxtg;graphs
zbxtg;graphs_period=1800
zbxtg;graph_buttons
zbxtg;itemid:{ITEM.ID1}
zbxtg;title:{HOST.HOST} - {TRIGGER.NAME}
Важность триггера: {TRIGGER.SEVERITY}
Узел сети: {HOSTNAME} ({HOST.IP})
Описание:
{TRIGGER.DESCRIPTION}
Отправлять пользователям: выбираем пользователя
Отправлять только через: Telegram ableev персональных сообщений
Сообщение по умолчанию: V
Или сделаем чуть меньше
Тема: {{WARNING}} {HOST.NAME} ({HOST.IP}) - {TRIGGER.STATUS}:{TRIGGER.SEVERITY}: {TRIGGER.NAME}
Сообщение:
Последнее значение: {ITEM.VALUE1} ({TIME})
zbxtg;graphs
zbxtg;graphs_period=3600
zbxtg;graph_buttons
zbxtg;itemid:{ITEM.ID1},{ITEM.ID2}
zbxtg;title:{HOST.HOST} - {TRIGGER.NAME}
zbxtg;single_message
Описание:
{TRIGGER.DESCRIPTION}
Операции восстановления:
Тема по умолчанию: {{OK}} {HOST.NAME} - {TRIGGER.STATUS}: {TRIGGER.NAME}
Сообщение по умолчанию:
Server: {HOSTNAME} ({HOST.IP})
zbxtg;graphs_period:3600
Описание:
Проблема устранена!
Время устранения проблемы: {DATE} {TIME}
Отправить сообщение пользователям: выбираем пользователя
Или сделаем чуть меньше
Тема: {{OK}} {HOST.NAME} ({HOST.IP}) - {TRIGGER.STATUS}: {TRIGGER.NAME}
Сообщение:
zbxtg;graphs
zbxtg;graphs_period=3600
zbxtg;itemid:{ITEM.ID1},{ITEM.ID2}
zbxtg;title:{HOST.HOST} - {TRIGGER.NAME}
zbxtg;single_message
Проблема устранена: {DATE} {TIME}
Операции обновления
Тема по умолчанию: {{OK}} {HOST.NAME} - {TRIGGER.STATUS}: {TRIGGER.NAME}
Сообщение по умолчанию:
{USER.FULLNAME} подтвердил проблему {ACK.DATE} {ACK.TIME} со следующим сообщением:
{ACK.MESSAGE}Текущее состояние проблемы {EVENT.STATUS}
Отправить сообщение пользователям: выбираем пользователя при необходимости
Макросы Zabbix
Действия сообщения
{{WARNING}} {HOST.NAME} - {TRIGGER.STATUS}: {TRIGGER.NAME}
Последнее значение: {ITEM.VALUE1} ({TIME})
zbxtg;graphs - график
zbxtg;graphs_period=1800 - Периуд для просмотра графика
zbxtg;graphs_period:3600 - (1 час) графики восстановленных проблем с периодом устранения проблемы (по умолчанию - 3600 секунд)
zbxtg;graphs_width=700 -- задать ширину графиков (по умолчанию - 900 пикселей)
zbxtg;graphs_height=300 -- задать высоту графиков (по умолчанию - 300 пикселей)
zbxtg;graphs_age:{EVENT.AGE} - только для восстановления график на все время проблемы, "graphs_period" игнорируется
zbxtg;graph_buttons - получить графики с несколькими кнопками под ним (Интерактивный бот определит, какая кнопка была нажата, и отправит вам новый график с текущим идентификатором элемента.)
zbxtg;itemid:{ITEM.ID1} - идентификаторы элементов (из триггера) (без них вы не сможете получить данные истории)
zbxtg;itemid:{ITEM.ID1},{ITEM.ID2} - для нескольких элементов (использовать сложный триггер) (второй и следующий элементы должны быть в формуле)
zbxtg;title:{HOST.HOST} - {TRIGGER.NAME} - подпись к графику
zbxtg;external_image:{ITEM.LASTVALUE2} - содержит действующий URL с изображением. изображение из другого источника вместо графика zabbix
zbxtg;location:{INVENTORY.LOCATION} - Адрес из местоположение узла работает с ключ API Google
zbxtg;lat:{INVENTORY.LOCATION.LAT} - Координаты, заполнить поля широты и долготы в узле
zbxtg;lon:{INVENTORY.LOCATION.LON} - Координаты, заполнить поля широты и долготы в узле
zbxtg;single_message график + текст одним сообщением (длина подписи ограничена 200 символами. 200 символов недостаточно для действия zabbix по умолчанию.)
zbxtg;debug - включает режим отладки, некоторые журналы и изображения будут сохранены в каталоге tmp (временное не влияет на версию python)
zbxtg;channel - позволяет отправлять на каналы
zbxtg;to:username1,username2,username3 - теперь вам не нужно создавать специальные профили и добавлять для них мультимедиа, используйте эту опцию в действии для отправки сообщений этим пользователям
zbxtg;to_group: Имя группы Один, Имя группы Два - то же самое, но для групп
Важность триггера: {TRIGGER.SEVERITY}
Узел сети: {HOSTNAME} ({HOST.IP})
Описание:
{TRIGGER.DESCRIPTION}
Для того чтобы передать виде смайлика, ставим двойные фигурные скобки
для темы сообщения {{{TRIGGER.SEVERITY}}}
{{OK}} Пример {{OK}} OK: {TRIGGER.NAME} on {HOSTNAME}
смайлики zbxtg_settings.py блок emoji_map =
Подтвердить событие с помощью скрипта
{{{TRIGGER.SEVERITY}}}{TRIGGER.NAME} on {HOSTNAME}
Last value: {ITEM.LASTVALUE1} ({TIME})
Started: {EVENT.TIME} {EVENT.DATE}
You can [acknowledge](http://192.168.175.111/zabbix/zabbix.ph ... ={EVENT.ID}) this event
zbxtg;markdown
zbxtg;graphs
zbxtg;graphs_period=10800
zbxtg;itemid:{ITEM.ID1}
zbxtg;title:{HOST.HOST} - {TRIGGER.NAME}
В своем действии вы можете:использовать разметку + или HTML-форматирование .
Интерективное управление
включите zbx_tg_daemon_enabled = True в zbxtg_settings.py (если выключено ошибка You should enable daemon by adding 'zbx_tg_remote_control' in the configuration file)
добавьте свой user_id или никнейм (чтобы другие пользователи не могли получить никакой информации).
zbx_tg_daemon_enabled_ids = [XXXXXX, ]
zbx_tg_daemon_enabled_users = ["ableev", ]
zbx_tg_daemon_enabled_chats = ["Zabbix in Telegram Script", ]
Запустить бота в бесконечном цикле:
cd /usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram
while true; do python3.9 ZbxTgDaemon.py; sleep 1; done
while - цикл выполняется пока условие истинно,
while [ условие ]
do
команда1
done
eсли вы закроете командную строку, скрипт умрет. Используйте скрипт в screen или tmux
SCREEN
Пример
screen -d -m script.sh - Это запустит отделённый (независящий) от терминала процесс. Можно отделить любую команду или процесс с помощью программы screen.
screen (свернуть ctrl a d)
screen -d -m -A -S ZbxTgDaemon `while true; do python3.9 /usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram/ZbxTgDaemon.py; sleep 1; done`
Ctrl C - вернутся в командную строку. (процесс должен остатся запущенным)
Будет 3 процесса и 4 screen
ps -ux|grep -Ei "ZbxTgDaemon" - Команда запроса процессов
root 4340 0.0 0.2 107636 25448 pts/0 T 10:48 0:00 python3.9 ZbxTgDaemon.py
root 27149 0.0 0.0 29120 2704 ? Ss 16:05 0:00 SCREEN -d -m -A -S ZbxTgDaemon while true; do python3.9 /usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram/ZbxTgDaemon.py; sleep 1; done
root 28287 2.3 0.2 108176 26616 pts/0 S 16:06 0:35 python3.9 /usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram/ZbxTgDaemon.py
Ошибку ZbxTgDaemon.py for i, v in tmp_ts.iteritems(): AttributeError: 'dict' object has no attribute 'iteritems
Исправить в python3, используйте .items() вместо .iteritems()
Строка 117 print (md5sum)
Написать боту:
/triggers - показывает активные проблемы
/triggers host=www1 trigger=Nginx - фильтрует активные триггеры по хосту и триггеру
Ошибки:
Bad Request: can't parse entities in message text: Can't find end of the entity starting at byte offset - есть ошибки в форматировании
Пример жирный текст, вы устанавливаете *символы вокруг слова. Но если вы забыли закрыть это форматирование, Telegram не смог бы его проанализировать и отправить сообщение
Скрипт удаляет ваш "проблемный" символ (телеграмма вычисляет позицию) и пытается отправить сообщение еще раз.
Если вы видите такую ошибку в своих журналах, попробуйте исправить исходный текст действия.
Оригинальное переведеное Readme 15.12.2021
Код: Выделить всё
# Zabbix-in-Telegram
Уведомления Zabbix с графиками в Telegram
Присоединяйтесь к нам в нашей **группе Telegram** по этой ссылке: https://t.me/ZbxTg
Подписывайтесь на наш канал: https://t.me/Zabbix_in_Telegram
Оцените по [share.zabbix.com](https://share.zabbix.com): https://share.zabbix.com/cat-notifications/zabbix-in-telegram
### Особенности
- [x] Графики, основанные на последних данных, отправляются непосредственно в ваш мессенджер
- [x] Вы можете отправлять сообщения как в личных, так и в групповых/супергрупповых чатах
- [x] Поддержка каналов (только общедоступных, но вы можете сделать это и для частных, а также с помощью грязного взлома)
- [x] Сохраняет идентификатор чата как временный файл
- [x] Поддерживаются простая уценка и HTML
- [x] Эмодзи (вы можете использовать эмодзи вместо серьезности, см. [the wiki article](https://github.com/ableev/Zabbix-in-Telegram/wiki/Trigger-severity-as-Emoji)) (zabbix пока не поддерживает кодировку utf8mb4)
- [x] Карта местоположения
### Задачи
- Простое управление zabbix с помощью команд бота – в состоянии разработки
- Возможность отправки сложного графика или части экрана
### Настройка/Установка
**ЧИТАЙТЕ ВИКИ, ЕСЛИ У ВАС С ЧЕМ-ТО ПРОБЛЕМЫ**: https://github.com/ableev/Zabbix-in-Telegram/wiki
**Прежде всего**: Вам необходимо установить соответствующие модули для python, это необходимо для работы! </br>
Для этого введите `pip install -r requirements.txt` в вашей командной строке!
* Положить`zbxtg.py `в вашем каталоге "alertscriptspath` путь задан внутри вашего "zabbix_server.conf`
* Положить`zbxtg_group.py `в том же месте, если вы хотите отправлять сообщения в групповой чат (если вы используете версию Zabbix 2.x)
* Создать`zbxtg_settings.py ` (скопируйте его из`zbxtg_settings.example.py `) с вашими настройками и сохраните их в том же каталоге, что и сценарий, см. Пример макета
* Создайте бота в Telegram и получите ключ API: https://core.telegram.org/bots#creating-a-new-bot
* Создайте пользователя только для чтения в веб-интерфейсе Zabbix (для получения графиков из zabbix)
* Установите прокси-хост: порт в`zbxtg_settings.py `если вам нужен интернет-прокси (также поддерживается socks5, вики поможет вам)
* Добавьте новые носители для Telegram в веб-интерфейс Zabbix с этими настройками:
<img src="https://i.imgur.com/Ytrbe4S.png" width="400px">
* Добавьте еще один, если вы хотите отправлять сообщения в группу
<img src="http://i.imgur.com/OTq4aQd.png" width="400px">
* **Обратите внимание, что Zabbix 3.0 имеет другие настройки для этого шага, смотрите его там**: https://github.com/ableev/Zabbix-in-Telegram/wiki/Working-with-Zabbix-3.0
* Отправьте сообщение своему боту через Telegram, например "/start"
* Если вы находитесь в групповом чате, начните разговор со своим ботом: `/start@ZbxTgDevBot`
* Создайте новое действие, подобное этому:
```
Last value: {ITEM.LASTVALUE1} ({TIME})
zbxtg;graphs
zbxtg;graphs_period=10800
zbxtg;itemid:{ITEM.ID1}
zbxtg;title:{HOST.HOST} - {TRIGGER.NAME}
```
<img src="https://i.imgur.com/ZNKtBUX.png" width="400px">
* Добавьте соответствующий тип носителя для вашего пользователя
* Имя пользователя **ЧУВСТВИТЕЛЬНО К РЕГИСТРУ**
* Если у вас нет имени пользователя, вы можете использовать свой идентификатор чата напрямую (и вам нужно погуглить, как его получить)
* В групповых чатах нет URL-адресов, поэтому вам нужно указать имя группы в типе носителя
* Сообщения для каналов следует отправлять как для частных чатов (просто сначала добавьте оба на свой канал и используйте имя пользователя канала, как если бы это был реальный пользователь)
* Частный:
<img src="https://i.imgur.com/GVDlTU5.png" width="400px">
* Группа:
<img src="https://i.imgur.com/TgcCqDf.png" width="400px">
#### Annotations
```
zbxtg;graphs -- включает прикрепленные графики
zbxtg;graphs_period=10800 -- установите период графиков (по умолчанию - 3600 секунд)
zbxtg;graphs_width=700 -- установите ширину графиков (по умолчанию - 900 пикселей)
zbxtg;graphs_height=300 -- установите высоту графиков (по умолчанию - 300 пикселей)
zbxtg;itemid:{ITEM.ID1} -- определите идентификатор элемента (из триггера) для присоединения
zbxtg;itemid:{ITEM.ID1},{ITEM.ID2},{ITEM.ID3} -- то же самое, но если вы хотите отправить два или более графика, используйте сложный триггер
zbxtg;title:{HOST.HOST} - {TRIGGER.NAME} -- название графиков
zbxtg;debug -- включает режим отладки, некоторые журналы и изображения будут сохранены в каталоге tmp (временный не влияет на версию python)
zbxtg;channel -- позволяет отправлять по каналам
zbxtg;to:username1,username2,username3 -- теперь вам не нужно создавать выделенные профили и добавлять для них носители, используйте эту опцию в действии, чтобы отправлять сообщения этим пользователям
zbxtg;to_group:Group Name One,Group Name Two -- то же самое, но для групп
```
Вы можете использовать форматирование markdown или html в своем действии: https://core.telegram.org/bots/api#markdown-style + https://core.telegram.org/bots/api#html-style.
#### Debug Отладка
* Вы можете использовать следующую команду для отправки сообщения из командной строки: </br>
`./zbxtg.py "@username" "первая часть сообщения" "вторая часть сообщения" --debug`
* Вместо "@имя пользователя" замените свое имя пользователя в телеграмме **, А НЕ ваше имя** (с учетом регистра) ИЛИ идентификатор чата
* Для `первой части сообщения" и "второй части сообщения" просто замените что-то вроде "тест" "тест" (для телеграммы это не имеет значения между темой и телом)
* Вы можете пропустить "", если это одно слово для каждого параметра, они необязательны
---
![](http://i.imgur.com/1T4aHuf.png)
![](http://i.imgur.com/5ZPyvoe.png)
### Известные проблемы
#### MEDIA_CAPTION_TOO_LONG ЗАГОЛОВОК В СМИ СЛИШКОМ ДЛИННЫЙ
Если вы видите эту ошибку, это означает, что вы увеличили лимит заголовка на 200 символов (ограничение Telegram API).
Такие подписи будут автоматически сокращены до 200 символов.
#### Zabbix 3.0 and higher (3.2, 3.4, 4.0, 4.2, 4.4)
https://github.com/ableev/Zabbix-in-Telegram/wiki/Working-with-Zabbix-3.0
Интерективное управление
включите zbx_tg_daemon_enabled = True в zbxtg_settings.py (если выключено ошибка You should enable daemon by adding 'zbx_tg_remote_control' in the configuration file)
добавьте свой user_id или никнейм (чтобы другие пользователи не могли получить никакой информации).
zbx_tg_daemon_enabled_ids = [XXXXXX, ]
zbx_tg_daemon_enabled_users = ["ableev", ]
zbx_tg_daemon_enabled_chats = ["Zabbix in Telegram Script", ]
Запустить бота в бесконечном цикле:
while true; do python3.9 ZbxTgDaemon.py; sleep 1; done
eсли вы закроете командную строку, скрипт умрет. Используйте скрипт в screen/`tmux.
SCREEN
ОШИБКИ
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(md5sum)?
File "/usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram/ZbxTgDaemon.py", line 117
print md5sum
я поправил так print (md5sum) ; еще установил pip3 install pyzabbix ; изменил 63 строку for i, v in tmp_ts.items(): связное с изменением python3.
Все стало запускаться но при запросе триггеров получаю: ZbxTgDaemon.py: Bad Request: message is too long
Хотя разбивка на сообщения есть.
-------------------------------------------------------------------------------------------------------------------------------------
Запрос для команды /triggers
В скрипте у нас есть такая строка запроса текущие триггеры на дашборте запрос
trigger.get(output="extend", monitored=True, filter={"value": 1}, sortfield="priority", sortorder="DESC",selectHosts="extend")
ВХОД API
curl --silent --show-error --insecure --header 'Content-Type: application/json-rpc' --data '{"jsonrpc": "2.0","method":"user.login","params":{"user": "Admin","password": "zabbix"},"id": 1 }' http://192.168.175.111/zabbix/api_jsonrpc.php
ЗАПРОС ИЗ ZbxTgDaemon.py
curl --silent --show-error --insecure --header 'Content-Type:application/json-rpc' --data '{"jsonrpc": "2.0","method": "trigger.get","params": {"output": "extend", "monitored": "True", "filter": {"value": 1}, "sortfield": "priority", "sortorder": "DESC", "selectHosts": "extend"},"auth":"301e8a26088db53ad46e0564819a38b4", "id": 1 }' http://192.168.175.111/zabbix/api_jsonrpc.php
monitored - флаг Возврат только активированных триггеров, которые принадлежат узлам сети под наблюдением и содержат только активированные элементы данных.
"value": 1 (0 - (по умолчанию) ОК; 1 - проблема.)
sortfield": "priority" - Сортировка результата по заданным свойствам по важности
sortorder строка/массив DESC - по убыванию (ASC - по возрастанию)
selectHosts запрос Возврат узлов сети, которым принадлежит триггер, в свойстве hosts.
expandComment флаг Раскрытие макросов в описании к триггеру.
expandDescription флаг Раскрытие макросов в имени триггера.
expandExpression флаг Раскрытие функций и макросов в выражении триггера.
? флаг Раскрытие макросов в URL к триггеру
curl --silent --show-error --insecure --header 'Content-Type:application/json-rpc' --data '{"jsonrpc": "2.0","method": "trigger.get","params": {"output": "extend", "monitored": "True", "expandComment": "True", "expandDescription": "True", "expandExpression": "True", "filter": {"value": 1}, "sortfield": "priority", "sortorder": "DESC", "selectHosts": "extend"},"auth":"301e8a26088db53ad46e0564819a38b4", "id": 1 }' http://192.168.175.111/zabbix/api_jsonrpc.php
С фильтром вывода без описания триггеров
curl --silent --show-error --insecure --header 'Content-Type:application/json-rpc' --data '{"jsonrpc": "2.0","method": "trigger.get","params": {"output": ["triggerid","priority","status"], "monitored": "True", "expandComment": "True", "expandDescription": "True", "expandExpression": "True", "filter": {"value": 1}, "sortfield": "priority", "sortorder": "DESC", "selectHosts": "extend"},"auth":"301e8a26088db53ad46e0564819a38b4", "id": 1 }' http://192.168.175.111/zabbix/api_jsonrpc.php
ВЫХОД API
curl --silent --show-error --insecure --header 'Content-Type: application/json-rpc' --data '{"jsonrpc": "2.0","method":"user.logout","params": [],"id": 1, "auth": "301e8a26088db53ad46e0564819a38b4"}' http://192.168.175.111/zabbix/api_jsonrpc.php
Просмотрим вывод через скрипт (в телеграмм будем отправлять Test, а выодить на экрн)
В скрипте нельзя отступать Tab отступаем пробелом, либо везде Tab иначе срипт будет ругаться!
Вначале выведем все активные триггеры на пенели
if triggers:
for t in triggers:
reply_text.append("Test")
print(triggers)
#print("Severity: {0}, Host: {1}, Trigger: {2}".format(t["priority"], t["hosts"][0]["host"].encode('utf-8'), t["description"].encode('utf-8')))
Запускаем скрипт while true; do python3.9 ZbxTgDaemon.py; sleep 1; done
Отправляем команду из телеграмма /triggers
В телеграмм прилетает Test столько раз сколько у нас триггеров на панели
В окне терминала получаем инфу об активных триггерах
Пример 2х триггеров сортировка по важности
{'triggerid': '75653', 'expression': '{132734}=0 or\r\n{132734}=1 or\r\n{132735}=1 and\r\n{132736}=1 or\r\n{132737}=1', 'description': 'Превышение квоты пользователя Zimbra login@DNS.ru {ITEM.VALUE}', 'url': '', 'status': '0', 'value': '1', 'priority': '4', 'lastchange': '1644545423', 'comments': 'Последнее значение: {ITEM.VALUE} {ITEM.LASTVALUE} ({TIME})\r\n\r\nили нет данных 2 часа\r\n\r\nПроверка раз в 30 минут\r\n\r\nПервая строка выведет триггер в ошибку в любом случае при обнаружении\r\n{Zimbra-zabbix:emailquotauser["login@DNS.ru"].iregexp(\\@DNS)}=0 or', 'error': '', 'templateid': '0', 'type': '0', 'state': '0', 'flags': '4', 'recovery_mode': '0', 'recovery_expression': '', 'correlation_mode': '0', 'correlation_tag': '', 'manual_close': '1', 'details': '', 'hosts': [{'hostid': '10592', 'proxy_hostid': '0', 'host': 'DNS.ru', 'status': '0', 'disable_until': '0', 'error': '', 'available': '1', 'errors_from': '0', 'lastaccess': '0', 'ipmi_authtype': '-1', 'ipmi_privilege': '2', 'ipmi_username': '', 'ipmi_password': '', 'ipmi_disable_until': '0', 'ipmi_available': '0', 'snmp_disable_until': '0', 'snmp_available': '0', 'maintenanceid': '0', 'maintenance_status': '0', 'maintenance_type': '0', 'maintenance_from': '0', 'ipmi_errors_from': '0', 'snmp_errors_from': '0', 'ipmi_error': '', 'snmp_error': '', 'jmx_disable_until': '0', 'jmx_available': '0', 'jmx_errors_from': '0', 'jmx_error': '', 'name': 'Zimbra', 'flags': '0', 'templateid': '0', 'description': '', 'tls_connect': '1', 'tls_accept': '1', 'tls_issuer': '', 'tls_subject': '', 'tls_psk_identity': '', 'tls_psk': '', 'proxy_address': '', 'auto_compress': '1'}]},
format выбирает в строках значения priority приоритет это будет Severity: , далее hosts host имя узла будет Host: и description имя триггера будет Trigger: ,все остальное не берем если нужно добавляем нужные данные например описание триггеров comments
if triggers:
for t in triggers:
reply_text.append("Test")
#print(triggers)
print("Severity: {0}, Host: {1}, Trigger: {2}".format(t["priority"], t["hosts"][0]["host"].encode('utf-8'), t["description"].encode('utf-8')))
Получаем вывод пример тех же 2х триггеров
Severity: 4, Host: b'APC22-Smart-UPS-2200', Trigger: b'UPSOutputStatus {HOST.NAME}({HOST.IP}){ITEM.LASTVALUE1}'
Severity: 4, Host: b'DNS.ru', Trigger: b'\xd0\x9f\xd1\x80\xd0\xb5\xd0\xb2\xd1\x8b\xd1\x88\xd0\xb5\xd0\xbd\xd0\xb8\xd0\xb5 \xd0\xba\xd0\xb2\xd0\xbe\xd1\x82\xd1\x8b \xd0\xbf\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xb7\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x82\xd0\xb5\xd0\xbb\xd1\x8f Zimbra login@DNS.ru {ITEM.VALUE}'
И весь Русский текст ломает кодирование в UTF-8 .encode('utf-8') ,убираем кодировку.
if triggers:
for t in triggers:
reply_text.append("Test")
#print(triggers)
print("Severity: {0}, Host: {1}, Trigger: {2}".format(t["priority"], t["hosts"][0]["host"], t["description"]))
И получаем нормальный читаемый Русский в ответе
Severity: 4, Host: APC22-Smart-UPS-2200, Trigger: UPSOutputStatus {HOST.NAME}({HOST.IP}){ITEM.LASTVALUE1}
Severity: 4, Host: DNS.ru, Trigger: Превышение квоты пользователя Zimbra login@DNS.ru
Пример кодировок python3.9
>>> b'Connection: \xd0\x92\xd1\x8b\xd1\x81\xd0\xbe\xd0\xba\xd0\xb0\xd1\x8f \xd1\x87\xd0\xb0\xd1\x81\xd1\x82\xd0\xbe\xd1\x82\xd0\xb0 \xd0\xbe\xd1\x88\xd0\xb8\xd0\xb1\xd0\xbe\xd0\xba'.decode("utf-8", "replace")
'Connection: Высокая частота ошибок'
>>> 'текст'.encode('utf-8')
b'\xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82'
>>> 'test'.encode('utf-8')
b'test'
Далее ответ должен преобразоватся через zbxtg.py
Пример вывод в файл
f = open('/usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram/test.txt',"w")
c = reply_text
f.write(c)
ZbxTgDaemon.py
Код: Выделить всё
#!/usr/bin/env python3.9
# coding: utf-8
import sys
import os
import hashlib
import re
import time
from os.path import dirname
import zbxtg_settings
import zbxtg
from pyzabbix import ZabbixAPI, ZabbixAPIException
# Текущий путь где лежит скрипт
dir_path = os.path.dirname(os.path.realpath(__file__))
dir_script = ("{0}/ZbxTgDaemon.py".format(dir_path))
# Важность триггеров из priority
emoji_map = {
"5": "Чрезвычайная❌🔥",
"4": "Высокая🛑",
"3": "Средняя❗",
"2": "Предупреждение⚠️",
"1": "Информацияℹ️",
"0": "Не классифицировано🔘",
}
class zabbixApi():
def __init__(self, server, user, password):
self.api = ZabbixAPI(server)
self.user = user
self.password = password
def login(self):
self.api.login(self.user, self.password)
def triggers_active(self):
return self.api.trigger.get(output="extend", monitored=True, expandComment=True, expandDescription=True, expandExpression=True, filter={"value": 1}, sortfield="priority", sortorder="DESC", selectHosts="extend")
def print_message(string):
string = str(string) + "\n"
filename = sys.argv[0].split("/")[-1]
sys.stderr.write(filename + ": " + string)
def file_write(filename, text):
with open(filename, "w") as fd:
fd.write(str(text))
return True
def file_read(filename):
with open(filename, 'r') as fd:
text = fd.readlines()
return text
def main():
TelegramAPI = zbxtg.TelegramAPI
ZabbixWeb = zbxtg.ZabbixWeb
tmp_dir = zbxtg_settings.zbx_tg_tmp_dir
if not zbxtg_settings.zbx_tg_daemon_enabled:
print("Вы должны включить демона, добавив 'zbx_tg_remote_control' в файл конфигурации")
sys.exit(1)
tmp_uids = tmp_dir + "/uids.txt"
tmp_ts = {
"message_id": tmp_dir + "/daemon_message_id.txt",
"update_offset": tmp_dir + "/update_offset.txt",
}
for i, v in tmp_ts.items():
if not os.path.exists(v):
print_message("{0} не существует, создаю новый...".format(v))
file_write(v, "0")
print_message("{0} успешно создано".format(v))
message_id_last = file_read(tmp_ts["message_id"])[0].strip()
if message_id_last:
message_id_last = int(message_id_last)
update_id = file_read(tmp_ts["update_offset"])
tg = TelegramAPI(key=zbxtg_settings.tg_key)
if zbxtg_settings.proxy_to_tg:
proxy_to_tg = zbxtg_settings.proxy_to_tg
if not proxy_to_tg.find("http") and not proxy_to_tg.find("socks"):
proxy_to_tg = "https://" + proxy_to_tg
tg.proxies = {
"https": "{0}".format(zbxtg_settings.proxy_to_tg),
}
zbx = ZabbixWeb(server=zbxtg_settings.zbx_server, username=zbxtg_settings.zbx_api_user,
password=zbxtg_settings.zbx_api_pass)
if zbxtg_settings.proxy_to_zbx:
zbx.proxies = {"http": "http://{0}/".format(zbxtg_settings.proxy_to_zbx)}
try:
zbx_api_verify = zbxtg_settings.zbx_api_verify
zbx.verify = zbx_api_verify
except:
pass
zbxapi = zabbixApi(zbxtg_settings.zbx_server, zbxtg_settings.zbx_api_user, zbxtg_settings.zbx_api_pass)
zbxapi.login()
print(tg.get_me())
#hosts = zbxdb.db_query("SELECT hostid, host FROM hosts")
commands = [
'/triggers',
'/help',
# '/graph',
# '/history',
# '/screen'
]
def md5(fname):
hash_md5 = hashlib.md5()
#алгоритм определения контрольной суммы
with open(fname, 'rb') as f:
#последовательно берём блоки файла определенного размера
# for chunk in iter(lambda: f.read(4095), b''):
while chunk := f.read(4095):
#накопительно калькулируем контрольную сумму файла
hash_md5.update(chunk)
return hash_md5.hexdigest()
md5sum = md5(dir_script)
print (md5sum)
try:
while True:
time.sleep(1)
md5sum_new = md5(dir_script)
if md5sum != md5sum_new:
sys.exit(1)
tg.update_offset = update_id
updates = tg.get_updates()
if not updates["result"]:
continue
for m in updates["result"]:
if "message" not in m:
continue
update_id_last = m["update_id"]
tg.update_offset = update_id_last
if m["message"]["from"]["id"] not in zbxtg_settings.zbx_tg_daemon_enabled_ids:
file_write(tmp_ts["update_offset"], update_id_last)
continue
print('К черту это дерьмо, я не собираюсь отвечать кому-то, кто не из белого списка')
else:
if not "text" in m["message"]:
continue
text = m["message"]["text"]
to = m["message"]["from"]["id"]
reply_text = list()
if m["message"]["message_id"] > message_id_last:
if re.search(r"^/(start|help)", text):
reply_text.append('Привет, это бот ZbxTgDaemon.')
reply_text.append('https://github.com/ableev/Zabbix-in-Telegram')
reply_text.append('Если вам нужна помощь, вы можете обратиться за ней в группу @ZbxTg')
reply_text.append('Доступные команды:')
reply_text.append(', '.join(commands))
tg.disable_web_page_preview = True
if re.search(r"^/triggers", text):
triggers = zbxapi.triggers_active()
if triggers:
tg_text_emoji = []
for t in triggers:
#reply_text.append("tetst")
tg_text = ("Важность:{0}, Узел сети: {1}, Триггер: {2}".format(t["priority"], t["hosts"][0]["host"], t["description"]))
#print(tg_text)
# Меняем значение на текст и смайлик
l_new = tg_text
for k, v in emoji_map.items():
l_new = l_new.replace('Важность:'+k, 'Важность:'+v)
tg_text = l_new
#print(tg_text)
reply_text.append(tg_text)
else:
reply_text.append('Никаких триггеров нет, хорошего дня!')
if not reply_text:
reply_text = "['Я не знаю, что с этим делать']"
# Экранируем ''' чтоб посчитать все символы в строке, иначе разбивает и считает строки ', '
reply = ("'''{0}'''".format(reply_text))
#print(reply)
# Если сообщение больше 4095 символов разобъем его
# range(старт, стоп, шаг) , len() возвращает количество элементов (длину) в объект
for x in range(0, len(reply), 2000):
# Срез отсчет от 0 первый x-начало второй х+2000 (последний символ не входит в вывод)
text=reply[x:x+2000]
#print(text)
#print(x)
# Больше не нужны тройные кавычки убираем вначале и конце строки а так же скобки
strok=text.strip("'[]")
# Добавим для каждого блока [ ] - тип данных списка
#reply_textw= "['"+strok+"']"
reply_textw=strok
# Делим на строки по параметру ', '
reply_text = reply_textw.rsplit("', '")
if tg.send_message(to, reply_text):
print(reply_text)
with open(tmp_ts["message_id"], "w") as message_id_file:
message_id_file.write(str(m["message"]["message_id"]))
message_id_last = m["message"]["message_id"]
tg.disable_web_page_preview = False
file_write(tmp_ts["update_offset"], update_id_last)
except KeyboardInterrupt:
print("Выход...")
if __name__ == "__main__":
main()
ZbxTgDaemon.sh
Код: Выделить всё
#!/bin/bash
function check(){
#Просмотр запущенных процессов выбор PID
#ps -ef|grep -E "SCREEN"|sed -e '/'grep'/d'|| awk '{print $2}'
#ps -ef|grep -E "SCREEN .*ZbxTgDaemon while .*ZbxTgDaemon.py"|sed -e '/'grep'/d'| awk '{print $2}'
# Главное чтоб был процесс
dirzbxtgdaemon=`ps -ef|grep -E "python3.9 /usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram/ZbxTgDaemon.py"|sed -e '/'grep'/d'| awk '{print $2}'`
#ps -ef|grep -E "python3.9 ZbxTgDaemon.py"|sed -e '/'grep'/d'| awk '{print $2}'
# Запускаем блок проверки процесса
terms
}
function terms(){
# Количество процессов удалить пустую строку
numproc=$(echo "${dirzbxtgdaemon}"|grep -Ev "^$"|wc -l)
# Проверим что запущен всего 1 процесс если нет выполним
if [ "$numproc" -eq "1" ]; then exit 1; else
# Если количество процессов больше 1 , завершаем все лишние
if [ "$numproc" -gt "1" ]; then
# Скроем 1 процесс, и Завершим все лишние процессы
for prockill in $(echo "${dirzbxtgdaemon}"|awk NR\>1); do
#kill "${prockill}"
#kill -15 "${prockill}"
kill -9 "${prockill}"
#kill -9 "${prockill}"
#kill -TERM "${prockill}"
#kill -KILL "${prockill}"
done
# Повторная проверка
check
fi
# Процессов 0 запускаем процесс
if [ "$numproc" -lt "1" ]; then
# Существует ли файл лога
if [ -e /tmp/zbxtg/daemon_message_id.txt ]; then
echo "OK /tmp/zbxtg/daemon_message_id.txt"
else
mkdir /tmp/zbxtg &&echo "1" >> /tmp/zbxtg/daemon_message_id.txt &&chmod 777 /tmp/zbxtg/daemon_message_id.txt
fi
# Запускаем сервис
systemctl stop zbxtg.service
sleep 3
systemctl start zbxtg.service
#/usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram/ZbxTgDaemon.py
# while - цикл выполняется пока условие истинно
#while true; do python3.9 /usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram/ZbxTgDaemon.py; sleep 1; done
#screen -d -m -A -S ZbxTgDaemon `while true; do python3.9 /usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram/ZbxTgDaemon.py; sleep 1; done`
# Повторная проверка
check
fi
fi
}
# Запускаем проверку
check
/etc/systemd/system/ — юниты, созданные системным администратором
zbxtg.service
Код: Выделить всё
# Скрипт для ответа в телеграмм zabbix
# /etc/systemd/system/ — юниты, созданные системным администратором
[Unit]
# Описание юнита
Description=Zabbix-Telegram
# Запускаем после запуска следующих сервисов
After=multi-user.target rescue.service rescue.target
After=apache2.service
After=mysql.service
After=mariadb.service
After=zabbix-server.service
After=zabbix-agent.service
# Для запуска сервиса необходим запущенный сервис
#Requires=mysql.service
Requires=multi-user.target
# Для запуска сервиса желателен запущенный сервиc
#Wants=
#Conflicts=rescue.service rescue.target
#AllowIsolate=yes
[Service]
# По умолчанию: systemd предполагает, что служба будет запущена незамедлительно.
# Процесс при этом не должен разветвляться. Не используйте этот тип, если другие службы зависят от очередности при запуске данной службы.
Type=simple
# systemd предполагает, что служба запускается однократно и процесс разветвляется с завершением родительского процесса. Данный тип используется для запуска классических демонов.
#Type=forking
# Запустить один раз, когда остальное будет запущенно
#Type=idle
#Type=oneshot
# Чтобы systemd могла отслеживать основной процесс:
PIDFile=/tmp/zbxtg.pid
# Рабочий каталог, он делается текущим перед запуском стартап команд (эмулирует команду "cd /путь")
WorkingDirectory=/usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram
# Пользователь и группа, под которым надо стартовать сервис
User=root
Group=root
#umask - инвертированный chmod (chmod 777 укажите umask 000, chmod 700 umask 077)
#UMask=077
# Переменные окружения:
Environment=PATH=/usr/bin:/usr/local/bin
#Environment=NODE_ENV=production
#Environment=RACK_ENV=production
# Запрет на убийство сервиса вследствие нехватки памяти и срабатывания механизма OOM -1000 полный запрет
OOMScoreAdjust=-100
# Команды на старт/стоп и релоад сервиса
ExecStart=/usr/local/share/zabbix/alertscripts/Zabbix-in-Telegram/ZbxTgDaemon.py
#ExecStop=
#ExecReload=
#Таймаут в секундах, сколько ждать system отработки старт/стоп команд.
TimeoutSec=40
# Попросим systemd автоматически рестартовать наш сервис, если он вдруг перестанет работать.
# Контроль ведется по наличию процесса из PID файла
Restart=always
# указываем, что бинарь нужно запустить снова, если он умрет
#Restart=on-failure
# указываем, что перед повторным запуском нужно подождать 10 секунд.
#RestartSec=10s
[Install]
# Уровень запуска
# multi-user.target или runlevel3.target соответствует нашему привычному runlevel=3
WantedBy=multi-user.target
#WantedBy=default.target
#WantedBy=installer.target
systemctl daemon-reload
Пробуем запустить
systemctl start zbxtg.service
service zbxtg start
Просмотреть статус
systemctl status zbxtg.service
service zbxtg status
добавляем ее в автозагрузку
systemctl enable zbxtg.service