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:
- Nós nos conectamos ao banco de dados Veeam e obtemos informações de [dbo]. [Backup.Model.JobSessions].
- Criamos o Incoming WebHook Connector no canal para o qual queremos enviar mensagens.
- Juntando tudo isso com a ajuda da magia python para fazê-la funcionar.
- Coloque o esboço resultante em um contêiner de encaixe.
- 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')
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 avisoCriar 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:
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:
- Meu projeto no github
- Driver SQL Python - pyodbc
- Criando o conector WebHook de entrada
- Como ativar o conector WebHook de entrada para equipes do MS
- Biblioteca Pymsteams
- Um tutorial do Docker para iniciantes