Консолидируйте несколько виртуальных машин в единую виртуальную сеть с помощью этого скрипта.

Опубликовано: 1 Марта, 2023
Консолидируйте несколько виртуальных машин в единую виртуальную сеть с помощью этого скрипта.

Недавно мы рассмотрели детали и последствия перемещения виртуальной машины между виртуальными сетями. Есть несколько веских причин иметь единую виртуальную сеть, если это позволяют ваши требования к дизайну и безопасности. Во-первых, это повышает производительность сети VM между виртуальными машинами, экономит деньги там, где пиринг виртуальной сети может не потребоваться (в зависимости от дизайна), и позволяет использовать ускоренную сеть, которая значительно повышает производительность в той же виртуальной сети.. Для моего текущего клиента они решили объединить несколько виртуальных машин в единую виртуальную сеть. Чтобы сэкономить время в процессе, я создал скрипт, позволяющий плавно выполнить миграцию с использованием поддерживаемых методов. Цель этой статьи — дать вам инструменты для выполнения того же процесса в вашей сети. Сценарий соберет все требования и конфигурацию, которые необходимо сохранить во время перехода по мере консолидации виртуальных машин. Не стесняйтесь адаптировать сценарий к вашим потребностям.

Код шаг за шагом

Скрипт получит три параметра. Все они будут именами этих ресурсов: имя виртуальной машины, виртуальная сеть и виртуальная подсеть. Имена — это фактические имена ресурсов, а для виртуальной сети и подсети мы ищем цель/назначение.

Первый шаг — проверить, все ли они действительны. Мы собираемся использовать Get-AZvm, чтобы проверить, существует ли , если нет, то мы сообщим об этом пользователям и выйдем из скрипта. Мы собираемся проверить, существует ли , и если она существует, то у нас достаточно информации для проверки . В случае не нахождения ни выводится сообщение об ошибке и выполнение скрипта завершается.

Если виртуальная машина действительна, мы создадим три переменных. В $tVM будет храниться вся информация о виртуальной машине, такая как имя, группа ресурсов, местоположение и т. д. Переменная $tDataDisks будет получать всю информацию, связанную с связанными с виртуальной машиной, включая порядок, размеры, тип и параметры кэша. $tOSDisk будет хранить информацию, связанную с диском операционной системы виртуальной машины.

