Pitón

Libvirt con Python

Libvirt con Python
En una de mis publicaciones anteriores, mostré cómo se puede comenzar con Libvirt y KVM. Esta pila de virtualización no está diseñada para usarse como un software de virtualización de escritorio, sino para ejecutarse en servidores que ofrecen mayor flexibilidad, eficiencia y estabilidad, en lugar de facilidad de uso. Está destinado a ser automatizado a la nth grado en lugar de depender de la configuración manual. Entonces, veamos cómo puede conectarse a su demonio libvirt y automatizar la administración y el monitoreo básicos de VM usando Python.

La configuración y los supuestos básicos

Estoy usando una instalación Libvirt KVM en un servidor Debian. Los scripts de Python que usaré se están ejecutando en un Python 3.7.3 medio ambiente. Se supone que este artículo debe mojarse los pies con los enlaces Python de Libvirt, cuando esté diseñando su aplicación, siempre debe consultar la documentación oficial que cubre una amplia gama de casos de uso y se actualiza con una frecuencia razonable.

Primero instalemos todas las dependencias requeridas para libvirt:

$ sudo apt install pkg-config libvirt-dev
$ pip3 instalar libvirt-python

Esos son todos los paquetes que necesitas.

Se ejecutan los siguientes scripts y fragmentos en la zona en el host Libvirt, como root, en lugar de ejecutarse en un cliente remoto. Puede acceder a los servicios de forma remota, sin embargo, eso requeriría una larga digresión para asegurar la conexión entre el cliente y el servidor. Por lo tanto, nos conectaremos localmente, en aras de la simplicidad.

Estableciendo conexión con el servicio Libvirtd

Para comenzar, abramos un indicador de Python, importemos la biblioteca libvirt y abramos una conexión con libvirt.método abierto.

root @ deb: ~ # python3
Python 3.7.3 (predeterminado, 15 de abril de 2019, 01:55:37)
[CCG 6.3.0 20170516] en Linux

Escriba "ayuda", "derechos de autor", "créditos" o "licencia" para obtener más información.

>>> importar libvirt
>>> conn = libvirt.abierto ('qemu: /// sistema')

La variable conn ahora se puede usar para consultar su demonio libvirt y lo haremos en breve. Pero primero, una pequeña digresión.

Libvirt se puede utilizar para administrar una serie de diferentes pilas de virtualización y contenedorización. KVM-QEMU, Xen y LXC son los más populares de estos. Entonces, cuando ingresas a libvirt.open ('qemu: /// system') libvirt le permite recopilar información y administrar invitados de QEMU. También puede hablar con el demonio LXD o el hipervisor Xen utilizando lxc: /// system o xen: /// system respectivamente.

Del mismo modo, el método libvirt.open () no es el único a tu disposición. open (name), openAuth (uri, auth, flags) y openReadOnly (name) son tres llamadas diferentes, cada una de las cuales devuelve un objeto virConnect y ofrece un nivel variable de control sobre el host. Puedes leer más sobre ellos aquí. Por ahora, tenemos conn como objeto de la clase virConnect. Este objeto es una puerta de enlace para hacer casi cualquier cosa, desde configurar el hipervisor hasta modificar los invitados y su asignación de recursos.

Una vez que haya terminado de trabajar con el objeto, asegúrese de cerrar la conexión llamando al método close en él.

>>> conexión.cerca()

Sin embargo, no ejecute el comando anterior, todavía. Porque jugaremos un poco más con libvirt. Preguntemos a nuestro hipervisor algunos detalles sobre sí mismo, como el nombre de host y la cantidad de vCPU que puede ofrecer a las VM invitadas en total.

>>> conexión.getHostname ()
'debutante'
>>> conexión.getMaxVcpus ('qemu')
dieciséis

Ahora, debemos entender que con Libvirt los metadatos sobre objetos como estadísticas de hipervisor, VM, su información de red y almacenamiento, etc., están todos representados en formato XML. XML es algo así como JSON, solo que un poco más torpe (y un poco más antiguo). Los datos se almacenan y presentan como una cadena literal y lo que eso significa es que si consulta libvirt y la salida de esa consulta es XML, obtendrá una salida de una sola línea realmente larga con '\ n' presente como una cadena literal en lugar de una nueva línea. La función de impresión incorporada de Python puede limpiarlo para facilitar la lectura humana

>>> imprimir (conn.getSysinfo ())


Dell Inc.
A14
..
 

Listado y supervisión de máquinas virtuales

Si mantiene una gran variedad de máquinas virtuales, necesita un método para crear cientos de máquinas virtuales con una configuración uniforme que también escale correctamente desde cargas de trabajo simples de un solo subproceso hasta procesamiento de varios núcleos y subprocesos múltiples. Libvirt llama a las VM invitadas (o contenedores si está usando LXC) Dominios y puede enumerar información sobre dominios individuales, así como configurarlos si su objeto virConnect tiene suficientes privilegios.

