Как Настроить Автоматическую Сборку Образов Виртуальных Машин Для Vmware Cloud Director — Компактное Руководство

Привет, Хабр! Меня зовут Роман Петров, я занимаюсь разработкой продуктов для управления учетными данными в СберОблако .

В рамках одного проекта мне нужно было автоматизировать сборку виртуальных машин для Директор облака VMware .

Решить эту проблему можно было с помощью инструментов VMware: Fusion, Workstation или Player, но они требуют покупки лицензий, а последний также требует установки необновляемого пакета VMware VIX API в случае GNU\Linux. Я выбрал альтернативный путь и построил необходимый конвейер на основе VirtualBox с открытым исходным кодом.

Ниже приведено краткое описание того, как я это сделал.



Как настроить автоматическую сборку образов виртуальных машин для VMware Cloud Director — компактное руководство



Прежде чем мы начнем

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

у меня был шаблон для Пакер с операционной системой Ubuntu Server 18.04 и списком дополнительного ПО для предустановки.

Изначально этот образ был построен в среде Слияние .

Для установки операционной системы я использовал файл ответов preseed.cfg .

Содержит скрипты для ответов на все вопросы установщика (для автоматизации процесса).

Я решил оставить Packer, но заменить Fusion на VirtualBox. Выбор в пользу открытого решения был сделан в связи с тем, что оно распространяется бесплатно, поддерживает большое количество хостовых ОС и экспортирует изображения в форматах ОВФ и ОВА .

Кроме того, VirtualBox предоставляет репозитории для GNU/Linux, что позволяет автоматически обновлять пакеты операционной системы.

Кстати, аналогичный репозиторий предложение и разработчики Packer.

Начало работы

В качестве хоста для развертывания среды, в которой будет запущен CI-конвейер, я выбрал виртуальную машину с Ubuntu Server 20.04. Я установил на него утилиты Packer и VirtualBox. Я не буду подробно останавливаться на том, как это сделать, поскольку все необходимые инструкции можно найти в официальной документации этих инструментов [ один раз , два ].

Следующим шагом была подготовка шаблона для Packer. В состав Packer входят сборщики для разных сред, включая VirtualBox — виртуальныйбокс-iso .

Я написал шаблон и начал создавать образ виртуальной машины.

Остается только загрузить этот образ в библиотеку Cloud Director. Я обнаружил, что Cloud Director отказывается его импортировать.

Это основная трудность, которая отняла много времени.

В процессе поиска решения проблемы я наткнулся на статья зарубежный коллега.

Он отметил, что из-за несовместимости типов систем и аппаратной поддержки (разные интерпретации открытого стандарта) экспорт такого образа в VMware Cloud Director требует дополнительной настройки — какую я покажу позже.



Настройка шаблона Packer

Внесем следующие изменения в шаблон Packer:
  • Настроим экспорт изображений в формате OVF .

    Для этого в файле конфигурации указывается атрибут формат присвоить значение овф .

    Эта операция позволит нам получить на выходе два отдельных файла: XML-документ, описывающий ВМ, и образ жесткого диска.

    Таким образом, нам будет проще настроить нашу систему в будущем.

    Замечу, что для своего случая я не создаю дополнительные диски и не включаю iso-образы в состав виртуальной машины.

    Вы можете расширить дисковое пространство или добавить дополнительные диски непосредственно при развертывании виртуальной машины.

  • Укажем SCSI в качестве контроллера жесткого диска .

    Соответствующее значение (scsi) должно быть указано в атрибуте hard_drive_interface .

    VirtualBox будет эмулировать контроллер LsiLogic, что является плюсом, поскольку этот тип контроллера поддерживается в Cloud Director.

  • В качестве прошивки выберите биос , а в качестве видеоконтроллера - вмсвга (VMware SVGA).

    Атрибуты, которые нам нужны: прошивка И gfx_controller .

Окончательный шаблон для Packer: main.pkr.hcl - выглядит так:
  
  
  
  
  
  
  
  
  
  
  
  
  
  
   

