O backup para Linux não escreve letras

Olá pessoal!

Hoje, quero falar sobre como gerenciar o Veeam Agent for Linux usando a linha de comando e sobre quais possibilidades ele abre nas mãos hábeis de um programador.

Fui solicitado a escrever um artigo com um comentário em um artigo anterior. Parafraseando a surpresa do usuário: "Bem, como assim? O servidor não escreve cartas informando que foi salvo! ” Além disso, de acordo com analistas, ele não é o único, caso contrário, o tópico não teria aparecido no fórum. E como as pessoas escrevem, significa que alguém precisa!

No artigo, explicarei por que esse recurso não está no produto. Mas não vamos parar por aí, vamos adicionar essa função! Como somos programadores, escrevemos uma carta e geramos um relatório na forma de uma página html.


Além disso, mostrarei os comandos mais úteis, na minha opinião, que podem facilitar o trabalho do administrador.

Prepare-se: muito código, sem imagens.

Primeiro, vamos responder à pergunta: "Por que o Veeam Agent for Linux não escreve cartas?"

Você pode não gostar das respostas, não me culpe. Mas o fato é que os usuários corporativos mais ou menos grandes não precisam disso, e aqui está o porquê:

  • Primeiramente, para trabalhar com o correio, você deve colocar o servidor smpt na máquina local ou usar alguém na rede. Com a implementação mais simples (comando mail ), você precisará instalar o pacote mailutils . E muitos administradores de sistema não desejam criar uma vulnerabilidade em potencial no servidor de produção na forma de um serviço que pode enviar cartas para qualquer lugar. Sim, e a possibilidade pode não ser devido às portas fechadas, à independência de sub-redes, etc.
  • Em segundo lugar, como o pacote mailutils pode muito bem não estar no sistema (pela primeira razão), não faz sentido tentar usá-lo. Caso contrário, podemos obter uma função que parece estar lá, mas "pronto para uso" não funciona, o que significa que haverá um tópico no fórum sobre um tópico como: "Como configurar o servidor para que as cartas sejam enviadas".
  • E, em terceiro lugar, em geral, nenhuma notificação adicional é necessária, pois clientes corporativos mais ou menos grandes usam o Veeam Backup & Replication . Seu console coleta informações sobre todos os backups feitos em repositórios conhecidos. Veja você mesmo.

Na versão do Veeam Backup & Replication 9.5, atualização 4 , é possível usar este produto gratuitamente, mas com uma restrição nas máquinas físicas / virtuais.
Se você tiver até 3 servidores físicos (inclusive), as funções VBR gratuitas serão mais que suficientes para você.

Se você possui mais de três máquinas, não há como pagar pelo software, mas ainda deseja monitorar centralmente seus servidores, sugiro adicionar você mesmo alguns scripts. Eu gosto de me divertir em python depois de trabalhar para C / C ++.

veeamconfig , encerraremos a veeamconfig comando veeamconfig . A equipe veeamconfig fornece acesso a todas as funcionalidades do produto. Sem dúvida, a interface pseudográfica criada usando a biblioteca ncurses é muito mais agradável aos olhos, no entanto, se você precisar vincular programas a algo novo, a CLI é tudo.

A descrição dos comandos do Veeam Agent for Linux é válida para a versão 3.0. Não verifiquei as versões anteriores, portanto, pode haver diferenças.

A interface da CLI no Veeam Agent for Linux é bastante conveniente e bem documentada. Basta digitar veeamconfig --help e você obterá uma lista dos comandos disponíveis:

 $sudo veeamconfig --help Veeam Agent for Linux (c) Veeam Software AG Usage: veeamconfig [command] Commands: repository - Backup repositories management vbrserver - Veeam Backup and Replication servers management job - Backup jobs management backup - Backups management point - Restore points management license - License management agreement - End User License Agreement management config - Import/export configuration schedule - Jobs schedule configuration cloud - Cloud provider management mode - Operation mode session - Sessions management ui - User interface aap - Application-aware processing version, --version, -v - Product version help, --help, -h - Short help 

Para ver o que cada comando permite, basta chamar veeamconfig config --help . Temos:

 Veeam Agent for Linux (c) Veeam Software AG Usage: veeamconfig config [command] Commands: import - Import repositories and jobs into database export - Export repositories and jobs from database grabLogs - Collect support logs bundle patchiso - Create custom Veeam Recovery Media adding all hardware drivers from this system help, --help, -h - Short help 

Aqui, a propósito, podemos ver o grabLogs log collection. Isso permitirá que você colete rapidamente todos os logs necessários para suporte. Isso ocorre caso algo dê errado.

Há também uma equipe interessante que apareceu na versão 3.0:

 $ sudo veeamconfig agreement --help Veeam Agent for Linux (c) Veeam Software AG Usage: veeamconfig agreement [command] Commands: acceptEula - Accept Veeam End User License Agreements acceptThirdPartyLicenses - Accept Veeam 3rd party License Agreement show - Show End User License Agreements acceptance status help, --help, -h - Short help 

