Python

Libvirt avec Python

Libvirt avec Python
Dans l'un de mes articles précédents, j'ai montré comment démarrer avec Libvirt et KVM. Cette pile de virtualisation n'est pas destinée à être utilisée comme un logiciel de virtualisation de bureau, mais plutôt à s'exécuter sur des serveurs offrant une plus grande flexibilité, efficacité et stabilité, au lieu de la convivialité. Il est destiné à être automatisé à la ne degré plutôt que de s'appuyer sur une configuration manuelle. Voyons donc comment vous pouvez vous connecter à votre démon libvirt et automatiser la gestion et la surveillance de base des machines virtuelles à l'aide de Python.

La configuration et les hypothèses de base

J'utilise une installation Libvirt KVM sur un serveur Debian. Les scripts Python que j'utiliserai s'exécutent dans un Python 3.7.3 environnement. Cet article est censé vous familiariser avec les liaisons Python de Libvirt. Lorsque vous concevez votre application, vous devez toujours vous référer à la documentation officielle qui couvre un large éventail de cas d'utilisation et est mise à jour assez souvent.

Installons d'abord toutes les dépendances requises pour libvirt :

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

C'est tous les packages dont vous avez besoin.

Les scripts et extraits suivants sont exécutés localement sur l'hôte Libvirt, en tant que root, plutôt que d'être exécuté sur un client distant. Vous pouvez accéder aux services à distance, cependant, cela nécessiterait une longue parenthèse dans la sécurisation de la connexion entre le client et le serveur. Par conséquent, nous allons nous connecter localement, par souci de simplicité.

Établissement de la connexion avec le service Libvirtd

Pour commencer, ouvrons une invite Python, importons la bibliothèque libvirt et ouvrons une connexion avec libvirt.méthode ouverte.

root@deb:~# python3
Python 3.7.3 (par défaut, 15 avril 2019, 01:55:37)
[CCG 6.3.0 20170516] sur Linux

Tapez "aide", "droit d'auteur", "crédits" ou "licence" pour plus d'informations.

>>> importer libvirt
>>> conn = libvirt.open('qemu:///system')

La variable conn peut maintenant être utilisée pour interroger votre démon libvirt et nous le ferons sous peu. Mais d'abord, une petite digression.

Libvirt peut être utilisé pour gérer un certain nombre de différentes piles de virtualisation et de conteneurisation. KVM-QEMU, Xen et LXC sont les plus populaires d'entre eux. Ainsi, lorsque vous entrez libvirt.open('qemu:///system') libvirt vous permet de collecter des informations sur et de gérer les invités QEMU. Vous pouvez tout aussi bien parler au démon LXD ou à l'hyperviseur Xen en utilisant respectivement lxc:///system ou xen:///system.

De même, la méthode libvirt.open() n'est pas le seul à votre disposition. open(name), openAuth(uri, auth, flags) et openReadOnly(name) sont trois appels différents dont chacun renvoie un objet virConnect et offre différents niveaux de contrôle sur l'hôte. Vous pouvez en savoir plus à leur sujet ici. Pour l'instant, nous avons conn comme objet de la classe virConnect. Cet objet est une passerelle pour faire presque n'importe quoi, de la configuration de l'hyperviseur lui-même à la modification des invités et de leur allocation de ressources.

Une fois que vous avez fini de travailler avec l'objet, assurez-vous de fermer la connexion en appelant la méthode close dessus.

>>> conn.Fermer()

Cependant, n'exécutez pas la commande ci-dessus, tout de suite. Parce que nous allons jouer un peu plus avec libvirt. Demandons à notre hyperviseur quelques détails sur lui-même, comme le nom d'hôte et le nombre de vCPU qu'il peut offrir aux VM invitées au total.

>>> conn.getHostname()
'deb'
>>> conn.getMaxVcpus('qemu')
16

Maintenant, nous devons comprendre qu'avec les métadonnées Libvirt sur les objets tels que les statistiques de l'hyperviseur, les machines virtuelles, leurs informations de mise en réseau et de stockage, etc. sont tous représentés au format XML. XML est un peu comme JSON seulement un peu plus maladroit (et un peu plus ancien). Les données sont stockées et présentées sous forme de chaîne littérale et cela signifie que si vous interrogez libvirt et que la sortie de cette requête est XML, vous obtiendrez une sortie très longue sur une seule ligne avec '\n' présent comme une chaîne littérale plutôt qu'un nouvelle ligne. La fonction d'impression intégrée de Python peut le nettoyer pour une lisibilité humaine

>>> imprimer (conn.getSysinfo())


Dell Inc.
A14

 

Lister et surveiller les machines virtuelles