source "virtualbox-iso" "ubuntu-18_04-amd64" { vm_name = "ubuntu-18.04-amd64" guest_os_type = "Ubuntu_64" nested_virt = false headless = true keep_registered = false guest_additions_mode = "disable" cpus = 2 memory = 4096 chipset = "piix3" firmware = "bios" rtc_time_base = "UTC" disk_size = 32768 hard_drive_interface = "scsi" hard_drive_discard = true hard_drive_nonrotational = true nic_type = "82540EM" gfx_controller = "vmsvga" gfx_vram_size = "16" gfx_accelerate_3d = false sound = "none" iso_url = " http://cdimage.ubuntu.com/ubuntu/releases/18.04/release/ubuntu-18.04.5-server-amd64.iso " iso_checksum = " sha256:8c5fc24894394035402f66f3824beb7234b757dd2b5531379cb310cedfdf0996 " boot_command = ["<esc><wait>", "<esc><wait>", "<enter><wait>", "/install/vmlinuz auto=true priority=critical fb=false initrd=/install/initrd.gz grub-installer/bootdev=/dev/sda preseed/file=/floppy/preseed.cfg -- <enter>"] floppy_files = [".

/preseed/preseed.cfg"] shutdown_command = "echo '${var.password}' | sudo -S shutdown -P now" post_shutdown_delay = "1m" output_directory = ".

/output" format = "ovf" bundle_iso = false communicator = "ssh" ssh_username = var.username ssh_password = var.password ssh_timeout = "20m" } build { sources = ["sources.virtualbox-iso.ubuntu-18_04-amd64"] # ssh provisioner "shell" { inline = ["sudo sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config", "sudo systemctl stop sshd", "sudo rm /etc/ssh/ssh_host_*"] } # .

/packer-manifest.json post-processor "manifest" { output = "packer-manifest.json" } }

Более подробную информацию о том, для чего нужны другие атрибуты, можно найти в разделе документация коллекционеру виртуальныйбокс-iso .

Здесь мне хотелось бы выделить лишь один из них – Обезглавленный , отвечающий за сборку в фоновом режиме.

Этот флажок должен быть установлен на ЛОЖЬ чтобы включить графический интерфейс.

Это облегчит отладку.

Теперь, если мы запустим Packer с нашими настройками, он сгенерирует три файла:

  • Образ жесткого диска: Ubuntu-18.04-amd64-disk001.vmdk ;
  • XML-файл, описывающий виртуальную машину: Ubuntu-18.04-amd64.ovf ;
  • JSON-файл со списком созданных артефактов: упаковщик-манифест.json.


Как настроить автоматическую сборку образов виртуальных машин для VMware Cloud Director — компактное руководство

Последний файл был записан благодаря блоку:

# .

/packer-manifest.json post-processor "manifest" { output = "packer-manifest.json" }

Файл упаковщик-manifest.json будет иметь следующее содержание:

{ "builds": [ { "name": "ubuntu-18_04-amd64", "builder_type": "virtualbox-iso", "build_time": 1629043596, "files": [ { "name": "output/ubuntu-18.04-amd64-disk001.vmdk", "size": 916132352 }, { "name": "output/ubuntu-18.04-amd64.ovf", "size": 6771 } ], "artifact_id": "VM", "packer_run_uuid": "b5fbae2b-59e7-fd6f-4154-cae16befd459", "custom_data": null } ], "last_run_uuid": "b5fbae2b-59e7-fd6f-4154-cae16befd459" }

Этот файл поможет нам найти результат сборки образа ВМ ( Ubuntu-18.04-amd64-disk001.vmdk И Ubuntu-18.04-amd64.ovf ).



Редактирование .

ovf

На предыдущем этапе мы настроили экспорт образа ВМ в Open Virtualization Format. Следующий шаг — редактирование файла *.

ovf .

Я написал специальный скрипт на Python 3.8 (он входит в дистрибутив Ubuntu Server 20.04) и разобрал его упаковщик-manifest.json чтобы извлечь путь к файлу .

ovf. Вот часть, которая решает эту проблему:

import json with open("packer-manifest.json", "r") as json_file: data = json.load(json_file) for i in data["builds"]: for j in i["files"]: if ".

ovf" in j["name"]: ovf_in = j["name"] ovf_out = ovf_in.replace(".

ovf", "-vmware.ovf")

Переменная ovf_in хранит путь к файлу .

ovf и ovf_out — путь к новому файлу .

ovf, в котором мы сохраним изменения.

Чтобы внести эти изменения, я использую модуль xml.etree.ElementTree .

Утилита очень помогла при редактировании XML. XMLStarlet .

Это покажет вам, какие элементы дерева включены в файл .

ovf. Вывод утилиты XMLStarlet

> xmlstarlet el .

/output/ubuntu-18.04-amd64.ovf Envelope Envelope/References Envelope/References/File Envelope/DiskSection Envelope/DiskSection/Info Envelope/DiskSection/Disk Envelope/NetworkSection Envelope/NetworkSection/Info Envelope/NetworkSection/Network Envelope/NetworkSection/Network/Description Envelope/VirtualSystem Envelope/VirtualSystem/Info Envelope/VirtualSystem/OperatingSystemSection Envelope/VirtualSystem/OperatingSystemSection/Info Envelope/VirtualSystem/OperatingSystemSection/Description Envelope/VirtualSystem/OperatingSystemSection/vbox:OSType Envelope/VirtualSystem/VirtualHardwareSection Envelope/VirtualSystem/VirtualHardwareSection/Info Envelope/VirtualSystem/VirtualHardwareSection/System Envelope/VirtualSystem/VirtualHardwareSection/System/vssd:ElementName Envelope/VirtualSystem/VirtualHardwareSection/System/vssd:InstanceID Envelope/VirtualSystem/VirtualHardwareSection/System/vssd:VirtualSystemIdentifier Envelope/VirtualSystem/VirtualHardwareSection/System/vssd:VirtualSystemType Envelope/VirtualSystem/VirtualHardwareSection/Item Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:Caption Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:Description Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:ElementName Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:InstanceID Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:ResourceType Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:VirtualQuantity Envelope/VirtualSystem/VirtualHardwareSection/Item Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:AllocationUnits Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:Caption Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:Description Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:ElementName Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:InstanceID Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:ResourceType Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:VirtualQuantity Envelope/VirtualSystem/VirtualHardwareSection/Item Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:Address Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:Caption Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:Description Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:ElementName Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:InstanceID Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:ResourceSubType Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:ResourceType Envelope/VirtualSystem/VirtualHardwareSection/Item Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:Address Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:Caption Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:Description Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:ElementName Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:InstanceID Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:ResourceSubType Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:ResourceType Envelope/VirtualSystem/VirtualHardwareSection/Item Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:Address Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:Caption Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:Description Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:ElementName Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:InstanceID Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:ResourceSubType Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:ResourceType Envelope/VirtualSystem/VirtualHardwareSection/Item Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:AddressOnParent Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:Caption Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:Description Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:ElementName Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:HostResource Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:InstanceID Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:Parent Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:ResourceType Envelope/VirtualSystem/VirtualHardwareSection/Item Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:AutomaticAllocation Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:Caption Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:Connection Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:ElementName Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:InstanceID Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:ResourceSubType Envelope/VirtualSystem/VirtualHardwareSection/Item/rasd:ResourceType Envelope/VirtualSystem/vbox:Machine Envelope/VirtualSystem/vbox:Machine/ovf:Info Envelope/VirtualSystem/vbox:Machine/Hardware Envelope/VirtualSystem/vbox:Machine/Hardware/CPU Envelope/VirtualSystem/vbox:Machine/Hardware/CPU/PAE Envelope/VirtualSystem/vbox:Machine/Hardware/CPU/LongMode Envelope/VirtualSystem/vbox:Machine/Hardware/CPU/X2APIC Envelope/VirtualSystem/vbox:Machine/Hardware/CPU/HardwareVirtExLargePages Envelope/VirtualSystem/vbox:Machine/Hardware/Memory Envelope/VirtualSystem/vbox:Machine/Hardware/Boot Envelope/VirtualSystem/vbox:Machine/Hardware/Boot/Order Envelope/VirtualSystem/vbox:Machine/Hardware/Boot/Order Envelope/VirtualSystem/vbox:Machine/Hardware/Boot/Order Envelope/VirtualSystem/vbox:Machine/Hardware/Boot/Order Envelope/VirtualSystem/vbox:Machine/Hardware/Display Envelope/VirtualSystem/vbox:Machine/Hardware/VideoCapture Envelope/VirtualSystem/vbox:Machine/Hardware/RemoteDisplay Envelope/VirtualSystem/vbox:Machine/Hardware/RemoteDisplay/VRDEProperties Envelope/VirtualSystem/vbox:Machine/Hardware/RemoteDisplay/VRDEProperties/Property Envelope/VirtualSystem/vbox:Machine/Hardware/RemoteDisplay/VRDEProperties/Property Envelope/VirtualSystem/vbox:Machine/Hardware/BIOS Envelope/VirtualSystem/vbox:Machine/Hardware/BIOS/IOAPIC Envelope/VirtualSystem/vbox:Machine/Hardware/BIOS/SmbiosUuidLittleEndian Envelope/VirtualSystem/vbox:Machine/Hardware/Network Envelope/VirtualSystem/vbox:Machine/Hardware/Network/Adapter Envelope/VirtualSystem/vbox:Machine/Hardware/Network/Adapter/NAT Envelope/VirtualSystem/vbox:Machine/Hardware/AudioAdapter Envelope/VirtualSystem/vbox:Machine/Hardware/RTC Envelope/VirtualSystem/vbox:Machine/Hardware/Clipboard Envelope/VirtualSystem/vbox:Machine/StorageControllers Envelope/VirtualSystem/vbox:Machine/StorageControllers/StorageController Envelope/VirtualSystem/vbox:Machine/StorageControllers/StorageController Envelope/VirtualSystem/vbox:Machine/StorageControllers/StorageController/AttachedDevice Envelope/VirtualSystem/vbox:Machine/StorageControllers/StorageController/AttachedDevice/Image

Вывод утилиты XMLStarlet представлен на языке XPath .

Как видите, не для каждого элемента определено пространство имен — в их имени отсутствует часть перед двоеточием.

Важно помнить, что при работе с XML в Python это приведет к неоднозначной интерпретации атрибутов.

Строки, которые мы будем редактировать ниже, я напишу в синтаксисе XPath с указанием пространства имен.

Удаляем элементы, содержащие ссылки на сеть и сетевые адаптеры , при развертывании виртуальной машины из шаблона вы всегда можете указать новые адаптеры:

ovf:Envelope/ovf:NetworkSection ovf:Envelope/ovf:VirtualSystem/vbox:Machine/ovf:Hardware/ovf:Network

Из элементов ниже я удалил только те, в значении которых присутствует слово Ethernet:

ovf:Envelope/ovf:VirtualSystem/ovf:VirtualHardwareSection/ovf:Item/rasd:Caption

Мы исключаем элементы, в которых упоминаются IDE-контроллеры.

.

IDE нам не нужна, так как мы будем работать со SCSI. В первом случае удаляем значения, где упоминается ideController, а во втором — только строки с атрибутом name="IDE-контроллер" .



ovf:Envelope/ovf:VirtualSystem/ovf:VirtualHardwareSection/ovf:Item/rasd:Caption ovf:Envelope/ovf:VirtualSystem/vbox:Machine/ovf:StorageControllers/ovf:StorageController

Удаление аудиоконтроллера .

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



ovf:Envelope/ovf:VirtualSystem/vbox:Machine/ovf:Hardware/ovf:AudioAdapter

Для оперативной памяти меняем единицы измерения .

Мы меняем их с помощью Мегабайты на байт*2^20 .

Этот нюанс связан с тем, что разные производители ПО иногда по-разному трактуют Open Virtualization Format:

ovf:Envelope/ovf:VirtualSystem/ovf:VirtualHardwareSection/ovf:Item/rasd:AllocationUnits

Изменение типа системы .

Вместо виртуальный бокс-2.2 мы регистрируемся vmx-16 , то есть меняем систему виртуализации с VirtualBox на VMware .



ovf:Envelope/ovf:VirtualSystem/ovf:VirtualHardwareSection/ovf:System/vssd:VirtualSystemType.

Здесь я бы дополнительно отметил, что для работы с модулем xml.etree.ElementTree необходимо зарегистрировать использованный пространства имен функция xml.etree.ElementTree.register_namespace .

Их можно найти в исходном файле .

ova по значению атрибутов xmlns .



import xml.etree.ElementTree as ET ET.register_namespace('', " http://schemas.dmtf.org/ovf/envelope/1 ") ET.register_namespace('ovf', " http://schemas.dmtf.org/ovf/envelope/1 ") ET.register_namespace('rasd', " http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData ") ET.register_namespace('vssd', " http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData ") ET.register_namespace('xsi', " http://www.w3.org/2001/XMLSchema-instance ") ET.register_namespace('vbox', " http://www.virtualbox.org/ovf/machine ")

В результате мы получаем финальный скрипт ovf-patch.py :

#!/usr/bin/python3 import json import xml.etree.ElementTree as ET ET.register_namespace('', " http://schemas.dmtf.org/ovf/envelope/1 ") ET.register_namespace('ovf', " http://schemas.dmtf.org/ovf/envelope/1 ") ET.register_namespace('rasd', " http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData ") ET.register_namespace('vssd', " http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData ") ET.register_namespace('xsi', " http://www.w3.org/2001/XMLSchema-instance ") ET.register_namespace('vbox', " http://www.virtualbox.org/ovf/machine ") with open("packer-manifest.json", "r") as json_file: data = json.load(json_file) for i in data["builds"]: for j in i["files"]: if ".

ovf" in j["name"]: ovf_in = j["name"] ovf_out = ovf_in.replace(".

ovf", "-vmware.ovf") tree = ET.parse(ovf_in) root = tree.getroot() # ovf:Envelope/ovf:NetworkSection for i in root.findall(".

/{*}NetworkSection"): root.remove(i) # ovf:Envelope/ovf:VirtualSystem/ovf:VirtualHardwareSection for i in root.findall(".

/{*}VirtualSystem/{*}VirtualHardwareSection"): # ovf:Envelope/ovf:VirtualSystem/ovf:VirtualHardwareSection/ovf:Item for i_i in i.findall(".

/{*}Item"): # ovf:Envelope/ovf:VirtualSystem/ovf:VirtualHardwareSection/ovf:Item/rasd:AllocationUnits for i_i_i in i_i.findall(".

/{*}AllocationUnits"): if i_i_i.text == "MegaBytes": i_i_i.text = "byte * 2^20" # ovf:Envelope/ovf:VirtualSystem/ovf:VirtualHardwareSection/ovf:Item/rasd:Caption for i_i_i in i_i.findall(".

/{*}Caption"): if "ideController" in i_i_i.text: i.remove(i_i) if "Ethernet" in i_i_i.text: i.remove(i_i) # ovf:Envelope/ovf:VirtualSystem/ovf:VirtualHardwareSection/ovf:System/vssd:VirtualSystemType for i_i in i.findall("{*}System/{*}VirtualSystemType"): i_i.text = "vmx-16" # ovf:Envelope/ovf:VirtualSystem/vbox:Machine/ovf:Hardware for i in root.findall(".

/{*}VirtualSystem/{*}Machine/{*}Hardware"): # ovf:Envelope/ovf:VirtualSystem/vbox:Machine/ovf:Hardware/ovf:AudioAdapter for i_i in i.findall(".

/{*}AudioAdapter"): i.remove(i_i) # ovf:Envelope/ovf:VirtualSystem/vbox:Machine/ovf:Hardware/ovf:Network for i_i in i.findall(".

/{*}Network"): i.remove(i_i) # ovf:Envelope/ovf:VirtualSystem/vbox:Machine/ovf:StorageControllers for i in root.findall(".

/{*}VirtualSystem/{*}Machine/{*}StorageControllers"): # ovf:Envelope/ovf:VirtualSystem/vbox:Machine/ovf:StorageControllers/ovf:StorageController for i_i in i.findall(".

/{*}StorageController[@name='IDE Controller']"): i.remove(i_i) tree.write(ovf_out) print(ovf_out)

После запуска скрипта в выходном каталоге появятся следующие файлы:

  • Образ жесткого диска: Ubuntu-18.04-amd64-disk001.vmdk ;
  • XML-файл с описанием ВМ: Ubuntu-18.04-amd64.ovf ;
  • XML-файл с описанием ВМ, готовый к импорту в Cloud Director: Ubuntu-18.04-amd64-vmware.ovf .



Как настроить автоматическую сборку образов виртуальных машин для VMware Cloud Director — компактное руководство

В качестве примера вот исходный файл Ubuntu-18.04-amd64.ovf : Ubuntu-18.04-amd64.ovf

<Эxml version="1.0"?> <Envelope ovf:version="1.0 " xml:lang="en-US " xmlns=" http://schemas.dmtf.org/ovf/envelope/1 " xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1 " xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData " xmlns:vssd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData " xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance " xmlns:vbox="http://www.virtualbox.org/ovf/machine "> <References> <File ovf:id="file1 " ovf:href="ubuntu-18.04-amd64-disk001.vmdk"/ > </References> <DiskSection> <Info>List of the virtual disks used in the package</Info> <Disk ovf:capacity="34359738368 " ovf:diskId="vmdisk1 " ovf:fileRef="file1 " ovf:format="http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized " vbox:uuid="a5659548-990a-4853-a8ab-bb9a168df0fc"/ > </DiskSection> <NetworkSection> <Info>Logical networks used in the package</Info> <Network ovf:name="NAT "> <Description>Logical network used by this appliance.</Description> </Network> </NetworkSection> <VirtualSystem ovf:id="ubuntu-18.04-amd64 "> <Info>A virtual machine</Info> <OperatingSystemSection ovf:id="94 "> <Info>The kind of installed guest operating system</Info> <Description>Ubuntu_64</Description> < vbox:OSType ovf:required="false ">Ubuntu_64</ vbox:OSType > </OperatingSystemSection> <VirtualHardwareSection> <Info>Virtual hardware requirements for a virtual machine</Info> <System> < vssd:ElementName >Virtual Hardware Family</ vssd:ElementName > < vssd:InstanceID >0</ vssd:InstanceID > < vssd:VirtualSystemIdentifier >ubuntu-18.04-amd64</ vssd:VirtualSystemIdentifier > < vssd:VirtualSystemType >virtualbox-2.2</ vssd:VirtualSystemType > </System> <Item> < rasd:Caption >2 virtual CPU</ rasd:Caption > < rasd:Description >Number of virtual CPUs</ rasd:Description > < rasd:ElementName >2 virtual CPU</ rasd:ElementName > < rasd:InstanceID >1</ rasd:InstanceID > < rasd:ResourceType >3</ rasd:ResourceType > < rasd:VirtualQuantity >2</ rasd:VirtualQuantity > </Item> <Item> < rasd:AllocationUnits >MegaBytes</ rasd:AllocationUnits > < rasd:Caption >4096 MB of memory</ rasd:Caption > < rasd:Description >Memory Size</ rasd:Description > < rasd:ElementName >4096 MB of memory</ rasd:ElementName > < rasd:InstanceID >2</ rasd:InstanceID > < rasd:ResourceType >4</ rasd:ResourceType > < rasd:VirtualQuantity >4096</ rasd:VirtualQuantity > </Item> <Item> < rasd:Address >0</ rasd:Address > < rasd:Caption >ideController0</ rasd:Caption > < rasd:Description >IDE Controller</ rasd:Description > < rasd:ElementName >ideController0</ rasd:ElementName > < rasd:InstanceID >3</ rasd:InstanceID > < rasd:ResourceSubType >PIIX4</ rasd:ResourceSubType > < rasd:ResourceType >5</ rasd:ResourceType > </Item> <Item> < rasd:Address >1</ rasd:Address > < rasd:Caption >ideController1</ rasd:Caption > < rasd:Description >IDE Controller</ rasd:Description > < rasd:ElementName >ideController1</ rasd:ElementName > < rasd:InstanceID >4</ rasd:InstanceID > < rasd:ResourceSubType >PIIX4</ rasd:ResourceSubType > < rasd:ResourceType >5</ rasd:ResourceType > </Item> <Item> < rasd:Address >0</ rasd:Address > < rasd:Caption >scsiController0</ rasd:Caption > < rasd:Description >SCSI Controller</ rasd:Description > < rasd:ElementName >scsiController0</ rasd:ElementName > < rasd:InstanceID >5</ rasd:InstanceID > < rasd:ResourceSubType >lsilogic</ rasd:ResourceSubType > < rasd:ResourceType >6</ rasd:ResourceType > </Item> <Item> < rasd:AddressOnParent >0</ rasd:AddressOnParent > < rasd:Caption >disk1</ rasd:Caption > < rasd:Description >Disk Image</ rasd:Description > < rasd:ElementName >disk1</ rasd:ElementName > < rasd:HostResource >/disk/vmdisk1</ rasd:HostResource > < rasd:InstanceID >6</ rasd:InstanceID > < rasd:Parent >5</ rasd:Parent > < rasd:ResourceType >17</ rasd:ResourceType > </Item> <Item> < rasd:AutomaticAllocation >true</ rasd:AutomaticAllocation > < rasd:Caption >Ethernet adapter on 'NAT'</ rasd:Caption > < rasd:Connection >NAT</ rasd:Connection > < rasd:ElementName >Ethernet adapter on 'NAT'</ rasd:ElementName > < rasd:InstanceID >7</ rasd:InstanceID > < rasd:ResourceSubType >E1000</ rasd:ResourceSubType > < rasd:ResourceType >10</ rasd:ResourceType > </Item> </VirtualHardwareSection> < vbox:Machine ovf:required="false " version="1.16-linux" uuid="{37db6186-f653-47f2-ba71-1b325b4aa806}" name="ubuntu-18.04-amd64" OSType="Ubuntu_64" snapshotFolder="Snapshots" lastStateChange="2021-08-15T18:03:51Z"> < ovf:Info >Complete VirtualBox machine configuration in VirtualBox format</ ovf:Info > <Hardware> <CPU count="2"> <PAE enabled="true"/> <LongMode enabled="true"/> <X2APIC enabled="true"/> <HardwareVirtExLargePages enabled="false"/> </CPU> <Memory RAMSize="4096"/> <Boot> <Order position="1" device="HardDisk"/> <Order position="2" device="DVD"/> <Order position="3" device="None"/> <Order position="4" device="None"/> </Boot> <Display controller="VMSVGA" VRAMSize="16"/> <VideoCapture screens="1" file=".

" fps="25"/> <RemoteDisplay enabled="true"> <VRDEProperties> <Property name="TCP/Address" value="127.0.0.1"/> <Property name="TCP/Ports" value="5968"/> </VRDEProperties> </RemoteDisplay> <BIOS> <IOAPIC enabled="true"/> <SmbiosUuidLittleEndian enabled="true"/> </BIOS> <Network> <Adapter slot="0" enabled="true" MACAddress="0800272C8B78" type="82540EM"> <NAT/> </Adapter> </Network> <AudioAdapter driver="Pulse" enabledIn="false" enabledOut="false"/> <RTC localOrUTC="UTC"/> <Clipboard/> </Hardware> <StorageControllers> <StorageController name="IDE Controller" type="PIIX4" PortCount="2" useHostIOCache="true" Bootable="true"/> <StorageController name="SCSI Controller" type="LsiLogic" PortCount="16" useHostIOCache="false" Bootable="true"> <AttachedDevice nonrotational="true" discard="true" type="HardDisk" hotpluggable="false" port="0" device="0"> <Image uuid="{a5659548-990a-4853-a8ab-bb9a168df0fc}"/> </AttachedDevice> </StorageController> </StorageControllers> </ vbox:Machine > </VirtualSystem> </Envelope>

И файл с внесенными изменениями Ubuntu-18.04-amd64-vmware.ovf : Ubuntu-18.04-amd64-vmware.ovf

< ovf:Envelope xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1 " xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData " xmlns:vbox="http://www.virtualbox.org/ovf/machine " xmlns:vssd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData " ovf:version="1.0 " xml:lang="en-US "> < ovf:References > < ovf:File ovf:id="file1 " ovf:href="ubuntu-18.04-amd64-disk001.vmdk " /> </ ovf:References > < ovf:DiskSection > < ovf:Info >List of the virtual d

Теги: #Виртуализация #python #с открытым исходным кодом #Облачные вычисления #DevOps #xml #packer #VirtualBox #Cloud Director #OVF #XMLStarlet

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.