- PVSM.RU - https://www.pvsm.ru -
Всем привет! В этом посте я расскажу о том, как доставлять информацию о результатах действий из Veeam Backup & Replication v9.5 в MS Teams. Описанный в посте способ будет работать не только в этом, но и в любом другом мессенджере — потребуется только организовать доставку сообщений, используя профильный API.

Для начала представим себе, чего хотим добиться. Мы хотим получать в один из наших командных каналов информацию о том, что происходит на одном из наших инстансов бэкапного софта. Функция полезная, пригодится и детям и взрослым, порадует Вашу вторую половинку и послужит отличным украшением праздничного стола. Другими словами, конкретный юзкейс вы можете придумать и сами. Я ни в коем случае не хочу ограничивать вашу фантазию — мы рассмотрим прототип.
Решать задачу будем самым простым способом из возможных: грабить данные из SQL базы данных Veeam, немного парсить и отправлять в канал посредством Incoming WebHook Connector. Вот план действий:
Сначала создаем пользователя на стороне MS SQL инстанса. Рассматриваем именно MS SQL, поскольку это дефолтный вариант, предустанавливаемый нашим софтом. Даем пользователю самый минимум прав — только селектить и только из одной таблицы.
Сделать это просто. Залогиньтесь на инстанс любым возможным для Вас способом и зараньте следующий запрос:
CREATE LOGIN ms_teams_watcher
WITH PASSWORD = '123@qwe'
USE [VeeamBackup]
CREATE USER ms_teams_watcher FOR LOGIN ms_teams_watcher
GRANT SELECT ON [dbo].[Backup.Model.JobSessions] TO ms_teams_watcher
Не забудьте подставить имя базы [1], придумать имя пользователя и пароль.
Если Вы все сделали правильно, то попытка провести адпейт… не пройдет:

А вот селект — пожалуйста:

Слава GDPR — в рамках этого семпла ни одна продакшн база не пострадала! Теперь у нас есть пользователь ms_teams_watcher и мы можем начать собирать данные. Подключаться будем через pyodbc [2] — никакой SQLAlchemy, только хардкор!
Для начала откроем подключение (см. class SQLConnectorVeeamDB [3]) и получим информацию о всех сессиях, что были закончены в течение последнего запуска нашего скрипта:
s. SQLConnectorVeeamDB.select_completed_job_sessions_during_latest_hour:
query = 'select job_name,job_type, usn, end_time, result, reason '
'from [dbo].[Backup.Model.JobSessions] '
'where state = -1 and result != -1 and datediff(HH,[end_time],GETDATE()) <= 1 '
'order by usn'
Самое важное для нас — получить последний usn в таблице, чтобы следующий раз запрашивать уже от него, а не по времени. Если ничего не нашли, выполним следующий запрос:
query = 'select top 1 [usn] '
'from [dbo].[Backup.Model.JobSessions] '
'order by usn desc'
Статистически этот usn будет выше любого, что вернется при выполнении первого запроса, но JobSessions, которые не попадают в первую выборку, все равно нам не нужны. Если мы не нашли законченных (state = -1) сессий с результатом не None (result != -1) — просто запомним usn, запишем его в ini файл и повторим запросы через некоторый интервал (но уже SQLConnectorVeeamDB.select_completed_job_sessions_after_usn).
Здесь все просто. Попросите вашего MS Teams админа (респект, если это вы) включить эту функцию, как это описано вот здесь [4]. Теперь создайте connector типа Incoming WebHook [5]. Получилось? Вы прекрасны, ничего больше делать не надо, скопируйте url и сохраните.
Здесь [6] можно скачать уже готовый Dockerfile, либо сам скетч, который мы будем рассматривать дальше. Только не забудьте скачать configuration.py_ [7], положить его рядом с Dockerfile, заполнить и убрать подчеркивание из расширения.
Вот как выглядит концептуальная схема скетча (картинка кликабельна):
Как видно из схемы, самое интересное — разобрать дату, полученную из базы данных Veeam, создавая при этом объекты класса VeeamEvent (просто датахендлер) и сам процесс отправки нотификации.
В таблицу, из которой мы берем дату, логируются все задачи, которые выполняет Veeam.
Каждая из них имеет атрибут job_type. Их очень много, но я выделил самые интересные для нас — не хотим же мы слать сообщение о том, что кто-то открыл консоль программы или закончил рестор?
Напишите в комментах, если интересно, я подскажу другие типы тасков по запросу. Законченные таски могут быть либо success, либо warning, а иногда даже и failed.
В итоге мы создаем объект, хранящий в себе все эти данные + имя задачи, usn, описание статуса ее завершения (если есть) и время завершения. Именно этот объект и передается для отправки сообщения в мессенджер.
Тут все еще проще — используем готовую библиотеку pymsteams [9], которая просто собирает сообщение по спецификации [10] и отправляет его через requests.post. В своем семпле я даже не стал использовать функции O365 cards, которые тоже поддерживаются WebHook-ами, а просто сделал несколько шаблонов сообщений — в зависимости от результата таска.
team_connection = pymsteams.connectorcard(web_hook_url)
if event_object.job_type_name is not None:
if event_object.result_text == 'success':
text = 'A Veeam ' + event_object.job_type_name + ' **"' + str(event_object.job_name) + '"** has finished **successfully** at ' + str(event_object.end_time)[:-7]
team_connection.color('005f4b') # it's a brand color named "Veeam Sapphire", btw
Здесь пригодится фантазия — добавляйте любой текст, картинки, кнопки и т.д. Вот какие виды сообщений получились у меня:

