Comment transférer des événements de Veeam Backup & Replication vers des messageries instantanées

Bonjour à tous! Dans cet article, je parlerai de la maniÚre de fournir des informations sur les résultats des actions de Veeam Backup & Replication v9.5 aux équipes MS. La méthode décrite dans la publication fonctionnera non seulement dans ce domaine, mais aussi dans tout autre messager - vous n'avez qu'à organiser la livraison des messages à l'aide de l'API de profil.



Imaginez d'abord ce que nous voulons rĂ©aliser. Nous voulons recevoir des informations sur ce qui se passe sur l'une de nos instances de logiciel de sauvegarde dans l'un de nos canaux de commande. La fonction est utile, elle sera utile aussi bien aux enfants qu'aux adultes, elle ravira votre Ăąme soeur et servira comme une excellente dĂ©coration de la table de fĂȘte. En d'autres termes, vous pouvez crĂ©er vous-mĂȘme un cas d'utilisation spĂ©cifique. Je ne veux en aucun cas limiter votre imagination - nous considĂ©rerons un prototype.

Nous allons résoudre le problÚme de la maniÚre la plus simple possible: voler les données de la base de données Veeam SQL, analyser un peu et les envoyer au canal à l'aide du connecteur WebHook entrant. Voici le plan d'action:

  1. Nous nous connectons à la base de données Veeam et obtenons des informations de [dbo]. [Backup.Model.JobSessions].
  2. Nous crĂ©ons le connecteur WebHook entrant dans le canal oĂč nous voulons envoyer des messages.
  3. Assembler le tout avec l'aide de la magie python pour le faire fonctionner.
  4. Enveloppez l'esquisse résultante dans un conteneur Docker.
  5. Ça marche!

Connectez-vous à la base de données Veeam Backup & Replication


Créez d'abord l'utilisateur sur le cÎté de l'instance MS SQL. Nous considérons MS SQL, car il s'agit de l'option par défaut préinstallée par notre logiciel. Nous donnons à l'utilisateur le minimum de droits - sélectionnez uniquement et à partir d'une seule table.

C'est facile Ă  faire. Connectez-vous Ă  l'instance de toutes les maniĂšres possibles pour vous et soumettez Ă  l'avance la demande suivante:

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 

N'oubliez pas de remplacer le nom de la base de données , trouvez un nom d'utilisateur et un mot de passe.

Si vous avez tout fait correctement, une tentative de mise à niveau ... échouera:



Mais sélectionnez - veuillez:



Gloire au RGPD - dans le cadre de cet échantillon, pas une seule base de production n'a souffert! Nous avons maintenant l'utilisateur ms_teams_watcher et nous pouvons commencer à collecter des données. Nous nous connecterons via pyodbc - pas SQLAlchemy, seulement hardcore!

Tout d'abord, ouvrez la connexion (voir la classe SQLConnectorVeeamDB ) et obtenez des informations sur toutes les sessions terminées lors de la derniÚre exécution de notre 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' 

La chose la plus importante pour nous est d'obtenir la derniĂšre usn du tableau, donc la prochaine fois de lui demander dĂ©jĂ , et pas par le temps. Si vous n'avez rien trouvĂ©, exĂ©cutez la requĂȘte suivante:

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

Statistiquement, cet usn sera supérieur à celui qui sera renvoyé lorsque la premiÚre demande sera exécutée, mais les JobSessions qui ne tombent pas dans la premiÚre sélection, nous n'en avons toujours pas besoin. Si nous n'avons pas trouvé les sessions terminées (état = -1) avec le résultat non Aucun (résultat! = -1) - rappelez-vous simplement usn, écrivez-le dans le fichier ini et répétez les demandes à un certain intervalle (mais déjà SQLConnectorVeeamDB.select_completed_job_sessions_after_usn).

Créer un connecteur WebHook entrant pour les équipes MS


Ici, tout est simple. Demandez Ă  votre administrateur MS Teams (Respect, si c'est vous) d'activer cette fonctionnalitĂ©, comme dĂ©crit ici . CrĂ©ez maintenant un connecteur de type Incoming WebHook . Cela at-il fonctionnĂ©? Vous ĂȘtes belle, rien d'autre Ă  faire, copiez l'url et enregistrez.

Tout mettre ensemble


Ici, vous pouvez tĂ©lĂ©charger le Dockerfile fini, ou l'esquisse elle-mĂȘme, que nous examinerons plus loin. N'oubliez pas de tĂ©lĂ©charger configuration.py_ , de le placer Ă  cĂŽtĂ© du Dockerfile, de remplir et de supprimer le soulignement de l'extension.

Voici à quoi ressemble le schéma d'esquisse conceptuel (l'image est cliquable):



