Билдим на QEMU с созданием и удалением ВМ
Скрипты автоматизации позволяют значительно упростить процесс создания и управления виртуальными машинами, а также выполнения на них различных задач. Использование QEMU в сочетании с Python предоставляет мощный инструмент для реализации таких сценариев. Данный материал описывает создание скрипта на Python, который создает и запускает виртуальные машины на QEMU по расписанию, выполняет на них операции сборки DEB и RPM пакетов, а затем отключает и удаляет виртуальные машины. Это лишь пример скрипта, ввы можете его менять под свои нужды как хотите.
Требования и установка¶
Для работы с данным скриптом вам потребуется установить следующие компоненты:
- Python 3.x
- QEMU
- Debian/Ubuntu или аналогичная система на основе Linux
Установим необходимые пакеты:
sudo apt update && sudo apt install python3 qemu-system-x86 -y
Сценарий работы скрипта¶
-
Создание виртуальной машины
Для создания виртуальной машины используется командаqemu-system-x86_64
. Мы создадим файл конфигурации виртуальной машины, чтобы задать параметры памяти, диска и сетевого подключения. -
Запуск виртуальной машины
Запустим созданную виртуальную машину через командуqemu-system-x86_64
с использованием ранее созданного файла конфигурации. -
Автоматизация сборки DEB и RPM пакетов
Используем командную оболочку внутри виртуальной машины для установки необходимых инструментов и сборки пакетов. -
Отключение и удаление виртуальной машины
После завершения всех задач мы отключим виртуальную машину и удалим её вместе с соответствующими ресурсами.
Код скрипта¶
Файл конфигурации виртуальной машины¶
[global]
machine = pc
accelerator = kvm
[cpu]
sockets = 1
cores = 2
threads = 2
[memory]
size = 2048M
[disk]
file = /path/to/your/img.img
format = raw
device = disk
[graphics]
type = none
[network]
model = virtio
Основной скрипт¶
import os
import time
from subprocess import call
def create_vm():
"""Создание виртуальной машины"""
# Создаем конфигурационный файл виртуальной машины
config_filename = 'config.ini'
with open(config_filename, 'w') as file:
file.write('''\
[global]
machine = pc
accelerator = kvm
[cpu]
sockets = 1
cores = 2
threads = 2
[memory]
size = 2048M
[disk]
file = /path/to/your/img.img
format = raw
device = disk
[graphics]
type = none
[network]
model = virtio
''')
# Запускаем QEMU с использованием конфигурационного файла
vm_command = f'qemu-system-x86_64 -enable-kvm -incoming-tcp -incoming-tcp-address=192.168.1.100 -netdev tap,id=net0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -device e1000,netdev=net0 -device intel-hda -drive file={config_filename},if=none,id=drive-virtio-disk0 -device virtio-blk-pci,scsi=off,bus=pcie.0,addr=0x2,drive=drive-virtio-disk0,id=virtio-root'
print("Запуск виртуальной машины...")
call(vm_command, shell=True)
def run_deb_build():
"""Сборка DEB пакетов"""
deb_pkg_name = 'mypackage'
version = '1.0'
# Команды для сборки DEB пакета
commands = [
f'echo "{version}" > VERSION',
f'dpkg-buildpackage -us -uc',
f'mv ../{deb_pkg_name}_* ../../deb_packages/'
]
for command in commands:
os.system(command)
def run_rpm_build():
"""Сборка RPM пакетов"""
rpm_pkg_name = 'myrpmpackage'
version = '1.0'
# Команды для сборки RPM пакета
commands = [
f'echo "{version}" > VERSION',
f'rpmbuild -bb myrpmpackage.spec',
f'cp ~/rpmbuild/RPMS/noarch/*.rpm ../../rpm_packages/'
]
for command in commands:
os.system(command)
def shutdown_vm():
"""Остановка и удаление виртуальной машины"""
# Отключаем виртуальную машину
vm_shutdown_command = f'virsh shutdown {vm_name}'
print("Остановка виртуальной машины...")
call(vm_shutdown_command, shell=True)
# Удаляем виртуальную машину
vm_delete_command = f'virsh undefine {vm_name} --nvram'
print("Удаление виртуальной машины...")
call(vm_delete_command, shell=True)
if __name__ == '__main__':
vm_name = input("Введите имя виртуальной машины: ")
try:
create_vm()
time.sleep(30) # Ожидание для загрузки системы
run_deb_build()
run_rpm_build()
shutdown_vm()
except KeyboardInterrupt:
shutdown_vm()
Инструкция по использованию¶
- Переместите образ виртуальной машины (
img.img
) в каталог, где будет работать скрипт. - Убедитесь, что все пути к файлам корректны.
- Измените настройки сети и адреса в зависимости от вашей инфраструктуры.
- Выполните скрипт, указав имя виртуальной машины.
Этот скрипт обеспечивает автоматическое выполнение задач сборки пакетов на виртуальных машинах, а также их остановку и удаление после завершения работ.
Комментарии