O fato é que, começando com a versão 3.0, o usuário deve concordar explicitamente com os contratos de licença. Parece algo como isto:

 $ sudo veeamconfig job list I accept Veeam Software End User License Agreement: /usr/share/doc/veeam/EULA (yes/no | y/n): yes I accept the terms of the following 3rd party software components license agreements: /usr/share/doc/veeam/3rd_party (yes/no | y/n): 

Consequentemente, a operação de seus scripts pode ser interrompida. Para não entrar em todas as máquinas e não executar este procedimento manualmente, foram fornecidos os seguintes comandos:

 veeamconfig agreement acceptEula veeamconfig agreement acceptThirdPartyLicenses 

Eles permitem que você aceite contratos de licenciamento sem mais perguntas.

Mas nos desviamos do tópico de escrever uma carta.

Para a tarefa de monitoramento de status do servidor, precisamos do comando veeamconfig session list . Ele gera algo como:

 Job name Type ID State Started at Finished at bj-home Backup {dbe48e88-3df7-4712-a472-09af8fed4e80} Success 2018-12-05 15:43 2018-12-05 15:44 bj-home Backup {c178a799-2935-4bd6-883b-b11278000076} Success 2018-12-05 16:26 2018-12-05 16:26 bj-home Backup {3405dad3-0016-4a00-933e-60ef66b30324} Success 2018-12-06 06:00 2018-12-06 06:00 

Bem, há informações aqui quando o backup do servidor foi feito e qual foi o sucesso. Em princípio, já é possível coletar o “escape” em um arquivo e enviá-lo por carta. No entanto, em um ano, a carta pode crescer aproximadamente 365 linhas. E procurar Estado com erros pode parecer tedioso. Portanto, analisaremos esse "escape" e obteremos uma lista normal com a qual você já pode fazer alguma coisa.

Veja o código completo aqui

 class CSession: @staticmethod def List(): return subproccall( ["veeamconfig", "session", "list"] ) class CSessionInfoList(object): def __init__(self, list): self.list = list def List(self): return self.list @staticmethod def Get(): text = CSession.List() lines = text.split("\n") list = [] # session info list for line in lines: if len(line) == 0: continue words = line.split() if len(words) == 0: continue if words[0] == "Job": continue if words[0] == "Total": continue try: jobName = words[0] type = words[1] id = words[2] state = words[3] startTime = words[4] + " " + words[5] finishTime = words[6] + " " + words[7] list.append(CSessionInfo(id, type, jobName, state, startTime, finishTime)) except: print "Failed to parse [", line, "]" return CSessionInfoList(list) 

Bem, agora vamos fazer uma carta e enviá-la para nós mesmos.

 def SendMailsessions(): print "---" print "Sending statistic to administrator:" sessions = veeamlpb.session.CSessionInfoList.Get() recipient = "dear.admin@company.com" subject = "VAL status notification" text = "Statistic:\n" inx = 0; successCount = 0 warningCount = 0 errorCount = 0 for sessionInfo in sessions.List(): if (sessionInfo.State() == "Success"): successCount += 1 elif (sessionInfo.State() == "Warning"): warningCount += 1 else: errorCount += 1 text += str(successCount)+"/"+str(warningCount)+"/"+str(errorCount)+" Success/Warning/Error\n" text += "Last 10 session:\n" for sessionInfo in reversed(sessions.List()): if inx == 10: text += "...\n" break; text += str(inx)+" | "+sessionInfo.State()+" | "+sessionInfo.JobName()+" | "+sessionInfo.StartTime()+" / "+sessionInfo.FinishTime() + "\n" #text += inx += 1 text += "\n" text += "--------------------------------------------------------------------------------\n" text += " Yours sincerely, Veeam Agent for Linux Monitor\n" print text os.system("echo '"+text+"' | mail -s '"+subject+"' "+recipient) 

Como resultado, após a instalação do mailutils, podemos obter uma carta do formulário:

 Statistic: 3/0/0 Success/Warning/Error Last 10 session: 0 | Success | bj-home | 2018-12-06 06:00 / 2018-12-06 06:00 1 | Success | bj-home | 2018-12-05 16:26 / 2018-12-05 16:26 2 | Success | bj-home | 2018-12-05 15:43 / 2018-12-05 15:44 -------------------------------------------------------------------------------- Yours sincerely, Veeam Agent for Linux Monitor 

A carta exibe apenas as últimas 10 sessões. Ao mesmo tempo, informações sobre o número de sessões bem-sucedidas e não muito exibidas são exibidas no início da carta. Basta olhar para os números da carta no início do dia útil, verificando o correio e bebendo uma cafeteira para entender que os backups noturnos foram bem-sucedidos.

Se você precisar de algo mais óbvio, poderá solicitar informações sobre as sessões no formato xml e transferi-las para o servidor. Lá, combine os dados obtidos em uma única tabela de resumo que exibe todas as informações necessárias em um formato conveniente ou viável para você.
Temos o par XML de linhas:

 sessionList = veeamlpb.session.CSessionList() text = sessionList.ToXml() 

