Cómo enviar eventos de Veeam Backup & Replication a mensajería instantánea

Hola a todos! En esta publicación hablaré sobre cómo entregar información sobre los resultados de las acciones de Veeam Backup & Replication v9.5 a los equipos de MS. El método descrito en la publicación funcionará no solo en esto, sino también en cualquier otro mensajero: solo necesita organizar la entrega de mensajes utilizando la API de perfil.



Primero, imagine lo que queremos lograr. Queremos recibir información sobre lo que está sucediendo en una de nuestras instancias de software de respaldo en uno de nuestros canales de comando. La función es útil, será útil tanto para niños como para adultos, hará las delicias de su alma gemela y servirá como una excelente decoración de la mesa festiva. En otras palabras, puede crear un caso de usuario específico usted mismo. De ninguna manera quiero limitar tu imaginación, consideraremos un prototipo.

Resolveremos el problema de la manera más simple posible: para robar datos de la base de datos Veeam SQL, analice un poco y envíelo al canal utilizando el Conector de WebHook entrante. Aquí está el plan de acción:

  1. Nos conectamos a la base de datos Veeam y obtenemos información de [dbo]. [Backup.Model.JobSessions].
  2. Creamos el conector de WebHook entrante en el canal donde queremos enviar mensajes.
  3. Poniendo todo junto con la ayuda de la magia de pitón para que funcione.
  4. Envuelva el boceto resultante en un contenedor acoplable.
  5. ¡Simplemente funciona!

Conéctese a la base de datos Veeam Backup & Replication


Primero, cree el usuario en el lado de la instancia de MS SQL. Consideramos MS SQL, ya que esta es la opción predeterminada preinstalada por nuestro software. Le damos al usuario el mínimo de derechos: solo seleccionar y solo de una tabla.

Es facil de hacer. Inicie sesión en la instancia de cualquier manera posible para usted y envíe previamente la siguiente solicitud:

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 

No olvide sustituir el nombre de la base de datos , proponga un nombre de usuario y contraseña.

Si hiciste todo bien, un intento de actualización ... fallará:



Pero seleccione - por favor:



Gloria al RGPD: en el marco de esta muestra, ¡ni una sola base de producción ha sufrido! Ahora tenemos el usuario ms_teams_watcher y podemos comenzar a recopilar datos. Nos conectaremos a través de pyodbc , ¡sin SQLAlchemy, solo hardcore!

Primero, abra la conexión (vea la clase SQLConnectorVeeamDB ) y obtenga información sobre todas las sesiones que se completaron durante la última ejecución de nuestro script:

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' 

Lo más importante para nosotros es obtener el último usn en la tabla, así que la próxima vez que lo solicite ya, y no por tiempo. Si no encontró nada, ejecute la siguiente consulta:

 query = 'select top 1 [usn] ' \                   'from [dbo].[Backup.Model.JobSessions] ' \                   'order by usn desc' 

Estadísticamente, esta usn será más alta que cualquiera que regrese cuando se ejecute la primera solicitud, pero JobSessions que no entran en la primera selección, todavía no lo necesitamos. Si no encontramos las sesiones completadas (estado = -1) con el resultado no Ninguno (resultado! = -1), solo recuerde usn, escríbalo en el archivo ini y repita las solicitudes en un cierto intervalo (pero ya SQLConnectorVeeamDB.select_completed_job_sessions_after_usn).

Crear un conector de WebHook entrante para equipos de MS


Todo es simple aquí. Solicite a su administrador de MS Teams (Respeto, si es usted) que habilite esta función, como se describe aquí . Ahora cree un conector de tipo WebHook entrante . ¿Funcionó? Eres hermosa, nada más que hacer, copia la url y guárdala.

Poniendo todo junto


Aquí puede descargar el Dockerfile terminado, o el boceto en sí, que consideraremos más adelante. Solo recuerde descargar configuration.py_ , colóquelo junto al Dockerfile, complete y elimine el subrayado de la extensión.

Así es como se ve el esquema de boceto conceptual (se puede hacer clic en la imagen):



Como puede ver en el diagrama, lo más interesante es analizar la fecha recibida de la base de datos Veeam, mientras crea objetos de la clase VeeamEvent (solo un centro de datos) y el proceso de envío de notificaciones.

clase VeeamEvent (objeto)


En la tabla de la que tomamos la fecha, se registran todas las tareas que realiza Veeam.
Cada uno de ellos tiene el atributo job_type. Hay muchos de ellos, pero resalté los más interesantes para nosotros: ¿no queremos enviar un mensaje de que alguien ha abierto la consola del programa o ha finalizado la restauración?

  • 0 - Trabajo de respaldo
  • 1 - Trabajo de replicación
  • 3 - Trabajo SureBackup
  • 24 - Trabajo de archivo a cinta
  • 28 - Copia de seguridad en cinta de trabajo
  • 51 - Copia de seguridad de trabajo
  • 100 - Copia de seguridad de configuración

Escriba en los comentarios, si está interesado, solicitaré otros tipos de tareas. Las tareas finalizadas pueden ser exitosas o de advertencia, y algunas veces incluso pueden fallar.

Como resultado, creamos un objeto que almacena todos estos datos en sí mismo + el nombre de la tarea, usn, una descripción del estado de su finalización (si corresponde) y el tiempo de finalización. Es este objeto el que se transfiere para enviar un mensaje al mensajero.

send_notification_to_web_hook ()


Aquí todavía es más simple: utilizamos la biblioteca pymsteams ya preparada, que simplemente recopila un mensaje de acuerdo con la especificación y lo envía a través de request.post. En mi muestra, ni siquiera utilicé las funciones de las tarjetas O365, que también son compatibles con WebHooks, sino que simplemente hice varias plantillas de mensajes, dependiendo del resultado de la tarea.

 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 

La fantasía es útil aquí: agregue cualquier texto, imágenes, botones, etc. Estos son los tipos de mensajes que recibí:


Para un trabajo de respaldo donde todo salió bien


Para tareas fallidas y de advertencia

Crear un contenedor acoplable


Si aún no tiene Docker, consulte el Tutorial de Docker para principiantes . Si es así, necesitamos crear el siguiente 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 descarga todo desde el repositorio (DE python: 3.6.2), Github (RUN git clone ...) y packages.microsoft.com. Coloque dockerfile en% directorio_nombre%, junto a configuration.py (¿no olvidó descargarlo y completarlo?). Ensamble la imagen con el siguiente comando:

 docker build -t veeam_to_msteams:1.0 -f /path/%directory_name%/Dockerfile /path/%directory_name%/ 

Ejecute el contenedor:

 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 

Si desea ejecutar el script en otra plataforma o no quiere usar el contenedor, no importa, simplemente ejecute el archivo main.py, sin argumentos.


Es hora de que yo llene una taza de café, y si estás interesado, puedes terminar mi boceto para las necesidades de tu producción. “Solo paga por la entrega”, más precisamente, solo tiene que implementar esta entrega en su canal preferido.

Reuniré enlaces útiles:

  1. Mi proyecto en github
  2. Controlador Python SQL - pyodbc
  3. Crear conector de WebHook entrante
  4. Cómo habilitar el Conector de WebHook entrante para equipos de MS
  5. Biblioteca de Pymsteams
  6. Un tutorial de Docker para principiantes

Source: https://habr.com/ru/post/es415561/


All Articles