Проект

Общее

Профиль

Билдим на QEMU с созданием и удалением ВМ

Добавил(а) Михаил Губин около 1 месяца назад

Скрипты автоматизации позволяют значительно упростить процесс создания и управления виртуальными машинами, а также выполнения на них различных задач. Использование QEMU в сочетании с Python предоставляет мощный инструмент для реализации таких сценариев. Данный материал описывает создание скрипта на Python, который создает и запускает виртуальные машины на QEMU по расписанию, выполняет на них операции сборки DEB и RPM пакетов, а затем отключает и удаляет виртуальные машины. Это лишь пример скрипта, ввы можете его менять под свои нужды как хотите.

Требования и установка

Для работы с данным скриптом вам потребуется установить следующие компоненты:

  • Python 3.x
  • QEMU
  • Debian/Ubuntu или аналогичная система на основе Linux

Установим необходимые пакеты:

sudo apt update && sudo apt install python3 qemu-system-x86 -y

Сценарий работы скрипта

  1. Создание виртуальной машины
    Для создания виртуальной машины используется команда qemu-system-x86_64. Мы создадим файл конфигурации виртуальной машины, чтобы задать параметры памяти, диска и сетевого подключения.

  2. Запуск виртуальной машины
    Запустим созданную виртуальную машину через команду qemu-system-x86_64 с использованием ранее созданного файла конфигурации.

  3. Автоматизация сборки DEB и RPM пакетов
    Используем командную оболочку внутри виртуальной машины для установки необходимых инструментов и сборки пакетов.

  4. Отключение и удаление виртуальной машины
    После завершения всех задач мы отключим виртуальную машину и удалим её вместе с соответствующими ресурсами.

Код скрипта

Файл конфигурации виртуальной машины

[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()

Инструкция по использованию

  1. Переместите образ виртуальной машины (img.img) в каталог, где будет работать скрипт.
  2. Убедитесь, что все пути к файлам корректны.
  3. Измените настройки сети и адреса в зависимости от вашей инфраструктуры.
  4. Выполните скрипт, указав имя виртуальной машины.

Этот скрипт обеспечивает автоматическое выполнение задач сборки пакетов на виртуальных машинах, а также их остановку и удаление после завершения работ.


Комментарии