Для задания резервного копирования, где все прошло без проблем

Для failed и warning заданий
Если у Вас еще нет Docker — почитайте A Docker Tutorial for Beginners [11]. Если есть — нам нужно создать следующий Dockerfile:
# Version: 1.0
FROM python:3.6.2
MAINTAINER Dmitry Rozhdestvenskiy <dremsama@gmail.com>
RUN apt-get update && apt-get install -y --no-install-recommends apt-utils
RUN apt-get -y install locales
RUN echo "en_US.UTF-8 UTF-8" > /etc/locale.gen
RUN locale-gen
RUN apt-get -y install apt-transport-https freetds-dev unixodbc-dev git
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
RUN curl https://packages.microsoft.com/config/debian/8/prod.list > /etc/apt/sources.list.d/mssql-release.list
RUN apt-get -y update && ACCEPT_EULA=Y apt-get install msodbcsql
RUN mkdir /veeam_to_msteams
RUN git clone https://github.com/daymer/Veeam-to-MS-Teams-notification-sender-app /veeam_to_msteams
RUN pip install --upgrade pip
RUN pip install -r /veeam_to_msteams/requirements.txt
RUN mkdir /var/log/veeam_to_msteams/
ADD configuration.py /veeam_to_msteams/
RUN chmod +x /veeam_to_msteams/launch_veeam_to_msteams.sh
CMD ["/bin/bash", "/veeam_to_msteams/launch_veeam_to_msteams.sh"]
Все необходимое Docker сам скачает из репозитория (FROM python:3.6.2), Github (RUN git clone...) и packages.microsoft.com. Положите dockerfile в %directory_name%, рядом с configuration.py [7] (Вы же не забыли скачать и заполнить его?). Соберем образ следующей командой:
docker build -t veeam_to_msteams:1.0 -f /path/%directory_name%/Dockerfile /path/%directory_name%/
Запустим контейнер:
docker run --restart=always -it --name veeam_to_msteams -d veeam_to_msteams:1.0 bin/bash /veeam_to_msteams/launch_veeam_to_msteams.sh
Если Вы хотите запускать скрипт на другой платформе либо вообще не хотите использовать контейнер — не беда, просто запускайте сам main.py файл, без аргументов.
Автор: daymer
Источник [13]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/python/284431
Ссылки в тексте:
[1] имя базы: https://www.veeam.com/kb1471
[2] pyodbc: https://docs.microsoft.com/ru-ru/sql/connect/python/pyodbc/python-sql-driver-pyodbc?view=sql-server-2017
[3] SQLConnectorVeeamDB: https://github.com/daymer/Veeam-to-MS-Teams-notification-sender-app/blob/master/custom_logic.py
[4] здесь: https://docs.microsoft.com/en-us/MicrosoftTeams/enable-features-office-365?ui=en-US&rs=en-US&ad=US#apps
[5] Incoming WebHook: https://docs.microsoft.com/en-us/microsoftteams/platform/concepts/connectors#setting-up-a-custom-incoming-webhook
[6] Здесь: https://github.com/daymer/Veeam-to-MS-Teams-notification-sender-app/blob/master/Dockerfile
[7] configuration.py_: https://github.com/daymer/Veeam-to-MS-Teams-notification-sender-app/blob/master/configuration.py_
[8] Image: https://habrastorage.org/webt/_j/11/lk/_j11lkt0ukmphkthvbhg1rugncc.png
[9] pymsteams: https://github.com/rveachkc/pymsteams
[10] спецификации: https://docs.microsoft.com/en-us/microsoftteams/platform/concepts/connectors#example-connector-message
[11] A Docker Tutorial for Beginners: https://docker-curriculum.com/
[12] Мой проект на Github: https://github.com/daymer/Veeam-to-MS-Teams-notification-sender-app
[13] Источник: https://habr.com/post/415561/?utm_campaign=415561
Нажмите здесь для печати.