Python

Libvirt с Python

Libvirt с Python
В одном из своих предыдущих постов я показал, как можно начать работу с Libvirt и KVM. Этот стек виртуализации не предназначен для использования в качестве программного обеспечения для виртуализации настольных компьютеров, скорее он предназначен для работы на серверах, предлагающих большую гибкость, эффективность и стабильность, а не удобство для пользователя. Он предназначен для автоматизацииth степень, а не полагаться на ручную настройку. Итак, давайте посмотрим, как вы можете подключиться к своему демону libvirt и автоматизировать базовое управление и мониторинг виртуальных машин с помощью Python.

Установка и основные предположения

Я использую установку Libvirt KVM на сервере Debian. Скрипты Python, которые я буду использовать, работают на Python 3.7.3 среда. Эта статья предназначена для знакомства с привязками Python для Libvirt, при разработке приложения вы всегда должны обращаться к официальной документации, которая охватывает широкий спектр вариантов использования и обновляется достаточно часто.

Давайте сначала установим все зависимости, необходимые для libvirt:

$ sudo apt install pkg-config libvirt-dev
$ pip3 установить libvirt-python

Это все пакеты, которые вам нужны.

Следующие скрипты и фрагменты запускаются локально на хосте Libvirt как root, а не на удаленном клиенте. Однако вы можете получить доступ к службам удаленно, что потребует длительного отступления от защиты соединения между клиентом и сервером. Поэтому для простоты мы будем подключаться локально.

Установление соединения со службой Libvirtd

Для начала давайте откроем приглашение Python, импортируем библиотеку libvirt и откроем соединение с libvirt.открытый метод.

корень @ deb: ~ # python3
Python 3.7.3 (по умолчанию, 15 апреля 2019 г., 01:55:37)
[GCC 6.3.0 20170516] в Linux

Введите «помощь», «авторские права», «кредиты» или «лицензия» для получения дополнительной информации.

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

Переменную 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.

>>> conn.Закрыть()

Однако пока не запускайте указанную выше команду. Потому что мы еще немного поиграем с libvirt. Давайте спросим у нашего гипервизора несколько деталей о себе, таких как имя хоста и общее количество виртуальных ЦП, которые он может предложить гостевым виртуальным машинам.

>>> conn.getHostname ()
'деб'
>>> conn.getMaxVcpus ('qemu')
16

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

>>> print (conn.getSysinfo ())


Dell Inc.
A14

 

Список и мониторинг виртуальных машин

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

Чтобы получить информацию о виртуальных машинах и их использовании ресурсов, вы можете использовать следующие вызовы:

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

Это возвращает массив идентификаторов домена, которые представляют собой небольшие целые числа для простой настройки libvirt. Более надежный способ пометить ваши виртуальные машины, не имея двух виртуальных машин (скажем, на разных узлах) с одним и тем же идентификатором или именем, - это использовать UUID. В libvirt все может иметь UUID, который представляет собой произвольно сгенерированное 128-битное число. Шансы на то, что вы создадите два идентичных UUID, действительно очень малы.

Сеть для ваших виртуальных машин, сами виртуальные машины и даже пулы хранения и тома имеют свои индивидуальные UUID. Широко используйте их в своем коде Python, вместо того, чтобы полагаться на имена, присвоенные людьми. К сожалению, способ получения UUID доменов немного запутан в текущей реализации этой библиотеки, на мой взгляд. Это требует, чтобы вы предоставили идентификатор виртуальной машины (идентификатор домена), вот как это выглядит.

domainIDs = conn.listDomainsID ()
для domainID в domainID:
домен = conn.lookupByID ()
uuid = домен.UUIDString ()
печать (uuid)

Теперь вы можете увидеть список UUID домена. Мы также наткнулись на новый Python Object libvirt.virDomain, у которого есть свой собственный набор методов, связанных с ним, очень похоже на переменную conn, которая была libvirt.объект virConnect и с ним связаны такие методы, как listDomainsID () и lookupByID ().

Для обоих этих методов вы можете использовать встроенные в Python методы dir (), чтобы объекты могли перечислять свои внутренние переменные и методы.

Например:

>>> dir (conn)
['_… Gs', 'schedulerType', 'скриншот', '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. Документация довольно обширна с множеством примеров и действительно заставляет задуматься о правильном проектировании программного обеспечения и стеке виртуализации одновременно.

WinMouse позволяет настраивать и улучшать движение указателя мыши на ПК с Windows
Если вы хотите улучшить функции указателя мыши по умолчанию, используйте бесплатное ПО WinMouse. Он добавляет дополнительные функции, которые помогут ...
Левая кнопка мыши не работает в Windows 10
Если вы используете выделенную мышь со своим ноутбуком или настольным компьютером, но левая кнопка мыши не работает в Windows 10/8/7 по какой-то причи...
Курсор прыгает или перемещается случайным образом при наборе текста в Windows 10
Если вы обнаружите, что ваш курсор мыши прыгает или перемещается сам по себе, автоматически, случайным образом при вводе текста на ноутбуке или компью...