Python

Libvirt с Python

Libvirt с Python
В един от предишните си постове показах как може да се започне с Libvirt и KVM. Този стек за виртуализация не трябва да се използва като софтуер за виртуализация на настолни компютри, а по-скоро е предназначен да работи на сървъри, предлагащи по-голяма гъвкавост, ефективност и стабилност, вместо удобство за потребителя. То е предназначено да бъде автоматизирано до nти степен, вместо да разчитате на ръчна конфигурация. Така че нека да видим как можете да се свържете с вашия демон libvirt и да автоматизирате основно управление и наблюдение на VM с помощта на Python.

Настройката и основните предположения

Използвам инсталация на Libvirt KVM на сървър на Debian. Python скриптовете, които ще използвам, се изпълняват в Python 3.7.3 среда. Тази статия трябва да намокри краката ви с връзките на Libvirt Python, когато проектирате приложението си, винаги трябва да се позовавате на официалната документация, която обхваща широк спектър от случаи на употреба и се актуализира доста често.

Нека първо да инсталираме всички зависимости, необходими за libvirt:

$ sudo apt install pkg-config libvirt-dev
$ pip3 инсталирайте libvirt-python

Това са всички пакети, от които се нуждаете.

Изпълняват се следните скриптове и фрагменти на местно ниво на хоста Libvirt като root, вместо да се изпълнява на отдалечен клиент. Можете да получите достъп до услугите отдалечено, което обаче ще изисква дълго отклонение в осигуряването на връзката между клиента и сървъра. Следователно, ние ще се свързваме локално, за улеснение.

Установяване на връзка с услугата Libvirtd

За да започнем, нека отворим подкана на Python, импортираме библиотеката libvirt и отворим връзка с libvirt.отворен метод.

root @ deb: ~ # python3
Python 3.7.3 (по подразбиране, 15 април 2019 г., 01:55:37)
[GCC 6.3.0 20170516] на linux

Въведете „помощ“, „авторско право“, „кредити“ или „лиценз“ за повече информация.

>>> импортиране на libvirt
>>> conn = libvirt.отворен ('qemu: /// system')

Променливата conn вече може да се използва за заявка на вашия демон libvirt и ние ще направим това скоро. Но първо, малко отклонение.

Libvirt може да се използва за управление на множество различни стекове за виртуализация и контейнеризиране. KVM-QEMU, Xen и LXC са най-популярните от тях. Така че, когато въведете libvirt.open ('qemu: /// system') libvirt ви позволява да събирате информация за и да управлявате гостите на QEMU. Можете също толкова добре, да говорите с LXD демон или Xen хипервизор, използвайки съответно lxc: /// система или xen: /// система.

По същия начин методът libvirt.open () не е единственото на ваше разположение. open (name), openAuth (uri, auth, flags) и openReadOnly (name) са три различни повиквания, всяко от които връща обект virConnect и предлага различно ниво на контрол върху хоста. Повече за тях можете да прочетете тук. Засега имаме conn като обект от класа virConnect. Този обект е шлюз за извършване на почти всичко, от конфигуриране на самия хипервизор до модифициране на гостите и тяхното разпределение на ресурси.

След като приключите с работата с обекта, не забравяйте да затворите връзката, като извикате метода close в него.

>>> свързване.близо()

Все пак не изпълнявайте горната команда. Защото ще си поиграем малко повече с libvirt. Нека да попитаме нашия хипервизор няколко подробности за себе си, като името на хоста и броя на vCPU, които той може да предложи на гостуващи виртуални машини общо.

>>> свързване.getHostname ()
"деб"
>>> свързване.getMaxVcpus ('qemu')
16

Сега трябва да разберем, че с метаданните Libvirt за обекти като статистика на хипервизора, виртуални машини, тяхната информация за мрежи и съхранение и т.н. са представени във формат XML. XML е нещо като JSON само малко по-неумел (и малко по-стар). Данните се съхраняват и представят като низов литерал и това означава, че ако поискате libvirt и изходът на тази заявка е XML, ще получите наистина дълъг изход от един ред с '\ n', представен като буквален низ, а не като нова линия. Вградената функция за печат на Python може да я почисти за човешка четливост

>>> печат (свърз.getSysinfo ())


Dell Inc.
A14
..
 

Списък и наблюдение на виртуални машини