Para obtener información sobre las máquinas virtuales y su utilización de recursos, puede utilizar las siguientes llamadas:

>>> conexión.listDomainsID ()
[4, 5]

Esto devuelve una matriz de ID de dominio que son solo pequeños números enteros para una configuración simple de libvirt. Una forma más confiable de etiquetar sus VM, sin tener dos VM (digamos en diferentes nodos) con el mismo ID o nombre, es usar UUID. En libvirt todo puede tener un UUID, que es un número de 128 bits generado aleatoriamente. Las posibilidades de que cree dos UUID idénticos son bastante pequeñas.

La red de sus máquinas virtuales, las propias máquinas virtuales e incluso los grupos y volúmenes de almacenamiento tienen sus UUID individuales. Haga un uso liberal de ellos en su código Python, en lugar de depender de los nombres asignados por humanos. Desafortunadamente, la forma de obtener los UUID de los dominios es un poco complicada en la implementación actual de esta biblioteca, en mi opinión. Requiere que proporcione el ID de la VM (el ID de dominio), así es como se ve.

domainIDs = conn.listDomainsID ()
para domainID en domainIDs:
dominio = conn.lookupByID ()
uuid = dominio.UUIDString ()
imprimir (uuid)

Ahora puede ver la lista de UUID de dominio. También nos hemos topado con una nueva libvirt de objetos Python.virDomain, que tiene su propio conjunto de métodos asociados de forma muy similar a la variable conn que era una libvirt.virConnect objeto y tenía métodos como listDomainsID () y lookupByID () asociados con él.

Para ambos métodos, puede usar los métodos dir () integrados de Python para que los objetos puedan enumerar sus variables y métodos internos.

Por ejemplo:

>>> dir (conexión)
['_… Gs', 'SchedulerType', 'screenshot', 'securityLabel', 'securityLabelList',
'sendKey', 'sendProcessSignal', 'setAutostart', 'setBlkioParameters', 'setBlockIoTune',
'setGuestVcpus', 'setInterfaceParameters', 'setMaxMemory', 'setMemory', 'setMemoryFlags',
'setMemoryParameters', 'setMemoryStatsPeriod', 'setMetadata', 'setNumaParameters',
'setPerfEvents', 'setSchedulerParameters', 'setSchedulerParametersFlags', 'setTime',
'setUse'…]

Esto realmente puede ayudarlo a recordar rápidamente el nombre exacto de un método y el objeto con el que debe usarse. Ahora que tenemos una libvirt.virDomain, usémoslo para enumerar varios detalles sobre esta máquina virtual en ejecución.

>>> dominio.info ()

Esto le brinda la información sobre el estado de la máquina virtual, la memoria máxima y los núcleos de la CPU como se muestra aquí.

También puede encontrar otra información sobre la VM utilizando diferentes métodos como OSType ()

>>> dominio.OSType ()
'hvm'

Hay mucha flexibilidad cuando se trata de la API que expone libvirt y solo tienes que preocuparte por tu caso de uso y sin preocuparte por la enorme complejidad que maneja libvirt.

Conclusión

En mis viajes a la tecnología Libvirt, la ausencia de UUID como ciudadano de primera clase fue probablemente el único punto negativo al que me enfrenté, que parecía una mala elección de diseño. Aparte de eso, libvirt es bastante ingenioso por lo que logra. Sí, hay muchas otras cosas que podrían haberse hecho de una mejor manera, pero ese es siempre el caso con el software. En retrospectiva, las malas decisiones siempre son obvias, pero el costo de reescribir un software, tan extendido como libvirt, a menudo es tremendo.

Se ha construido mucho sobre él, ya que el proyecto evolucionó lenta y constantemente.

En lugar de intentar aprender toda la biblioteca a la vez, recomendaría crear un pequeño proyecto o una idea e implementarlo usando Python y Libvirt. La documentación es bastante extensa con muchos ejemplos y realmente te obliga a pensar en el diseño de software adecuado y la pila de virtualización al mismo tiempo.

Tutorial de OpenTTD
OpenTTD es uno de los juegos de simulación empresarial más populares que existen. En este juego, necesitas crear un maravilloso negocio de transporte....
SuperTuxKart para Linux
SuperTuxKart es un gran título diseñado para ofrecerte la experiencia Mario Kart de forma gratuita en tu sistema Linux. Es bastante desafiante y diver...
Tutorial de Battle for Wesnoth
The Battle for Wesnoth es uno de los juegos de estrategia de código abierto más populares que puedes jugar en este momento. Este juego no solo ha esta...