Namestitev in osnovne predpostavke
Na strežniku Debian uporabljam namestitev Libvirt KVM. Skripti Python, ki jih bom uporabljal, se izvajajo v Pythonu 3.7.3 okolje. Ta članek naj bi vam namočil noge z Libvirtovimi vezmi Python. Ko načrtujete svojo aplikacijo, se morate vedno sklicevati na uradno dokumentacijo, ki zajema širok spekter primerov in se pogosto pogosto posodablja.
Najprej namestimo vse odvisnosti, potrebne za libvirt:
$ sudo apt install pkg-config libvirt-dev$ pip3 namesti libvirt-python
To so vsi paketi, ki jih potrebujete.
Zaženejo se naslednji skripti in delčki lokalno na gostitelju Libvirt kot root, namesto da se izvaja na oddaljenem odjemalcu. Do storitev lahko dostopate na daljavo, vendar bi bilo potrebno dolgo odstopanje do zagotavljanja povezave med odjemalcem in strežnikom. Zato se bomo zaradi poenostavitve povezovali lokalno.
Vzpostavitev povezave s storitvijo Libvirtd
Za začetek odprimo poziv Python, uvozimo knjižnico libvirt in odpremo povezavo z libvirt.odprta metoda.
root @ deb: ~ # python3Python 3.7.3 (privzeto, 15. april 2019, 01:55:37)
[GCC 6.3.0 20170516] na Linuxu
Za več informacij vnesite »pomoč«, »avtorske pravice«, »dobropisi« ali »licenca«.
>>> uvozi libvirt>>> conn = libvirt.odprto ('qemu: /// sistem')
Spremenljivko conn lahko zdaj uporabite za poizvedovanje vašega demona libvirt in to bomo storili v kratkem. Najprej pa malo odmika.
Libvirt se lahko uporablja za upravljanje številnih različnih nizov za virtualizacijo in vsebništvo. KVM-QEMU, Xen in LXC so med njimi najbolj priljubljeni. Torej, ko vnesete libvirt.open ('qemu: /// system') libvirt vam omogoča zbiranje informacij o gostih QEMU in upravljanje z njimi. Prav tako se lahko pogovorite z demonom LXD ali hipervizorjem Xen s sistemom lxc: /// ali sistemom xen: ///.
Podobno je metoda libvirt.open () ni edini, ki vam je na voljo. open (name), openAuth (uri, auth, flags) in openReadOnly (name) so trije različni klici, od katerih vsak vrne objekt virConnect in ponuja različno raven nadzora nad gostiteljem. Več o njih si lahko preberete tukaj. Za zdaj imamo conn kot objekt razreda virConnect. Ta objekt je prehod za skoraj vse, od konfiguriranja samega hipervizorja do spreminjanja gostov in njihove dodelitve virov.
Ko končate z delom z objektom, ne pozabite zapreti povezave, tako da na njej pokličete metodo close.
>>> povez.zapri ()Vendar še vedno ne zaženite zgornjega ukaza. Ker se bomo še malo poigrali z libvirtom. Vprašajte našega hipervizorja nekaj podrobnosti o sebi, kot je ime gostitelja, in število vCPU-jev, ki jih lahko skupaj ponudi gostujočim VM-jem.
>>> povez.getHostname ()'deb'
>>> povez.getMaxVcpus ('qemu')
16
Zdaj moramo razumeti, da so z metapodatki Libvirt o predmetih, kot so statistika hipervizorjev, VM-ji, njihovi podatki o omrežju in shranjevanju itd., Predstavljeni v obliki XML. XML je nekako podoben JSON-u, le nekoliko okornejši (in nekoliko starejši). Podatki so shranjeni in predstavljeni kot nizovna dobesedna beseda, kar pomeni, da če poizvedujete po libvirt in je rezultat te poizvedbe XML, boste dobili resnično dolg izhod v eno vrstico z \ \ n kot dobesedni niz in ne kot nova vrstica. Pythonova vgrajena funkcija tiskanja jo lahko očisti za človeško čitljivost
>>> tiskanje (prik.getSysinfo ())..
Seznam in spremljanje VM
Če vzdržujete veliko paleto VM-jev, potrebujete metodo za ustvarjanje na stotine VM-jev z enakomerno konfiguracijo, ki prav tako ustrezno merijo od enostavnih delovnih obremenitev z enim navojem do večjedrne obdelave z več navoji. Libvirt pokliče gostujoče VM-je (ali vsebnike, če uporabljate LXC) Domene in lahko navedete podatke o posameznih domenah in jih konfigurirate, če ima vaš virConnect zadostne pravice.
Za informacije o VM-jih in njihovi porabi virov lahko uporabite naslednje klice:
>>> povez.listDomainsID ()[4, 5]
To vrne vrsto ID-jev domen, ki so le majhna cela števila za preprosto nastavitev libvirt. Zanesljivejši način označevanja vaših VM-jev, ne da bi imeli dva VM-ja (recimo na različnih vozliščih) z istim ID-jem ali imenom, je uporaba UUID-jev. V libvirtu ima lahko vse UUID, ki je naključno generirano 128-bitno število. Verjetnosti, da boste ustvarili dva enaka UUID, so zelo majhne.
Omrežje za vaše navidezne stroje, sami VM-ji in celo skladišča in nosilci imajo svoje posamezne UUID-je. Uporabite jih v svoji kodi Python, namesto da se zanašate na človeška dodeljena imena. Na žalost je način, kako dobiti UUID-je domen, po mojem mnenju nekoliko neurejen pri trenutni izvedbi te knjižnice. Zahtevate, da navedete ID VM (ID domene), takole je videti.
domainIDs = conn.listDomainsID ()za ID domene v ID-jih domene:
domena = prik.lookupByID ()
uuid = domena.UUIDString ()
natisni (uuid)
Zdaj lahko vidite seznam UUID-jev domene. Naleteli smo tudi na nov libvirt predmeta Python.virDomain, ki ima z njim povezan svoj nabor metod, podobno kot spremenljivka conn, ki je bila libvirt.virConnect in je imel z njim povezane metode, kot sta listDomainsID () in lookupByID ().
Za obe metodi lahko uporabite Pythonove vgrajene metode dir (), tako da lahko predmeti navedejo svoje notranje spremenljivke in metode.
Na primer:
>>> 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' ...]
To vam lahko resnično pomaga hitro priklicati natančno ime metode in predmet, s katerim bi ga bilo treba uporabiti. Zdaj, ko imamo libvirt.virDomain, uporabimo ga za naštevanje različnih podrobnosti o tem delujočem VM.
>>> domena.info ()Tako dobite informacije o stanju VM, največjem pomnilniku in jedrih procesorja, kot je prikazano tukaj.
Druge informacije o VM lahko najdete tudi z različnimi metodami, kot je OSType ()
>>> domena.OSType ()'hvm'
Pri API-ju, ki ga izpostavlja libvirt, je veliko prilagodljivosti, zato morate skrbeti le za primer uporabe in brez izjemne zapletenosti, ki jo obravnava libvirt.
Zaključek
Pri mojih potovanjih v tehnologijo Libvirt je bila odsotnost UUID-ov kot prvovrstnega državljana verjetno edina bolečina, s katero sem se soočila, kar se mi je zdelo slaba oblikovalska izbira. Razen tega je libvirt precej čudovit za to, kar doseže. Da, veliko je še stvari, ki bi jih lahko naredili na boljši način, vendar je to vedno v primeru programske opreme. V ozadju so slabe odločitve vedno očitne, vendar so stroški prepisovanja programske opreme, tako razširjene kot libvirt, pogosto izjemni.
Veliko je bilo zgrajenega na vrhu, saj se je projekt počasi in vztrajno razvijal.
Namesto da bi se poskušali naučiti celotne knjižnice naenkrat, priporočam, da izveste majhen projekt ali idejo in to izvedete z uporabo Python in Libvirt. Dokumentacija je precej obsežna z veliko primeri in vas resnično sili, da hkrati razmišljate o ustreznem oblikovanju programske opreme in paketu za virtualizacijo.