Salve o arquivo resultante

 sessionListFileName = "session_list.xml" print "Store XML to file: ",sessionListFileName sessionListXmlFile = open(sessionListFileName, "w") sessionListXmlFile.write(text) sessionListXmlFile.close() 

Em seguida, enviamos o XML recebido para o servidor. Uma opção alternativa também é possível - o servidor coleta XMLs de máquinas com backup. Quem é o iniciador ainda não é importante para nós. É importante que os arquivos XML sejam coletados no servidor com listas de sessões de todas as máquinas. Eu escolhi a primeira opção:

 hostname = os.uname()[1] target = "user@admin-desktop:/home/user" os.system("scp ./"+sessionListFileName+" "+target+"/backups/"+hostname+"/session_list.xml") 

Agora, no lado do servidor, resta processar os dados recebidos e criar uma bela página html.

 import veeamlpb import os import datetime import xml.etree.ElementTree as xml def main(): hosts = [] backupsDirectory = "/home/user/backups" for item in os.listdir(backupsDirectory): if item in [".", ".."]: continue if os.path.isdir(os.path.join(backupsDirectory,item)): hosts.append(item) print "item: ",item if len(hosts) == 0: return 0 backupSessionMap = {} for host in hosts: print "found host: ", host sessionInfoFile = os.path.join(os.path.join(backupsDirectory,host), "session_list.xml") sessionList = veeamlpb.session.CSessionInfoList.FromXmlFile(sessionInfoFile) backupSessionMap[host] = sessionList for sessionInfo in sessionList.List(): print "Session:",sessionInfo.ToString() html = xml.Element("html") body = xml.SubElement(html, "body", {"style":"background-color: #00b336;"}) xml.SubElement(body,"h1").text = "Report at "+datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") xml.SubElement(body,"h2").text = "Statistic:" for host in hosts: sessionList = backupSessionMap[host] success=0 warning=0 error=0 if len(sessionList.List()) == 0: continue for sessionInfo in sessionList.List(): if sessionInfo.State() == "Success": success +=1 elif sessionInfo.State() == "Warning": warning +=1 else: error +=1 latestSessionInfo = sessionList.List()[-1] attr = {} if latestSessionInfo.State() == "Success": #attr["style"] = "background-color: #00b336;" attr["style"] = "background-color: #005f4b; color: white;" elif latestSessionInfo.State() == "Warning": attr["style"] = "background-color: #93ea20;" else: attr["style"] = "background-color: #ba0200; color: white;" xml.SubElement(xml.SubElement(body,"p"),"span", attr).text = \ host + " - "+str(success)+"/"+str(warning)+"/"+str(error)+" Success/Warning/Error" for host in hosts: sessionList = backupSessionMap[host] xml.SubElement(body,"h2").text = host+":" tableStyle =xml.SubElement(body,"style") tableStyle.attrib["type"] = "text/css" tableStyle.text = "TABLE {border: 1px solid green;} TD{ border: 1px solid green; padding: 4px;}" table = xml.SubElement(body,"table") thead = xml.SubElement(table, "thead") xml.SubElement(thead, "th").text = "Number" xml.SubElement(thead, "th").text = "State" xml.SubElement(thead, "th").text = "Job name" xml.SubElement(thead, "th").text = "Start at" xml.SubElement(thead, "th").text = "Complete at" tbody = xml.SubElement(table, "tbody") inx = 0 for sessionInfo in reversed(sessionList.List()): if inx == 10: break; tr = xml.SubElement(tbody,"tr") xml.SubElement(tr, "td").text = str(inx) attr ={} if sessionInfo.State() == "Success": pass elif sessionInfo.State() == "Warning": attr["style"] ="background-color: #93ea20;" else: attr["style"] ="background-color: #ba0200; color: white;" xml.SubElement(tr, "td", attr).text = sessionInfo.State() xml.SubElement(tr, "td").text = sessionInfo.JobName() xml.SubElement(tr, "td").text = sessionInfo.StartTime() xml.SubElement(tr, "td").text = sessionInfo.FinishTime() inx += 1 xml.ElementTree(html).write("summary.html", encoding='utf-8', method='html') return 0 exit(main()) 

Como resultado, o relatório está pronto:



Eu não tinha tarefa de fazer um produto bonito. A tarefa era mostrar que a questão da coleta de estatísticas pode ser resolvida em scripts em um a dois dias.

Em princípio, se você desenvolver as idéias apresentadas aqui, poderá criar um “Monitor de backup aberto para o Veeam Agent for Linux”. Na minha opinião, um bom tópico para cursos em Python, ou talvez até para um diploma, ou apenas uma desculpa para praticar a programação em um projeto de código aberto. Concordo, é melhor praticar a programação do que se tornar um elfo do 80º nível.

Todo o código pode ser encontrado em http://www.github.com/CodeImp/veeampy/ . Baixe, use, complemente e garfo na saúde.

Observe que o código é distribuído sob a licença GPL-2, pode conter erros e muito mais. Tudo é como sempre no mundo do código-fonte aberto. Portanto, antes de usar na produção - não esqueça de dirigir em um laboratório de teste.

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


All Articles