Como enviar eventos do Veeam Backup & Replication para mensageiros instantâneos

Olá pessoal! Neste post, falarei sobre como fornecer informações sobre os resultados das ações do Veeam Backup & Replication v9.5 para o MS Teams. O método descrito na postagem funcionará não apenas nisso, mas também em qualquer outro messenger - você só precisará organizar a entrega de mensagens usando a API do perfil.



Primeiro, imagine o que queremos alcançar. Queremos receber informações sobre o que está acontecendo em uma de nossas instâncias de software de backup em um de nossos canais de comando. A função é útil, será útil para crianças e adultos, deliciará sua alma gêmea e servirá como uma excelente decoração da mesa festiva. Em outras palavras, você pode criar um caso de usuário específico. De maneira alguma quero limitar sua imaginação - consideraremos um protótipo.

Vamos resolver o problema da maneira mais simples possível: roubar dados do banco de dados Veeam SQL, analisar um pouco e enviá-los ao canal usando o Incoming WebHook Connector. Aqui está o plano de ação:

  1. Nós nos conectamos ao banco de dados Veeam e obtemos informações de [dbo]. [Backup.Model.JobSessions].
  2. Criamos o Incoming WebHook Connector no canal para o qual queremos enviar mensagens.
  3. Juntando tudo isso com a ajuda da magia python para fazê-la funcionar.
  4. Coloque o esboço resultante em um contêiner de encaixe.
  5. Isso simplesmente funciona!

Conecte-se ao banco de dados Veeam Backup & Replication


Primeiro, crie o usuário ao lado da instância do MS SQL. Consideramos o MS SQL, já que esta é a opção padrão pré-instalada pelo nosso software. Damos ao usuário o mínimo de direitos - somente selecione e somente de uma tabela.

É fácil de fazer. Efetue login na instância da maneira que for possível e envie a solicitação a seguir:

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ão se esqueça de substituir o nome do banco de dados , crie um nome de usuário e senha.

Se você fez tudo certo, uma tentativa de atualização ... falhará:



Mas selecione - por favor:



Glória ao GDPR - dentro da estrutura desta amostra, nenhuma base de produção sofreu! Agora temos o usuário ms_teams_watcher e podemos começar a coletar dados. Vamos nos conectar através do pyodbc - sem SQLAlchemy, apenas hardcore!

Primeiro, abra a conexão (consulte a classe SQLConnectorVeeamDB ) e obtenha informações sobre todas as sessões que foram concluídas durante a última execução do nosso 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' 

O mais importante para nós é obter o último usn na tabela, para a próxima vez que solicitarmos já, e não pelo tempo. Se você não encontrou nada, execute a seguinte consulta:

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

Estatisticamente, esse usn será maior do que qualquer outro que retornará quando a primeira solicitação for executada, mas as JobSessions que não se enquadram na primeira seleção, ainda não precisamos. Se não encontrarmos as sessões concluídas (state = -1) com o resultado not None (result! = -1) - lembre-se de usn, grave-o no arquivo ini e repita as solicitações em um determinado intervalo (mas já SQLConnectorVeeamDB.select_completed_job_sessions_after_usn).

Criar conector WebHook de entrada para equipes do MS


Tudo é simples aqui. Peça ao administrador do MS Teams (respeito, se é você) para ativar esse recurso, conforme descrito aqui . Agora crie um conector do tipo Incoming WebHook . Isso deu certo? Você é linda, nada mais a fazer, copie o URL e salve.

Juntando tudo


Aqui você pode baixar o Dockerfile finalizado ou o próprio esboço, que consideraremos mais adiante. Lembre-se de baixar o arquivo configuration.py_ , colocá-lo ao lado do Dockerfile, preencher e remover o sublinhado da extensão.

Aqui está a aparência do esquema de esboço conceitual (a imagem é clicável):



Como você pode ver no diagrama, o mais interessante é analisar a data recebida do banco de dados Veeam, criando objetos da classe VeeamEvent (apenas um datacenter) e o próprio processo de envio de notificações.

classe VeeamEvent (objeto)


Na tabela da qual tiramos a data, todas as tarefas que a Veeam executa são registradas.
Cada um deles tem o atributo job_type. Existem muitos deles, mas destaquei o mais interessante para nós - não queremos enviar uma mensagem de que alguém abriu o console do programa ou concluiu a restauração?

  • 0 - Trabalho de backup
  • 1 - Trabalho de replicação
  • 3 - Trabalho do SureBackup
  • 24 - Trabalho de arquivo em fita
  • 28 - Trabalho de backup em fita
  • 51 - Trabalho de cópia de backup
  • 100 - Backup de configuração

Escreva nos comentários, se estiver interessado, solicitarei outros tipos de tarefas mediante solicitação. As tarefas concluídas podem ser bem-sucedidas ou avisadas, e às vezes até falham.

Como resultado, criamos um objeto que armazena todos esses dados em si + o nome da tarefa, usn, uma descrição do status de sua conclusão (se houver) e o tempo de conclusão. É esse objeto que é transferido para enviar uma mensagem ao mensageiro.

send_notification_to_web_hook ()


Ainda é mais simples aqui - usamos a biblioteca pymsteams pronta, que simplesmente coleta uma mensagem de acordo com a especificação e a envia através de orders.post. Na minha amostra, eu nem usei as funções de cartões do O365, que também são suportadas pelo WebHooks, mas simplesmente criei vários modelos de mensagens, dependendo do resultado da tarefa.

 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 

A fantasia é útil aqui - adicione qualquer texto, figuras, botões, etc. Aqui estão os tipos de mensagens que recebi:


Para um trabalho de backup em que tudo correu bem


Para tarefas com falha e aviso

Criar um contêiner de janela de encaixe


Se você ainda não possui o Docker, consulte Um tutorial do Docker para iniciantes . Se houver, precisamos criar o seguinte 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"] 

O próprio Docker baixa tudo do repositório (FROM python: 3.6.2), Github (RUN git clone ...) e packages.microsoft.com. Coloque dockerfile em% directory_name%, ao lado de configuration.py (não se esqueceu de fazer o download e preenchê-lo?). Monte a imagem com o seguinte comando:

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

Execute o contêiner:

 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 

Se você deseja executar o script em outra plataforma ou não deseja usar o contêiner, não importa, basta executar o próprio arquivo main.py, sem argumentos.


É hora de encher uma xícara de café e, se você estiver interessado, pode terminar meu esboço para as necessidades da sua produção. "Você paga apenas pela entrega", mais precisamente, você só precisa implementar essa entrega no seu canal preferido.

Vou reunir links úteis:

  1. Meu projeto no github
  2. Driver SQL Python - pyodbc
  3. Criando o conector WebHook de entrada
  4. Como ativar o conector WebHook de entrada para equipes do MS
  5. Biblioteca Pymsteams
  6. Um tutorial do Docker para iniciantes

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


All Articles