Ако поддържате голям набор от виртуални машини, имате нужда от метод за създаване на стотици виртуални машини с еднаква конфигурация, които също така се мащабират правилно от прости едноредови работни натоварвания до многоядрени, многонишкови обработки. Libvirt извиква виртуални машини за гости (или контейнери, ако използвате LXC) Домейни и можете да изброите информация за отделни домейни, както и да ги конфигурирате, ако вашият обект virConnect има достатъчни привилегии.

За да получите информация за виртуалните машини и тяхното използване на ресурси, можете да използвате следните обаждания:

>>> свързване.listDomainsID ()
[4, 5]

Това връща масив от идентификатори на домейни, които са само малки цели числа за проста настройка на libvirt. По-надежден начин за обозначаване на вашите виртуални машини, без да имате две виртуални машини (да кажем на различни възли) с един и същ идентификатор или име, е да използвате UUID. В libvirt всичко може да има UUID, който е генериран на случаен принцип 128 битово число. Шансовете да създадете два еднакви UUID наистина са доста малки.

Мрежата за вашите виртуални машини, самите виртуални машини и дори пуловете за съхранение и обемите имат свои индивидуални UUID. Използвайте ги либерално във вашия Python код, вместо да разчитате на човешки зададени имена. За съжаление, начинът за получаване на UUID на домейни е малко объркан в текущото изпълнение на тази библиотека, по мое мнение. Това изисква да предоставите идентификатора на виртуалната машина (идентификатора на домейна), ето как изглежда.

domainIDs = conn.listDomainsID ()
за domainID в domainIDs:
домейн = свърз.lookupByID ()
uuid = домейн.UUIDString ()
печат (uuid)

Сега можете да видите списъка с UUID на домейна. Попаднали сме и на нов libvirt на Python Object.virDomain, който има свой собствен набор от методи, свързани с него, подобно на променливата conn, която беше libvirt.virConnect обект и имаше методи като listDomainsID () и lookupByID (), свързани с него.

И за двата метода можете да използвате вградените методи на dir () на Python, така че обектите да могат да изброят своите вътрешни променливи и методи.

Например:

>>> реж. (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' ...]

Това наистина може да ви помогне да си припомните бързо точното име на метод и обекта, с който трябва да се използва. Сега, когато имаме libvirt.virDomain обект, нека го използваме, за да изброим различни подробности за тази работеща виртуална машина.

>>> домейн.информация ()

Това ви дава информация относно състоянието на виртуалната машина, максималната памет и процесорните ядра, както е показано тук.

Можете също така да намерите друга информация за виртуалната машина, като използвате различни методи като OSType ()

>>> домейн.OSType ()
„hvm“

Има много гъвкавост, когато става въпрос за приложния програмен интерфейс (API), който libvirt излага и трябва да се притеснявате само за вашия случай на употреба и без да се притеснявате за огромната сложност, която обработва libvirt.

Заключение

По време на моите пътувания до технологията Libvirt, липсата на UUID като гражданин от първа класа беше може би единствената болка, с която се сблъсках, което изглеждаше като лош избор на дизайн. Освен това, libvirt е доста добър за това, което постига. Да, има много други неща, които биха могли да бъдат направени по-добър начин, но това винаги е така при софтуера. Погледнато назад, лошите решения винаги са очевидни, но разходите за пренаписване на софтуер, толкова широко разпространен като libvirt, често са огромни.

Върху него е изградено много, тъй като проектът се развива бавно и стабилно.

Вместо да се опитвам да научавам цялата библиотека наведнъж, бих препоръчал да излезете с малък проект или идея и да приложите това с помощта на Python и Libvirt. Документацията е доста обширна с много примери и наистина ви принуждава да мислите за правилния дизайн на софтуера и стека за виртуализация едновременно.

Преглед на безжична мишка на Microsoft Sculpt Touch
Наскоро прочетох за Microsoft Sculpt Touch безжична мишка и реших да я купя. След като го използвах известно време, реших да споделя опита си с него. ...
Екранен тракпад и указател на мишката на AppyMouse за таблети с Windows
Потребителите на таблети често пропускат показалеца на мишката, особено когато са привични да използват лаптопите. Смартфоните и таблетите със сензоре...
Средният бутон на мишката не работи в Windows 10
The среден бутон на мишката ви помага да превъртате дълги уеб страници и екрани с много данни. Ако това спре, добре ще свършите да използвате клавиату...