Backup for Linux no escribe cartas

Hola a todos!

Hoy quiero contarles sobre cómo administrar Veeam Agent para Linux usando la línea de comandos, y sobre las posibilidades que se abren en manos expertas de un programador.

Se me solicitó que escribiera un artículo mediante un comentario sobre un artículo anterior. Parafraseando la sorpresa del usuario: "Bueno, ¿cómo es eso? ¡El servidor no escribe cartas indicando que se ha guardado! Además, según los analistas, él no es el único, de lo contrario el hilo no habría aparecido en el foro. Y como la gente escribe, ¡significa que alguien lo necesita!

En el artículo explicaré por qué esta característica no está en el producto. Pero no nos detendremos allí, ¡agregaremos esta función! Somos programadores, por lo que escribiremos una carta y generaremos un informe en forma de página html.


Además, mostraré los comandos más útiles, en mi opinión, que pueden facilitar el trabajo del administrador.

Prepárese: mucho código, sin imágenes.

Primero, respondamos la pregunta: "¿Por qué Veeam Agent para Linux no escribe cartas?"

Puede que no te gusten las respuestas, no me culpes. Pero el hecho es que los usuarios de empresas más o menos grandes no necesitan esto, y he aquí por qué:

  • En primer lugar, para trabajar con el correo, debe colocar el servidor smpt en la máquina local o utilizar uno en la red. Con la implementación más simple (comando de mail ), necesitará instalar el paquete mailutils . Y muchos administradores de sistemas no querrán crear una vulnerabilidad potencial en su servidor de producción en forma de un servicio que pueda enviar cartas a cualquier parte. Sí, y la posibilidad puede no deberse a los puertos cerrados, la independencia de las subredes, etc.
  • En segundo lugar, dado que el paquete mailutils puede no estar en el sistema (por la primera razón), no tiene sentido intentar usarlo. De lo contrario, podemos obtener una función que parece estar allí, pero "fuera de la caja" no funciona, lo que significa que habrá un hilo en el foro sobre un tema como: "Cómo configurar el servidor para que se envíen las cartas".
  • Y en tercer lugar, en general, no se necesita ninguna notificación adicional, ya que los clientes empresariales más o menos grandes usan Veeam Backup & Replication . Su consola recopila información sobre todas las copias de seguridad realizadas en repositorios conocidos. Compruébalo por ti mismo.

En la versión de Veeam Backup & Replication 9.5 Update 4 , es posible usar este producto de forma gratuita, pero con una restricción en las máquinas virtuales / físicas con servicio.
Si tiene hasta 3 servidores físicos (incluidos), las funciones VBR gratuitas serán más que suficientes para usted.

Si tiene más de 3 máquinas, no hay forma de pagar el software, pero aún así desea monitorear centralmente sus servidores, le sugiero que agregue algunos scripts. Me gusta divertirme en Python después de trabajar para C / C ++.

veeamconfig envolveremos la veeamconfig comando veeamconfig . El equipo de veeamconfig proporciona acceso a toda la funcionalidad del producto. Sin lugar a dudas, la interfaz pseudográfica creada usando la biblioteca ncurses es mucho más agradable a la vista, sin embargo, si necesita vincular programas en algo nuevo, entonces la CLI es nuestro todo.

La descripción de los comandos de Veeam Agent para Linux es válida para la versión 3.0. No verifiqué las versiones anteriores, por lo que puede haber diferencias.

La interfaz CLI en Veeam Agent para Linux es bastante conveniente y está bien documentada. Simplemente ingrese veeamconfig --help y obtendrá una lista de comandos disponibles:

 $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 qué le permite hacer cada comando, simplemente llame a veeamconfig config --help . Obtenemos:

 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 

Aquí, por cierto, podemos ver el grabLogs recopilación de registros grabLogs . Le permitirá recopilar rápidamente todos los registros necesarios para obtener soporte. Esto es en caso de que algo salga mal.

También hay un equipo interesante que apareció en la versión 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 

El hecho es que a partir de la versión 3.0, el usuario debe aceptar explícitamente los acuerdos de licencia. Se parece a esto:

 $ 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): 

En consecuencia, la operación de sus scripts puede verse afectada. Para no ingresar a todas las máquinas y no realizar este procedimiento manualmente, se proporcionaron los siguientes comandos:

 veeamconfig agreement acceptEula veeamconfig agreement acceptThirdPartyLicenses 

Le permiten aceptar acuerdos de licencia sin más preguntas.

Pero nos desviamos del tema de escribir una carta.

Para la tarea de supervisión del estado del servidor, necesitamos el veeamconfig session list . Produce 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 

Bueno, hay información aquí cuando se hizo una copia de seguridad del servidor y cuál fue el éxito. En principio, ya es posible recopilar el "escape" en un archivo y enviarlo por carta. Sin embargo, en un año la carta puede crecer aproximadamente 365 líneas. Y buscar un Estado con errores puede parecer tedioso. Por lo tanto, analizaremos este "escape" y obtendremos una lista normal con la que ya puede hacer algo.

Vea el código completo aquí

 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) 

Bueno, ahora hagamos una carta y envíenosla a nosotros mismos.

 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, después de instalar mailutils, podemos obtener una carta del formulario:

 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 

La carta muestra solo las últimas 10 sesiones. Al mismo tiempo, se muestra información sobre el número de sesiones exitosas y no muy exitosas al comienzo de la carta. Es suficiente mirar los números en la carta al comienzo de la jornada laboral, revisar el correo y beber una cafetera para comprender que los refuerzos nocturnos fueron exitosos.

Si necesita algo más obvio, puede solicitar información sobre las sesiones en formato xml y transferirla a su servidor. Allí, combine los datos obtenidos en una única tabla de resumen que muestre toda la información necesaria en un formato conveniente o factible para usted.
Obtenemos el par de líneas XML:

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

Guarda el archivo resultante

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

Luego enviamos el XML recibido al servidor. También es posible una opción alternativa: el servidor recopila XML de las máquinas que tienen una copia de seguridad. Quién es el iniciador no es importante para nosotros todavía. Es importante que los archivos XML se recopilen en el servidor con listas de sesiones de todas las máquinas. Elegí la primera opción:

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

Ahora, en el lado del servidor, queda procesar los datos recibidos y crear una hermosa 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, el informe está listo:



No tenía la tarea de hacer un producto hermoso. La tarea consistía en mostrar que la cuestión de recopilar estadísticas se puede resolver en scripts en uno o dos días.

En principio, si desarrolla las ideas presentadas aquí, puede hacer un "Monitor de respaldo abierto para Veeam Agent para Linux". En mi opinión, es un buen tema para los cursos en Python, o tal vez incluso para un diploma, o simplemente una excusa para practicar la programación en un proyecto de código abierto. De acuerdo, es mejor practicar la programación que convertirse en un elfo de nivel 80.

Todo el código se puede encontrar en http://www.github.com/CodeImp/veeampy/ . Descarga, uso, suplemento y tenedor sobre salud.

Tenga en cuenta que el código se distribuye bajo la licencia GPL-2, puede contener errores y más. Todo es como siempre en el mundo del código abierto. Por lo tanto, antes de usarlo en producción, no olvide conducir en un laboratorio de pruebas.

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


All Articles