Si vous gérez un large éventail de machines virtuelles, vous avez besoin d'une méthode pour créer des centaines de machines virtuelles avec une configuration uniforme qui s'adapte également correctement à partir de simples charges de travail à thread unique au traitement multicœur et multithread. Libvirt appelle les machines virtuelles invitées (ou les conteneurs si vous utilisez LXC) Domaines et vous pouvez répertorier les informations sur les domaines individuels ainsi que les configurer si votre objet virConnect dispose de privilèges suffisants.

Pour obtenir des informations sur les machines virtuelles et leur utilisation des ressources, vous pouvez utiliser les appels suivants :

>>> conn.listDomainsID()
[4, 5]

Cela renvoie un tableau d'ID de domaine qui ne sont que de petits entiers pour une configuration simple de libvirt. Un moyen plus fiable d'étiqueter vos machines virtuelles, sans avoir deux machines virtuelles (disons sur des nœuds différents) avec le même ID ou le même nom, consiste à utiliser des UUID. Dans libvirt, tout peut avoir un UUID, qui est un nombre 128 bits généré aléatoirement. Les chances que vous créiez deux UUID identiques sont en effet assez faibles.

Le réseau de vos machines virtuelles, les machines virtuelles elles-mêmes et même les pools et volumes de stockage ont leurs UUID individuels. Utilisez-les généreusement dans votre code Python, au lieu de vous fier aux noms attribués par l'homme. Malheureusement, la façon d'obtenir les UUID des domaines est un peu compliquée dans l'implémentation actuelle de cette bibliothèque, à mon avis. Cela vous oblige à fournir l'ID de la VM (l'ID de domaine), voici à quoi cela ressemble.

ID de domaine = conn.listDomainsID()
pour domainID dans domainIDs :
domaine = conn.rechercheParID()
uuid = domaine.UUIDString()
imprimer (uuid)

Vous pouvez maintenant voir la liste des UUID de domaine. Nous sommes également tombés sur un nouveau libvirt Python Object.virDomain, qui a son propre ensemble de méthodes qui lui sont associées, un peu comme la variable conn qui était une libvirt.objet virConnect et des méthodes telles que listDomainsID() et lookupByID() lui sont associées.

Pour ces deux méthodes, vous pouvez utiliser les méthodes dir() intégrées de Python afin que les objets puissent répertorier leurs variables et méthodes internes.

Par example:

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

Cela peut vraiment vous aider à vous rappeler rapidement le nom exact d'une méthode et l'objet avec lequel elle doit être utilisée. Maintenant que nous avons un libvirt.objet virDomain, utilisons-le pour répertorier divers détails sur cette machine virtuelle en cours d'exécution.

>>> domaine.Info()

Cela vous donne les informations concernant l'état de la VM, la mémoire maximale et les cœurs de processeur, comme indiqué ici.

Vous pouvez également trouver d'autres informations sur la VM en utilisant différentes méthodes comme OSType()

>>> domaine.OSType()
'hvm'

Il y a beaucoup de flexibilité en ce qui concerne l'API que libvirt expose et vous n'avez qu'à vous soucier de votre cas d'utilisation et sans vous soucier de l'énorme complexité que libvirt gère.

Conclusion

Lors de mes voyages dans la technologie Libvirt, l'absence d'UUID en tant que citoyen de première classe était probablement le seul problème auquel j'ai été confronté, ce qui semblait être un mauvais choix de conception. A part ça, libvirt est plutôt chouette pour ce qu'il accomplit. Oui, il y a beaucoup d'autres choses qui auraient pu être mieux faites, mais c'est toujours le cas avec les logiciels. Avec le recul, les mauvaises décisions sont toujours évidentes mais le coût de réécriture d'un logiciel, aussi répandu que libvirt, est souvent énorme.

Beaucoup de choses ont été construites dessus, car le projet a évolué lentement et régulièrement.

Au lieu d'essayer d'apprendre toute la bibliothèque à la fois, je recommanderais de proposer un petit projet ou une idée et de l'implémenter en utilisant Python et Libvirt. La documentation est assez complète avec de nombreux exemples et cela vous oblige vraiment à réfléchir en même temps à la conception appropriée du logiciel et à la pile de virtualisation.

Examen de la souris sans fil Microsoft Sculpt Touch
J'ai lu récemment sur le Microsoft Sculpt Touch souris sans fil et j'ai décidé de l'acheter. Après l'avoir utilisé pendant un certain temps, j'ai déci...
Trackpad et pointeur de souris à l'écran AppyMouse pour tablettes Windows
Les utilisateurs de tablettes ratent souvent le pointeur de la souris, surtout lorsqu'ils ont l'habitude d'utiliser les ordinateurs portables. Les sma...
Le bouton central de la souris ne fonctionne pas sous Windows 10
le bouton central de la souris vous aide à faire défiler de longues pages Web et des écrans contenant beaucoup de données. Si cela s'arrête, et bien v...