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 virtualiseringsstabelen er ment å ikke brukes som en stasjonær virtualiseringsprogramvare, snarere er den ment å kjøre på servere som tilbyr større fleksibilitet, effektivitet og stabilitet, i stedet for brukervennlighet. Det menes automatiseres til nth grad i stedet for å stole på manuell konfigurasjon. Så la oss se hvordan du kan koble deg til libvirt -demonet og automatisere grunnleggende VM -styring og overvåking ved hjelp av Python.

Oppsettet 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 er ment å få føttene våte med Libvirts Python -bindinger, når du designer søknaden din, bør du alltid henvise til den offisielle dokumentasjonen som dekker et bredt spekter av brukssaker og oppdateres rimelig ofte.

La oss installere alle avhengigheter som kreves for Libvirt først:

$ sudo apt install 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 rot, i stedet for å bli kjørt på en ekstern klient. Du kan imidlertid få tilgang til tjenestene eksternt som vil kreve en lang digresjon for å sikre forbindelsen mellom klienten og serveren. Derfor vil vi koble seg lokalt, for enkelhetens skyld.

Etablere 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. april 2019, 01:55:37)
[GCC 6.3.0 20170516] på Linux

Skriv inn "hjelp", "copyright", "studiepoeng" eller "lisens" for mer informasjon.

>>> Importer libvirt
>>> conn = libvirt.Åpne ('Qemu: /// System')

Variable Conn kan nå brukes til å spørre Libvirt -demonen, og vi vil gjøre det snart. Men først, litt digresjon.

Libvirt kan brukes til å administrere en rekke forskjellige virtualisering og containeriseringsstabel. KVM-Qemu, Xen og LXC er de mest populære av disse. Så når du går inn i libvirt.Åpen ('Qemu: /// System') Libvirt lar deg samle informasjon om og administrere, Qemu -gjester. Du kan like gjerne snakke med LXD Daemon eller Xen Hypervisor ved å bruke henholdsvis LXC: /// System eller Xen: /// System.

Tilsvarende metoden libvirt.Åpen () er ikke den eneste til din disposisjon. Åpne (navn), OpenAuth (URI, Auth, Flags) og OpenReadOnly (Name) er tre forskjellige samtaler som hver returnerer et Virconnect -objekt og tilbyr varierende kontrollnivå over verten. Du kan lese mer om dem her. Foreløpig har vi Conn som et objekt av Virconnect -klassen. Dette objektet er en inngangsport for å gjøre nesten alt fra å konfigurere hypervisoren selv til å endre gjestene og deres ressursallokering.

Når du er ferdig med å jobbe med objektet, må du huske å lukke forbindelsen ved å ringe den nære metoden på den.

>>> conn.Lukk()

Imidlertid ikke kjør kommandoen ovenfor, ennå. Fordi vi vil leke med libvirt litt mer. La oss spørre vår hypervisor noen få detaljer om seg selv, som vertsnavnet, og antall VCPUer som den kan tilby til Guest VMS totalt.

>>> conn.gethostname ()
'Deb'
>>> conn.getmaxvcpus ('qemu')
16

Nå må vi forstå at med libvirt -metadata om objekter som hypervisorstatistikk, VM -er, deres nettverks- og lagringsinfo osv. Er alle representert i XML -format. XML er sorta som JSON bare litt klønete (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

>>> skriv ut (conn.getSysInfo ())


Dell inc.
A14
..

Oppføring og overvåking av VMS

Hvis du vedlikeholder et stort utvalg av VM-er, trenger du en metode for å lage hundrevis av VM-er med ensartet konfigurasjon som også skaleres riktig fra enkle gjengede arbeidsmengder til flerkjerne, multi-threaded prosessering. Libvirt kaller gjesten VMS (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 VM -ene og deres ressursutnyttelse kan du bruke følgende samtaler:

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

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

Nettverket for dine virtuelle maskiner, VM -ene og til og med lagringsbassengene og volumene har sine individuelle UUID -er. Bruk liberal bruk av dem i Python -koden din, i stedet for å stole på menneskelige tildelte navn. Dessverre er måten å få UUID -er av domener litt rotete i den nåværende implementeringen av dette biblioteket, etter min mening. Det krever at du leverer IDen til VM (domene -ID), her er hvordan den ser ut.

DomainIDs = Conn.listdomainsid ()
for domainid i domainider:
domene = conn.LookUpById ()
uuid = domene.Uuidstring ()
Print (UUID)

Nå kan du se listen over Domain Uuider. Vi har også snublet over en ny Python -objekt 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 () tilknyttet det.

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

For eksempel:

>>> dir (Conn)
['_… GS', 'SchedulType', '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 å huske raskt det nøyaktige navnet på en metode og objektet det burde brukes med. Nå som vi har en libvirt.Virdomain -objekt, la oss bruke det til å liste opp forskjellige detaljer om denne løpende VM.

>>> domene.info ()

Dette gir deg informasjonen 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 seilaser inn i libvirt -teknologien var fraværet av uuider som førsteklasses borger sannsynligvis det eneste smertepunktet jeg møtte som virket som et dårlig designvalg. Annet enn det er libvirt ganske fin for det den 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 beslutninger alltid åpenbare, men kostnadene for å omskrive et programvare, så utbredt som libvirt, er ofte enorm.

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

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 å bruke Python og Libvirt. Dokumentasjonen er ganske omfattende med mange eksempler, og det tvinger deg virkelig til å tenke på riktig programvaredesign og virtualiseringsstabel samtidig.