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 está destinada a no usarse como un software de virtualización de escritorio, sino que está destinado a ejecutarse en servidores que ofrecen una mayor flexibilidad, eficiencia y estabilidad, en lugar de la facilidad de uso de los usuarios. Está destinado a ser automatizado a la nth grado en lugar de confiar en la configuración manual. Así que veamos cómo puede conectarse a su demonio libvirt y automatizar la gestión y el monitoreo básicos de VM utilizando Python.

La configuración y los supuestos básicos

Estoy usando una instalación de libvirt KVM en un servidor Debian. Los scripts de Python que usaré están funcionando en una Python 3.7.3 entorno. Se supone que este artículo se moja los pies con las enlaces de 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 razonablemente a menudo.

Instale todas las dependencias requeridas para Libvirt primero:

$ sudo apt install pkg-config libvirt-dev-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 de libvirt, como root, en lugar de ejecutarse en un cliente remoto. Sin embargo, puede acceder a los servicios de forma remota, que requeriría una larga digresión para asegurar la conexión entre el cliente y el servidor. Por lo tanto, nos conectaremos localmente, por simplicidad.

Establecer la conexión con el servicio Libvirtd

Para comenzar, abramos un aviso 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)
[GCC 6.3.0 20170516] en Linux

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

>>> importar libvirt
>>> conn = libvirt.Abrir ('Qemu: /// System')

La Variable Conn ahora se puede usar para consultar su demonio libvirt y lo haremos en breve. Pero primero, un poco de digresión.

Libvirt se puede utilizar para administrar una serie de diferentes virtualización y contenedores. KVM-Qemu, Xen y LXC son los más populares de estos. Entonces cuando entras libvirt.Open ('Qemu: /// System') Libvirt le permite recopilar información y administrar los invitados de QEMU. También puede hablar con LXD Daemon o Xen Hypervisor usando lxc: /// sistema o xen: /// sistema respectivamente.

Del mismo modo, el método libvirt.Open () no es el único a su disposición. Open (nombre), OpenAuth (URI, Auth, Flags) y OpenReadonly (Nombre) son tres llamadas diferentes, cada una de las cuales devuelve un objeto Virconnect y ofrece un nivel de control variable sobre el host. Puedes leer más sobre ellos aquí. Por ahora, tenemos a Conn como objeto de la clase Virconnect. Este objeto es una puerta de enlace para hacer casi cualquier cosa, desde la configuración del hipervisor mismo hasta modificar a 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 de cierre.

>>> Conn.cerca()

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

>>> Conn.gethostName ()
'debutante'
>>> Conn.getMaxvcpus ('qemu')
dieciséis

Ahora, debemos entender que con los metadatos de libvirt sobre objetos como estadísticas de hipervisores, máquinas virtuales, su información de redes y almacenamiento, etc. están representados en formato XML. XML es algo así como JSON solo un poco más torpe (y un poco mayor). Los datos se almacenan y se presentan como una cadena literal y lo que eso significa es que si consultas libvirt y la salida de esa consulta es XML, obtendrás una salida de línea única 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 limpiarla para la legibilidad humana

>>> Imprimir (Conn.getSysinfo ())


Dell Inc.
A14


Listado y monitoreo 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 escala correctamente de cargas de trabajo simples de un solo roscado hasta procesamiento múltiple y múltiples subprocesos. Libvirt llama a las máquinas virtuales de los invitados (o contenedores si está utilizando LXC) Dominio y puede enumerar información sobre dominios individuales y configurarlos si su objeto Virconnect tiene privilegios suficientes.

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

>>> Conn.listdomainsid ()
[4, 5]

Esto devuelve una variedad de ID de dominio que son solo enteros pequeños para una configuración simple de libvirt. Una forma más confiable de etiquetar a sus máquinas virtuales, sin tener dos máquinas virtuales (digamos en diferentes nodos) con la misma identificación o nombre, es usar uuids. En libvirt todo puede tener un uuid, que se genera aleatoriamente de 128 bits número. Las posibilidades de que creen dos uuid idénticos son bastante pequeñas.

La red para sus máquinas virtuales, las VM en sí 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 dominios es un poco complicado en la implementación actual de esta biblioteca, en mi opinión. Requiere que suministre la identificación de la VM (el ID de dominio), así es como se ve.

Domainids = Conn.listdomainsid ()
Para Domainida en Domainids:
dominio = Conn.LookupById ()
uuid = dominio.UuidString ()
Imprimir (uuid)

Ahora puedes ver la lista de uuids de dominio. También hemos tropezado con un nuevo objeto Python libvirt.Virdomain, que tiene su propio conjunto de métodos asociados con él, muy parecido a la variable Conn, que era una libvirt.Virconnect Object y tenía métodos como ListDomaInsid () y LookupById () asociados con él.

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

Por ejemplo:

>>> Dir (Conn)
['_ ... GS', 'SchedulerType', 'Captura de pantalla', 'SecurityLabel', 'SecurityLabellist',
'sendkey', 'sendProcessSignal', 'setautostar', '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.Objeto Virdomain, usémoslo para enumerar varios detalles sobre esta VM en ejecución.

>>> dominio.info ()

Esto le brinda la información sobre el estado de la VM, la memoria máxima y los núcleos de 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 tiene que preocuparse por su caso de uso y sin preocuparse por la enorme complejidad que maneja Libvirt.

Conclusión

En mis viajes a la tecnología Libvirt, la ausencia de Uuidas como ciudadano de primera clase fue probablemente el único punto de dolor que enfrenté, que parecía una mala opció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 encima, ya que el proyecto se evolucionó lenta y constantemente.

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