В ManageIQ развёртывание виртуальных машин запускается с использованием стандартного диалога настройки. Стандартный диалог позволяет задавать базовые параметры VM, однако он имеет свои ограничения, например на добавление дисков. Рассмотрим расширенную конфигурацию дисковой подсистемы VM (развёртывание на платформе виртуализации VMware vSphere).
Постановка задачи: При клонировании VM из шаблона необходимо:
- обеспечить возможность добавления нужного количество дополнительных дисков;
- все диски, включая дополнительные, должны быть тонкого формата;
- для подключения дополнительных дисков, необходимо создать отдельный SCSI контроллер типа ‘VMware Paravirtual’.
Все описанные в статье файлы, пути до файлов и скрипты протестированы и актуальны для текущей на момент написания версии MIQ – Quinteros-2.
Тонкие диски
Для создания нового развёртывания мы используем запрос create_provision_request, все параметры создаваемого сервера определяются в передаваемом массиве аргументов:
# Запуск запроса на создание нового развёртывания
request = $evm.execute('create_provision_request', *args)
Многие параметры развёртывания совпадают с атрибутами REST API вызовов: provision_requests, список поддерживаемых параметров: provision_attributes. Однако, “многие” – не означает “все”, и руководство по REST API не подходит в качестве универсального источника информации. Самой полной и актуальной документацией по работе с ManageIQ, является его открытый исходный код, при решении своих задач рекомендую обязательно его изучать.
За взаимодействие с VMware vSphere в MIQ отвечает gem manageiq-providers-vmware, на сервере MIQ гемы находятся в /opt/manageiq/. В коде гема есть обработка атрибута disk_format (см. файл disk.rb) в функции build_disk_relocate_spec:
...
def build_disk_relocate_spec(datastore)
...
case get_option(:disk_format)
when 'thin'
bck.thinProvisioned = "true"
when 'thick'
bck.thinProvisioned = "false"
bck.eagerlyScrub = "false"
when 'thick_eager'
bck.eagerlyScrub = "true"
bck.thinProvisioned = "false"
end
...
Согласно этому коду, для получения тонких дисков при создании запроса на развёртывание VM, необходимо передать дополнительный атрибут disk_format со значением “thin” (этот атрибут есть и в описании REST API). Передача атрибута disk_format повлияет только на “основные” диски VM, клонированные с шаблона.
Создание дополнительных дисков в ManageIQ
Для создания дополнительных дисков необходимо передать массив параметров дисков в атрибуте disk_scsi. Из параметров в методе add_disk формируются конфигурации будущих дисков (disk.rb). Создание конфигураций для дополнительных контролеров выполняет метод add_scsi_controller. Настройки контроллера передаются через атрибут ctrl_scsi.
Настройка параметров развёртывания новой VM в скриптах автоматизации выполняется в / ManageIQ / Infrastructure / VM / Provisioning / StateMachines / Methods / vmware_PreProvision. Мы доработали данный метод для настройки дисков, согласно нашему ТЗ:
- К новой VM добавляется необходимое количество дисков (строка 35 фрагмента кода);
- Если есть дополнительные диски, то для них создаётся выделенный SCSI контроллер (строка 34);
- Все диски создаются в тонком формате (строка 20);
- Метод универсальный, количество дисков в коде неограниченно (строка 30).
...
def initialize(handle = $env)
...
@set_disks = true
end
...
def input_fields_data(prefix)
inputs = prov.options.merge(prov.get_option(:ws_values) || {})
inputs.filter { |key, _value| key.start_with?(prefix) }
.map { |key, value| [key.to_s.scan(/\d+/).first.to_i, value] }
.sort.to_h.values
end
def disk_config(size, index)
{ bus: 1,
pos: index + ((index >= 7 && 1) || 0),
sizeInMB: size * 1024,
backing: { thinprovisioned: true } }
end
def scsi_config
{ busnumber: 1,
devicetype: 'ParaVirtualSCSIController' }
end
def set_disks
log(:info, 'Processing set_disks...', true)
disks = input_fields_data('add_disk')
.map(&:to_i).select(&:positive?)
.map.with_index { |size, index| disk_config(size, index) }
if disks.any?
prov.set_option(:ctrl_scsi, scsi_config)
prov.set_option(:disk_scsi, disks)
log(:info, "Provisioning object <:disk_scsi> updated with <#{disks}>")
end
log(:info, 'Processing set_disks...Complete', true)
end
...
def process_customization
...
set_disks if @set_disks
end
...
Осталось только передать нужные параметры… Добавьте на форму заказа vm поля, имена которых соответствует формату ‘add_diskN’, где N – номер диска, целое число. При вводе в любое такое поле положительного числа, в конфигурацию VM будет добавлен диск указанного размера (в ГиБ). Порядок подключения дисков на контроллер соответствует порядку номеров полей формы.
Файлы к статье
vmware_PreProvision – полный код доработанного скрипта настройки VM