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:
- Nous nous connectons à la base de données Veeam et obtenons des informations de [dbo]. [Backup.Model.JobSessions].
- Nous crĂ©ons le connecteur WebHook entrant dans le canal oĂč nous voulons envoyer des messages.
- Assembler le tout avec l'aide de la magie python pour le faire fonctionner.
- Enveloppez l'esquisse résultante dans un conteneur Docker.
- Ă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')
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 avertissementsCré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:
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:
- Mon projet sur github
- Pilote SQL Python - pyodbc
- Création du connecteur WebHook entrant
- Comment activer le connecteur WebHook entrant pour les équipes MS
- BibliothĂšque Pymsteams
- Un tutoriel Docker pour les débutants