Привет, Хабр! Меня зовут Роман Петров, я занимаюсь разработкой продуктов для управления учетными данными в СберОблако .
В рамках одного проекта мне нужно было автоматизировать сборку виртуальных машин для Директор облака VMware .
Решить эту проблему можно было с помощью инструментов VMware: Fusion, Workstation или Player, но они требуют покупки лицензий, а последний также требует установки необновляемого пакета VMware VIX API в случае GNU\Linux. Я выбрал альтернативный путь и построил необходимый конвейер на основе VirtualBox с открытым исходным кодом.
Ниже приведено краткое описание того, как я это сделал.
Прежде чем мы начнем
Прежде чем приступить к делу, я немного расскажу вам, почему я решил в первую очередь заняться этим вопросом, и познакомлю вас со стеком программного обеспечения, который мы будем использовать.у меня был шаблон для Пакер с операционной системой 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 .
Более подробную информацию о том, для чего нужны другие атрибуты, можно найти в разделе документация коллекционеру виртуальныйбокс-iso .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" } }
Здесь мне хотелось бы выделить лишь один из них – Обезглавленный , отвечающий за сборку в фоновом режиме.
Этот флажок должен быть установлен на ЛОЖЬ чтобы включить графический интерфейс.
Это облегчит отладку.
Теперь, если мы запустим Packer с нашими настройками, он сгенерирует три файла:
- Образ жесткого диска: Ubuntu-18.04-amd64-disk001.vmdk ;
- XML-файл, описывающий виртуальную машину: Ubuntu-18.04-amd64.ovf ;
- JSON-файл со списком созданных артефактов: упаковщик-манифест.json.
Последний файл был записан благодаря блоку:
# .
/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 .
В качестве примера вот исходный файл 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
-
Nokia Запатентовала Новый Дизайн Телефона
19 Oct, 24 -
Как Стартапу Попасть В Акселератор?
19 Oct, 24