Comme vous pouvez le voir sur le diagramme, la chose la plus intĂ©ressante est d'analyser la date reçue de la base de donnĂ©es Veeam, tout en crĂ©ant des objets de la classe VeeamEvent (juste un centre de donnĂ©es) et le processus d'envoi de notification lui-mĂȘme.

classe VeeamEvent (objet)


Dans le tableau à partir duquel nous prenons la date, toutes les tùches effectuées par Veeam sont enregistrées.
Chacun d'eux a l'attribut job_type. Il y en a beaucoup, mais j'ai souligné le plus intéressant pour nous - ne voulons-nous pas envoyer un message indiquant que quelqu'un a ouvert la console du programme ou terminé la restauration?

  • 0 - Travail de sauvegarde
  • 1 - Travail de rĂ©plication
  • 3 - Travail SureBackup
  • 24 - Travail de fichier sur bande
  • 28 - Sauvegarde sur bande
  • 51 - Travail de copie de sauvegarde
  • 100 - Sauvegarde de la configuration

Écrivez dans les commentaires, si vous ĂȘtes intĂ©ressĂ©, je demanderai d'autres types de tĂąches sur demande. Les tĂąches terminĂ©es peuvent ĂȘtre un succĂšs ou un avertissement, et parfois mĂȘme Ă©chouĂ©es.

En consĂ©quence, nous crĂ©ons un objet qui stocke toutes ces donnĂ©es en lui-mĂȘme + le nom de la tĂąche, usn, une description de l'Ă©tat de son achĂšvement (le cas Ă©chĂ©ant) et le temps d'achĂšvement. C'est cet objet qui est transfĂ©rĂ© pour envoyer un message au messager.

send_notification_to_web_hook ()


C'est encore plus simple ici - nous utilisons la bibliothĂšque pymsteams prĂȘte Ă  l'emploi, qui collecte simplement un message selon la spĂ©cification et l'envoie via requests.post. Dans mon exemple, je n'ai mĂȘme pas utilisĂ© les fonctions des cartes O365, qui sont Ă©galement prises en charge par WebHooks, mais j'ai simplement créé plusieurs modĂšles de message, selon le rĂ©sultat de la tĂąche.

 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 fantaisie est utile ici - ajoutez du texte, des images, des boutons, etc. Voici les types de messages que j'ai reçus:


Pour un travail de sauvegarde oĂč tout s'est bien passĂ©


Pour les tùches ayant échoué et les avertissements

Créer un conteneur Docker


Si vous n'avez pas encore Docker, consultez Un didacticiel Docker pour les débutants . Si tel est le cas, nous devons créer le Dockerfile suivant:

 # 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 lui-mĂȘme tĂ©lĂ©charge tout depuis le rĂ©fĂ©rentiel (FROM python: 3.6.2), Github (RUN git clone ...) et packages.microsoft.com. Mettez dockerfile dans% directory_name%, Ă  cĂŽtĂ© de configuration.py (n’avez-vous pas oubliĂ© de le tĂ©lĂ©charger et de le remplir?). Assemblez l'image avec la commande suivante:

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

Exécutez le conteneur:

 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 vous souhaitez exĂ©cuter le script sur une autre plate-forme ou ne souhaitez pas utiliser le conteneur du tout - cela n'a pas d'importance, exĂ©cutez simplement le fichier main.py lui-mĂȘme, sans argument.


Il est temps pour moi de remplir une tasse de cafĂ©, et si vous ĂȘtes intĂ©ressĂ©, vous pouvez terminer mon croquis pour les besoins de votre production. «Vous ne payez que pour la livraison», plus prĂ©cisĂ©ment, vous n'avez qu'Ă  implĂ©menter cette livraison sur votre canal prĂ©fĂ©rĂ©.

Je vais rassembler des liens utiles:

  1. Mon projet sur github
  2. Pilote SQL Python - pyodbc
  3. Création du connecteur WebHook entrant
  4. Comment activer le connecteur WebHook entrant pour les équipes MS
  5. BibliothĂšque Pymsteams
  6. Un tutoriel Docker pour les débutants

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


All Articles