Python

Libvirt med Python

Libvirt med Python
I et av mine tidligere innlegg viste jeg hvordan man kan komme i gang med Libvirt og KVM. Denne virtualiseringsstakken er ikke ment å brukes som en stasjonær virtualiseringsprogramvare, men den er ment å kjøre på servere som gir større fleksibilitet, effektivitet og stabilitet, i stedet for brukervennlighet. Det er ment å være automatisert til nth grad i stedet for å stole på manuell konfigurasjon. Så la oss se hvordan du kan koble til libvirt-demonen din og automatisere grunnleggende VM-administrasjon og overvåking ved hjelp av Python.

Oppsett og grunnleggende forutsetninger

Jeg bruker en Libvirt KVM-installasjon på en Debian-server. Python-skriptene jeg skal bruke kjører i en Python 3.7.3 miljø. Denne artikkelen skal bli våt med Libvirts Python-bindinger. Når du designer applikasjonen din, bør du alltid henvise til den offisielle dokumentasjonen som dekker et bredt spekter av brukssaker og oppdateres rimelig.

La oss installere alle avhengighetene som kreves for libvirt først:

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

Det er alle pakkene du trenger.

Følgende skript og utdrag kjøres lokalt på Libvirt-verten, som root, i stedet for å kjøres på en ekstern klient. Du kan få tilgang til tjenestene eksternt, men det vil kreve en lang nedgang for å sikre forbindelsen mellom klienten og serveren. Derfor vil vi koble oss lokalt, for enkelhets skyld.

Opprette forbindelse med Libvirtd-tjenesten

For å komme i gang, la oss åpne en Python-ledetekst, importere libvirt-biblioteket og åpne en forbindelse med libvirt.åpen metode.

root @ deb: ~ # python3
Python 3.7.3 (standard, 15. apr 2019, 01:55:37)
[GCC 6.3.0 20170516] på linux

Skriv inn “help”, “copyright”, “credits” eller “lisens” for mer informasjon.

>>> import libvirt
>>> conn = libvirt.åpen ('qemu: /// system')

Variabelen Conn kan nå brukes til å spørre om libvirt-demonen din, og vi vil gjøre det snart. Men først litt avvikelse.

Libvirt kan brukes til å administrere en rekke forskjellige virtualiserings- og containeriseringsstak. KVM-QEMU, Xen og LXC er de mest populære av disse. Så når du går inn i libvirt.open ('qemu: /// system') libvirt lar deg samle informasjon om og administrere QEMU-gjester. Du kan like godt snakke med LXD-demon eller Xen hypervisor ved å bruke henholdsvis lxc: /// system eller xen: /// system.

Tilsvarende metoden libvirt.open () er ikke den eneste til din disposisjon. open (name), openAuth (uri, auth, flags) og openReadOnly (name) er tre forskjellige samtaler som hver returnerer et virConnect-objekt og tilbyr varierende nivå av kontroll over verten. Du kan lese mer om dem her. Foreløpig har vi konn som et objekt i virConnect-klassen. Dette objektet er en gateway for å gjøre nesten alt fra å konfigurere hypervisoren til å endre gjestene og deres ressurstildeling.

Når du er ferdig med å jobbe med objektet, må du sørge for å lukke forbindelsen ved å ringe lukkemetoden på den.

>>> tilk.Lukk()

Imidlertid ikke kjør kommandoen ovenfor, ennå. Fordi vi vil leke med libvirt litt mer. La oss spørre vår hypervisor om noen detaljer om seg selv, som vertsnavnet, og antall vCPUer som det totalt kan tilby virtuelle gjester.

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

Nå må vi forstå at med Libvirt-metadata om objekter som hypervisorstatistikk, virtuelle maskiner, deres nettverks- og lagringsinformasjon osv., Er alle representert i XML-format. XML er liksom JSON bare litt klumpete (og litt eldre). Dataene lagres og presenteres som en streng bokstavelig og hva det betyr er at hvis du spør libvirt og utdataene fra spørringen er XML, vil du få en veldig lang enkeltlinjeutgang med '\ n' til stede som en bokstavelig streng i stedet for en ny linje. Pythons innebygde utskriftsfunksjon kan rydde opp for menneskelig lesbarhet

>>> utskrift (tilk.getSysinfo ())


Dell Inc.
A14
..
 

Oppføring og overvåking av virtuelle maskiner

