Nastavení a základní předpoklady
Používám instalaci Libvirt KVM na serveru Debian. Skripty Pythonu, které budu používat, běží v Pythonu 3.7.3 Prostředí. Tento článek by vám měl namočit nohy pomocí vazeb Libvirtu v Pythonu, při navrhování aplikace byste měli vždy odkazovat na oficiální dokumentaci, která pokrývá širokou škálu případů použití a je aktualizována přiměřeně často.
Nejprve si nainstalujte všechny závislosti požadované pro libvirt:
$ sudo apt install pkg-config libvirt-dev$ pip3 nainstalujte libvirt-python
To je vše, co potřebujete.
Spustí se následující skripty a úryvky lokálně na hostiteli Libvirt, jako root, místo aby byl spuštěn na vzdáleném klientovi. Ke službám můžete přistupovat vzdáleně, což by však vyžadovalo dlouhou odbočku k zabezpečení spojení mezi klientem a serverem. Proto se pro jednoduchost budeme připojovat lokálně.
Navazování spojení se službou Libvirtd
Nejprve otevřete výzvu Pythonu, importujte knihovnu libvirt a otevřete spojení s libvirt.otevřená metoda.
root @ deb: ~ # python3Python 3.7.3 (výchozí, 15. dubna 2019, 01:55:37)
[GCC 6.3.0 20170516] na Linuxu
Další informace získáte zadáním „help“, „copyright“, „credit“ nebo „license“.
>>> import libvirt>>> conn = libvirt.open ('qemu: /// system')
Proměnnou conn lze nyní použít k dotazu na vašeho démona libvirt a my to uděláme brzy. Ale nejprve trochu odbočení.
Libvirt lze použít ke správě řady různých virtualizačních a kontejnerizačních zásobníků. KVM-QEMU, Xen a LXC jsou nejoblíbenější z nich. Takže když zadáte libvirt.open ('qemu: /// system') libvirt vám umožňuje shromažďovat informace o a spravovat hosty QEMU. Stejně dobře můžete mluvit s démonem LXD nebo hypervisorem Xen pomocí systému lxc: /// system nebo xen: ///.
Podobně metoda libvirt.open () není jediný, který máte k dispozici. open (name), openAuth (uri, auth, flags) a openReadOnly (name) jsou tři různá volání, z nichž každé vrací objekt virConnect a nabízí různou úroveň kontroly nad hostitelem. Více o nich si můžete přečíst zde. Prozatím máme conn jako objekt třídy virConnect. Tento objekt je bránou pro provádění téměř čehokoli, od konfigurace samotného hypervizoru po úpravu hostů a jejich přidělování prostředků.
Po dokončení práce s objektem nezapomeňte ukončit připojení voláním metody close na něm.
>>> připojení.zavřít()Výše uvedený příkaz však ještě nespouštějte. Protože si budeme s libvirtem hrát trochu víc. Zeptejme se našeho hypervizora na několik podrobností o sobě, jako je název hostitele a počet vCPU, které může nabídnout hostujícím virtuálním počítačům celkem.
>>> připojení.getHostname ()'deb'
>>> připojení.getMaxVcpus ('qemu')
16
Nyní musíme pochopit, že s metadaty Libvirt o objektech, jako jsou statistiky hypervisoru, virtuální počítače, jejich síťové a úložné informace atd., Jsou všechny zastoupeny ve formátu XML. XML je sorta jako JSON jen o něco neohrabanější (a trochu starší). Data jsou uložena a prezentována jako řetězcový literál a to znamená, že pokud zadáte dotaz na libvirt a výstupem tohoto dotazu je XML, získáte opravdu dlouhý jednořádkový výstup s řetězcem '\ n', který bude spíše jako doslovný řetězec než a nový řádek. Integrovaná funkce tisku v Pythonu ji může vyčistit, aby byla čitelná pro člověka
>>> tisk (spoj.getSysinfo ())…
Výpis a monitorování virtuálních počítačů
Pokud udržujete velké množství virtuálních počítačů, potřebujete metodu k vytvoření stovek virtuálních počítačů s jednotnou konfigurací, které také správně škálovají od jednoduchých úloh s jedním vláknem po vícejádrové zpracování s více vlákny. Libvirt volá hostující virtuální počítače (nebo kontejnery, pokud používáte LXC) Domény a můžete vypsat informace o jednotlivých doménách a nakonfigurovat je, pokud má váš objekt virConnect dostatečná oprávnění.
Chcete-li získat informace o virtuálních počítačích a jejich využití prostředků, můžete použít následující volání:
>>> připojení.listDomainsID ()[4, 5]
Tím se vrací pole ID domén, která jsou jen malými celými čísly pro jednoduché nastavení libvirt. Spolehlivějším způsobem označování vašich virtuálních počítačů, aniž byste měli dva virtuální počítače (řekněme na různých uzlech) se stejným ID nebo názvem, je použití UUID. V libvirt může mít všechno UUID, což je náhodně generované 128bitové číslo. Šance, že vytvoříte dva identické UUID, jsou skutečně poměrně malé.
Síť pro vaše virtuální stroje, samotné virtuální počítače a dokonce i fondy úložiště a svazky mají své individuální UUID. Využijte je liberálně ve svém kódu Pythonu, místo toho, abyste se spoléhali na jména přiřazená člověkem. Bohužel způsob, jak získat UUID domén, je podle mého názoru při současné implementaci této knihovny trochu chaotický. Vyžaduje to, abyste zadali ID virtuálního počítače (ID domény), jak to vypadá.
domainIDs = spoj.listDomainsID ()pro ID domény v ID domény:
doména = připojení.lookupByID ()
uuid = doména.UUIDString ()
tisk (uuid)
Nyní vidíte seznam UUID domén. Také jsme narazili na nový libvirt Python Object.virDomain, který má vlastní sadu metod s ním spojených, podobně jako proměnná conn, která byla libvirt.objekt virConnect a související metody jako listDomainsID () a lookupByID ().
U obou těchto metod můžete použít vestavěné metody dir () Pythonu, aby objekty mohly vypisovat své vnitřní proměnné a metody.
Například:
>>> 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 vám opravdu pomůže rychle si vybavit přesný název metody a objekt, se kterým by se měla používat. Nyní, když máme libvirt.VirDomain objekt, pojďme jej použít k výpisu různých podrobností o tomto běžícím VM.
>>> doména.informace ()To vám poskytuje informace týkající se stavu virtuálního počítače, maximální paměti a jader CPU, jak je znázorněno zde.
Můžete také najít další informace o virtuálním počítači pomocí různých metod, jako je OSType ()
>>> doména.OSType ()'hvm'
Existuje velká flexibilita, pokud jde o API, které libvirt vystavuje, a vy se musíte starat pouze o svůj případ použití a bez obav z enormní složitosti, kterou libvirt zpracovává.
Závěr
Při mých cestách do technologie Libvirt byla nepřítomnost UUID jako občana první třídy pravděpodobně jediným bodem bolesti, kterému jsem čelil, což se zdálo jako špatná volba designu. Kromě toho je libvirt docela šikovný v tom, čeho dosahuje. Ano, existuje spousta dalších věcí, které mohly být provedeny lepším způsobem, ale u softwaru je to vždy tak. Při zpětném pohledu jsou špatná rozhodnutí vždy zřejmá, ale náklady na přepsání softwaru, tak rozšířeného jako libvirt, jsou často obrovské.
Hodně toho bylo postaveno, protože projekt se vyvíjel pomalu a stabilně.
Místo toho, abych se snažil naučit celou knihovnu najednou, doporučil bych přijít s malým projektem nebo nápadem a implementovat to pomocí Pythonu a Libvirtu. Dokumentace je docela obsáhlá s mnoha příklady a opravdu vás nutí přemýšlet o správném softwarovém designu a virtualizačním zásobníku současně.