if (!(get-azvm -name $VMName)) { Write-Host Write-Host -ForegroundColor Yellow "[ОШИБКА] ВМ не найдена. Проверьте имя ВМ и убедитесь, что вы находитесь в правильной подписке." write-Host Break } Else { $tVM = Get-AzVM -Name $vmName $tDataDisks = (Get-AzVM -Name $vmName).StorageProfile.DataDisks $tOSDisk = (Get-AzVM -Name $vmName).StorageProfile.OSDisk } Если (!(Get-AZVirtualNetwork -Name $VirtualNetwork)){ Write-Host Write-Host -ForegroundColor Yellow "[ОШИБКА] Виртуальная сеть не найдена. Проверьте имя виртуальной сети и убедитесь, что вы находитесь в правильной подписке. " write-Host Break } Else{ $tvnet = Get-AZVirtualNetwork -Name $VirtualNetwork If (!(Get-AzVirtualNetworkSubnetConfig -Name $VirtualSubnet -VirtualNetwork $tvnet -ErrorAction SilentlyContinue)) { Write-Host Write-Host -ForegroundColor Yellow "[ERROR ] Подсеть не найдена. Проверьте имя виртуальной сети и убедитесь, что вы находитесь в правильной подписке». write-Host Break } }

Теперь, когда мы проверили все данные, мы вкратце сообщим, что будет выполнять скрипт, и запросим подтверждение у пользователя. Мы будем использовать команду read-host и запросим простой ответ или .

Write-Host -ForegroundColor Yellow «[Предупреждение] Этот процесс собирается переместить $VMName в виртуальную сеть $Virtualnetwork». Write-Host «Примечание № 1: виртуальная машина будет освобождена, удалена и воссоздана с теми же дисками в новой виртуальной сети». Write-Host «Примечание № 2. В случае возникновения каких-либо проблем во время выполнения скрипта будет отображаться вся конфигурация виртуальной машины, которую можно использовать для воссоздания виртуальной машины вручную». Write-Host "Примечание № 3: Между удалением ВМ и ее созданием есть задержка в 2 минуты. Будьте терпеливы." $tAnswer = Read-Host -Prompt "Пожалуйста, введите [Да] для подтверждения или [нет]"

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

If ($tAnswer -eq 'yes'){ # Печать информации для будущего использования Write-Host Write-Host -ForegroundColor Green 'Исходная информация о ВМ. Используйте эту информацию для проверки или плана Б в случае какой-либо ошибки». $tVM.Name $tVM.Location $tVM.HardwareProfile.VmSize $tVM.ResourceGroupName Write-Host -ForegroundColor Зеленый «Информация о диске» $tDataDisks $tOSDisk

На этом этапе мы собрали всю информацию и распечатали ее на экране и в наших переменных. Наш следующий шаг — удалить виртуальную машину, и мы собираемся подождать 120 секунд, прежде чем перейти к процессу повторного создания виртуальной машины в новой виртуальной сети.

# Удаление виртуальной машины Remove-AzVM -Name $tVM.Name -ResourceGroupName $tVM.ResourceGroupName -Force Start-Sleep 120

Мы проверили всю информацию, указанную в начале скрипта. Нам нужно получить с помощью команды Get-AZVirtualNetwork в переменную $vnet. То же самое для подсети с помощью командлета Get-AZVirtualNetworkSubnetConfig. В этом нам нужно передать объект , который мы получили на предыдущем шаге.

Мы будем использовать переменную с именем $VirtualMachine для создания начальной конфигурации (New-AZVMConfig), добавления диска операционной системы (Set-AZVMOSDisk), добавления сетевого интерфейса (New-AZNetworkInterface и Add-AZNetworkInterface). И последнее, но не менее важное: мы добавим каждый отдельный диск данных, используя ForEach с помощью Add-AZVMDataDisk. Последним шагом является использование New-AZVM со всеми переменными, которые мы использовали до сих пор для хранения информации для новой виртуальной машины.

Во всех приведенных ниже командлетах мы используем актуальную информацию из исходной виртуальной машины, которую мы сохранили в переменных перед ее удалением.

# Сбор информации для создания новой виртуальной машины $vnet = Get-AzVirtualNetwork -Name $VirtualNetwork $vsubnet = Get-AzVirtualNetworkSubnetConfig -Name $VirtualSubnet -VirtualNetwork $vnet $VirtualMachine = New-AzVMConfig -VMName $tVM.Name -VMSize $tvm.HardwareProfile.VmSize $VirtualMachine = Set-AzVMOSDisk -VM $VirtualMachine -ManagedDiskId $tvm.StorageProfile.OsDisk.ManagedDisk.id -CreateOption Attach -Windows $nic = New-AzNetworkInterface -Name ($VirtualMachine.Name.ToLower()+'_vnic' ) -ResourceGroupName $tVM.ResourceGroupName -Location $tVM.Location -SubnetId $vsubnet.Id -Force $VirtualMachine = Add-AzVMNetworkInterface -VM $VirtualMachine -Id $nic.Id ForEach ($Disk в $tDataDisks){ $VirtualMachine = Add -AzVMDataDisk -VM $VirtualMachine -Name $Disk.Name -CreateOption Attach -Lun $Disk.Lun -ManagedDiskId $Disk.ManagedDisk.Id -Caching $Disk.Caching New-AzVM -ResourceGroupName $tvm.ResourceGroupName -Location $tvm.Location -VM $Виртуальная машина } }

Консолидация ВМ: Где взять полный сценарий

В этой статье мы рассмотрели некоторые шаги, необходимые для консолидации нескольких ВМ, путем сбора информации с любой данной ВМ, сохранения информации в переменных PowerShell, вывода их на консоль (как план Б), удаления и подготовки новой ВМ с те же функции, что и у оригинальной виртуальной машины. Весь сценарий можно найти на моем GitHub по этой ссылке здесь.