Hvis du opprettholder et stort utvalg av virtuelle maskiner, trenger du en metode for å lage hundrevis av virtuelle maskiner med ensartet konfigurasjon som også skaleres riktig fra enkle enkeltgjengede arbeidsbelastninger til flerkjernet, flertrådet behandling. Libvirt ringer gjestenes virtuelle maskiner (eller containere hvis du bruker LXC) Domener og du kan liste opp informasjon om individuelle domener samt konfigurere dem hvis virConnect-objektet ditt har tilstrekkelige privilegier.

For å få informasjon om virtuelle maskiner og deres ressursutnyttelse, kan du bruke følgende samtaler:

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

Dette returnerer en rekke domene-ID-er som bare er små heltall for et enkelt libvirt-oppsett. En mer pålitelig måte å merke virtuelle maskiner uten å ha to virtuelle maskiner (la oss si på forskjellige noder) med samme ID eller navn, er å bruke UUID. I libvirt kan alt ha en UUID, som tilfeldig genereres 128 bit nummer. Sjansene for at du lager to identiske UUID er ganske små.

Nettverket for dine virtuelle maskiner, VM-ene selv og til og med lagringsbassengene og volumene har sine individuelle UUID-er. Benytt deg av dem liberalt i Python-koden, i stedet for å stole på menneskelige navn. Dessverre er måten å få UUIDer til domener litt rotete i den nåværende implementeringen av dette biblioteket, etter min mening. Det krever at du oppgir ID-en til VM (domene-ID-en), slik ser den ut.

domainIDs = tilkobling.listDomainsID ()
for domainID i domainIDs:
domene = tilkobling.lookupByID ()
uuid = domene.UUIDString ()
skrive ut (uuid)

Nå kan du se listen over domene-UUID-er. Vi har også snublet over et nytt Python Object libvirt.virDomain, som har sitt eget sett med metoder assosiert med det omtrent som variabelen conn som var en libvirt.virConnect-objekt og hadde metoder som listDomainsID () og lookupByID () assosiert med det.

For begge disse metodene kan du bruke Pythons innebygde dir () -metoder slik at objektene kan vise sine interne variabler og metoder.

For eksempel:

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

Dette kan virkelig hjelpe deg med å huske raskt det eksakte navnet på en metode og objektet den burde brukes med. Nå som vi har et libvirt.virDomain-objekt, la oss bruke det til å liste opp forskjellige detaljer om denne kjørende VM.

>>> domene.info ()

Dette gir deg informasjon om tilstanden til VM, maksimalt minne og CPU-kjerner som vist her.

Du kan også finne annen informasjon om VM ved hjelp av forskjellige metoder som OSType ()

>>> domene.OSType ()
'hvm'

Det er mye fleksibilitet når det gjelder API som libvirt utsetter, og du trenger bare å bekymre deg for brukssaken din og uten å bekymre deg for den enorme kompleksiteten som libvirt håndterer.

Konklusjon

I mine reiser inn i Libvirt-teknologien var fraværet av UUID som førsteklasses borger sannsynligvis det eneste smertepunktet jeg møtte som virket som et dårlig designvalg. Annet enn det, er libvirt ganske greit for hva det oppnår. Ja, det er mange andre ting som kunne vært gjort på en bedre måte, men det er alltid tilfelle med programvare. I ettertid er dårlige avgjørelser alltid åpenbare, men kostnadene ved å skrive om en programvare, like utbredt som libvirt, er ofte enorme.

Mye har blitt bygget på toppen av det, ettersom prosjektet utviklet seg sakte og jevnt.

I stedet for å prøve å lære hele biblioteket på en gang, vil jeg anbefale å komme med et lite prosjekt eller en idé og implementere det ved hjelp av Python og Libvirt. Dokumentasjonen er ganske omfattende med mange eksempler, og det tvinger deg virkelig til å tenke på riktig programvaredesign og virtualiseringsstabel samtidig.

Hvordan endre MTU-størrelse i Linux
MTU (Stands for Maximum Transmission Unit) er den maksimale størrelsen på pakken som kan overføres fra et nettverksgrensesnitt. Alle enhetene, inklude...
Slik installerer du Shutter Screenshot Tool på Ubuntu 20.04 (LTS) og 20.10
The Shutter er et Linux-basert program for skjermbilder som er åpen kildekode og full av funksjoner. Skjermbilder av et vindu, skrivebord, menyer elle...
Slik installerer du Zimbra på Ubuntu 18.04 LTS
Zimbra Collaboration Server er programvare med åpen kildekode som består av en e-postserver og en webklient. Det gir mulighet for e-post, kalendering,...