Создание виртуальных машин Hyper-V из CSV-файла с помощью PowerShell
Если вам постоянно приходится создавать большое количество виртуальных машин, то один из способов ускорить процесс — создать сценарий, который создает виртуальные машины на основе содержимого CSV-файла. Фактическая процедура создания виртуальных машин из CSV-файла сильно различается в зависимости от уровня настройки, который требуется от одной виртуальной машины к другой. Если, например, вы хотите, чтобы всем вашим виртуальным машинам был выделен одинаковый объем памяти, распределение памяти может быть жестко запрограммировано в сценарии конфигурации. В этом случае нет необходимости указывать параметры распределения памяти в файле CSV. Если, с другой стороны, некоторые виртуальные машины будут иметь уникальные требования к памяти, то эти требования к памяти — это именно то, что вы хотели бы включить в файл CSV.
После того как вы определили, какие элементы конфигурации ВМ необходимо включить в CSV-файл, а какие можно жестко запрограммировать, вы можете создать CSV-файл. Для простоты я создал очень простой файл CSV, который содержит две части информации — имя виртуальной машины и объем памяти, который должен быть выделен для виртуальной машины. Вы можете увидеть, как это выглядит на скриншоте ниже.
Взглянув на скриншот выше, вы заметите, что файл CSV содержит заголовки столбцов (в данном случае VMName и Memory). Вы можете использовать любые имена для заголовков столбцов. Просто не забудьте запомнить имена заголовков, которые вы выбрали, потому что ваш скрипт должен будет ссылаться на эти имена.
Кроме того, это, вероятно, само собой разумеется, но в реальной ситуации файл CSV, вероятно, будет содержать больше элементов, чем то, что я включил в свой образец файла. Я решил создать минимально сложный файл, чтобы облегчить понимание моего демонстрационного сценария.
Итак, с учетом сказанного, давайте начнем со сценария. Прежде чем я перейду непосредственно к созданию сценария, который будет создавать виртуальные машины, я хочу воспользоваться моментом и показать вам, как заставить PowerShell прочитать созданный вами CSV-файл. Ниже приведен пример кода, который может читать содержимое созданного мной CSV-файла:
$CSV = Import-Csv "C:ScriptsVMs.csv" ForEach($item in $csv) { $VMName = $($item.VMName) $Memory = $($item.Memory) Write-Host $VMName Запись хоста $Memory }
В первой строке используется командлет Import-CSV для чтения содержимого CSV-файла. Оттуда я настраиваю цикл ForEach, который считывает различные элементы из файла по одному. Стоит отметить, что в этом случае элемент относится ко всей строке CSV-файла, а не к отдельной части данных в строке.
Цикл ForEach определяет две переменные $VMName и $Memory. Обратите внимание, что сопоставления этих переменных ссылаются на имена столбцов в моем CSV-файле. Например, строка заголовка в моем CSV-файле определяет столбец с именем «Память». Следовательно, переменная $Memory (имя переменной фактически не имеет значения) сопоставляется с $($item.Memory), которая ссылается на содержимое столбца памяти текущего элемента.
Последние две строки цикла ForEach отображают содержимое переменных $VMName и $Memory. Эти строки не обязательны. Я включил их только для того, чтобы вы могли видеть, что делает скрипт. На рисунке ниже показан сценарий, CSV-файл и выходные данные сценария.
Итак, теперь, когда вы знаете, как читать содержимое CSV-файла, давайте создадим несколько виртуальных машин. При использовании PowerShell для создания виртуальных машин возникает довольно много сложностей. Поскольку существует ограничение на длину этой статьи, я собираюсь придерживаться основ.
Командлет PowerShell, используемый для создания новой виртуальной машины, называется New-VM. Вот синтаксис команды, относящийся к этой статье:
New-VM -Name <имя виртуальной машины> -MemoryStartupBytes <размер памяти> -BootDDevice <тип виртуального диска> -Path <путь к виртуальной машине> -NewVHDPath <расположение виртуального жесткого диска> -NewVHDSize <размер виртуального жесткого диска> -Generation <виртуальный номер поколения машины> -Switch <имя виртуального коммутатора>
Если, например, вы хотите создать виртуальную машину с именем VM, команда PowerShell для этого может выглядеть примерно так:
New-VM -Name VM -MemoryStartupBytes 4GB -BootDevice VHD -Path 'F:VMs' -NewVHDPath 'F:VMsVM.VHDX' -NewVHDSize 20GB -Generation 2 -Switch 'My Virtual Switch'
Вы можете увидеть, как работает команда на скриншоте ниже.
Когда вы посмотрите на команду, которую я использовал для создания виртуальной машины, вы заметите, что среди допустимых параметров есть имя виртуальной машины и ее выделение памяти. Оба этих параметра включены в файл CSV. Таким образом, мы можем создавать виртуальные машины из CSV-файла, просто включив командлет New-VM в цикл ForEach и заменив некоторые жестко заданные параметры значениями, полученными из CSV-файла.
Однако при этом есть одно предостережение. Когда PowerShell считывает значение памяти, например 4 ГБ, из CSV-файла, оно обрабатывает это значение как строку. Нам нужно, чтобы значение было в формате Int64. Простое решение этой проблемы — просто разделить $Memory на 1.
Последнее, что необходимо решить, это то, что, поскольку каждой виртуальной машине требуется свой собственный виртуальный жесткий диск, я также создал переменную с именем $Disk, в которой будет храниться имя виртуального жесткого диска, основанное на имени виртуальной машины. Вот как выглядит мой скрипт:
$CSV = Import-Csv "C:ScriptsVMs.csv" ForEach($item in $csv) { $VMName = $($item.VMName) $Memory = $($item.Memory) $Memory = ($ Память / 1) $Disk = 'F:VMs' + $VMName + '.VHDX' New-VM -Name $VMName -MemoryStartupBytes $Memory -BootDevice VHD -Path 'F:VMs' -NewVHDPath $Disk -NewVHDSize 20GB -Поколение 2 -Переключатель «Мой виртуальный переключатель» }
Вы можете увидеть сценарий, CSV-файл и результат на снимке экрана ниже.
Создание ВМ из CSV-файла: от простого к сложному
Несмотря на то, что в моем примере я сделал все относительно просто, метод, который я использовал, можно легко расширить для создания более сложных виртуальных машин. Ключевым моментом является выяснение того, какие атрибуты должны быть включены в CSV-файл и как использовать эти атрибуты в командлете New-VM или в командлете Set-VM.