Создание виртуальной машины Windows в Конструкторе образов виртуальных машин с помощью PowerShell
Область применения: ✔️ Виртуальные машины Windows
В этой статье показано, как создать настраиваемый образ виртуальной машины Windows с помощью модуля PowerShell Конструктора образов виртуальных машин Azure.
Необходимые компоненты
Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем приступить к работе.
Если вы решили использовать PowerShell локально, для работы с этой статьей установите модуль Azure PowerShell и подключитесь к учетной записи Azure с помощью командлета Connect-AzAccount. Дополнительные сведения см. в статье Установка Azure PowerShell.
Для некоторых шагов требуются командлеты из модуля Az.ImageBuilder . Установите отдельно с помощью следующей команды.
Install-Module -Name Az.ImageBuilder
Azure Cloud Shell
В Azure есть Azure Cloud Shell, интерактивная оболочка среды, с которой можно работать в браузере. Для работы со службами Azure можно использовать Bash или PowerShell с Cloud Shell. Для запуска кода из этой статьи можно использовать предварительно установленные команды Cloud Shell. Ничего дополнительного в локальной среде устанавливать не нужно.
Начало работы с Azure Cloud Shell
Вариант | Пример и ссылка |
---|---|
Нажмите кнопку Попробовать в правом верхнем углу блока кода или команд. При нажатии кнопки Попробовать код или команда не копируется в Cloud Shell автоматически. | |
Чтобы открыть Cloud Shell в браузере, перейдите по адресу https://shell.azure.com или нажмите кнопку Запуск Cloud Shell. | |
Нажмите кнопку Cloud Shell в строке меню в правом верхнем углу окна портала Azure. |
Чтобы использовать Azure Cloud Shell, выполните следующие действия:
Запустите Cloud Shell.
Нажмите кнопку Копировать в блоке кода (или блоке команд), чтобы скопировать код или команду.
Вставьте код или команду в окно сеанса Cloud Shell, нажав клавиши CTRL+SHIFT+V в Windows и Linux или CMD+SHIFT+V в macOS.
Нажмите клавишу ВВОД, чтобы запустить код или команду.
Если вы используете несколько подписок Azure, выберите ту, за ресурсы в которой будут выставляться счета. Выберите нужную подписку с помощью командлета Set-AzContext.
Set-AzContext -SubscriptionId 00000000-0000-0000-0000-000000000000
Регистрация поставщиков
При необходимости зарегистрируйте следующие поставщики ресурсов для использования с подпиской Azure:
- Microsoft.Compute;
- Microsoft.KeyVault
- Microsoft.Storage;
- Microsoft.Network.
- Microsoft.VirtualMachineImages
- Microsoft.ManagedIdentity
- Microsoft.ContainerInstance
Get-AzResourceProvider -ProviderNamespace Microsoft.Compute, Microsoft.KeyVault, Microsoft.Storage, Microsoft.VirtualMachineImages, Microsoft.Network, Microsoft.ManagedIdentity |
Where-Object RegistrationState -ne Registered |
Register-AzResourceProvider
Определение переменных
Поскольку вы будете использовать несколько фрагментов информации повторно, необходимо создать переменные для их хранения:
# Destination image resource group name
$imageResourceGroup = 'myWinImgBuilderRG'
# Azure region
$location = 'WestUS2'
# Name of the image to be created
$imageTemplateName = 'myWinImage'
# Distribution properties of the managed image upon completion
$runOutputName = 'myDistResults'
Создайте переменную для идентификатора подписки Azure. Чтобы убедиться, что переменная subscriptionID
содержит ваш идентификатор подписки, можно выполнить вторую строку в следующем примере.
# Your Azure Subscription ID
$subscriptionID = (Get-AzContext).Subscription.Id
Write-Output $subscriptionID
Создание или изменение группы ресурсов
Создайте группу ресурсов Azure с помощью командлета New-AzResourceGroup. Группа ресурсов — это логический контейнер, в котором ресурсы Azure развертываются и администрируются как группа.
В следующем примере создается группа ресурсов на основе имени в переменной $imageResourceGroup
в регионе, указанном в переменной $location
. Эта группа ресурсов используется для хранения артефакта шаблона конфигурации образа и самого образа.
New-AzResourceGroup -Name $imageResourceGroup -Location $location
Создание удостоверения пользователя и настройка разрешений роли
Предоставьте Конструктору образов виртуальных машин Azure разрешения для создания образов в указанной группе ресурсов, используя следующий пример. Без этого разрешения процесс сборки образов не будет завершен успешно.
Создайте переменные для имен определения роли и удостоверения. Эти значения должны быть уникальными.
[int]$timeInt = $(Get-Date -UFormat '%s') $imageRoleDefName = "Azure Image Builder Image Def $timeInt" $identityName = "myIdentity$timeInt"
Создайте удостоверение пользователя.
New-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Location $location
Сохраните идентификаторы ресурса удостоверения и субъекта в переменных.
$identityNameResourceId = (Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).Id $identityNamePrincipalId = (Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).PrincipalId
Назначение разрешений для удостоверения для распространения образов
Скачайте файл конфигурации JSON и измените его на основе параметров, как описано в этой статье.
$myRoleImageCreationUrl = 'https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json' $myRoleImageCreationPath = "myRoleImageCreation.json" Invoke-WebRequest -Uri $myRoleImageCreationUrl -OutFile $myRoleImageCreationPath -UseBasicParsing $Content = Get-Content -Path $myRoleImageCreationPath -Raw $Content = $Content -replace '<subscriptionID>', $subscriptionID $Content = $Content -replace '<rgName>', $imageResourceGroup $Content = $Content -replace 'Azure Image Builder Service Image Creation Role', $imageRoleDefName $Content | Out-File -FilePath $myRoleImageCreationPath -Force
Создайте определение роли.
New-AzRoleDefinition -InputFile $myRoleImageCreationPath
Предоставьте определение роли для субъекта-службы Конструктора образов виртуальных машин.
$RoleAssignParams = @{ ObjectId = $identityNamePrincipalId RoleDefinitionName = $imageRoleDefName Scope = "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup" } New-AzRoleAssignment @RoleAssignParams
Примечание.
В случае отображения ошибки: "New-AzRoleDefinition. Предел определения роли превышен. Невозможно создать дополнительные определения.", см. статью Устранение неполадок с Azure RBAC (управление доступом на основе ролей).
Создание Коллекции вычислений Azure
Создайте коллекцию.
$myGalleryName = 'myImageGallery' $imageDefName = 'winSvrImages' New-AzGallery -GalleryName $myGalleryName -ResourceGroupName $imageResourceGroup -Location $location
Создайте определение коллекции.
$GalleryParams = @{ GalleryName = $myGalleryName ResourceGroupName = $imageResourceGroup Location = $location Name = $imageDefName OsState = 'generalized' OsType = 'Windows' Publisher = 'myCo' Offer = 'Windows' Sku = 'Win2019' } New-AzGalleryImageDefinition @GalleryParams
Создание образа
Создайте исходный объект Конструктора образов виртуальных машин. Допустимые значения параметров см. в статье Поиск образов виртуальных машин в Azure Marketplace с помощью Azure PowerShell.
$SrcObjParams = @{ PlatformImageSource = $true Publisher = 'MicrosoftWindowsServer' Offer = 'WindowsServer' Sku = '2019-Datacenter' Version = 'latest' } $srcPlatform = New-AzImageBuilderTemplateSourceObject @SrcObjParams
Создайте объект распространителя Конструктора образов виртуальных машин.
$disObjParams = @{ SharedImageDistributor = $true ArtifactTag = @{tag='dis-share'} GalleryImageId = "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup/providers/Microsoft.Compute/galleries/$myGalleryName/images/$imageDefName" ReplicationRegion = $location RunOutputName = $runOutputName ExcludeFromLatest = $false } $disSharedImg = New-AzImageBuilderTemplateDistributorObject @disObjParams
Создайте объект настройки Конструктора образов виртуальных машин.
$ImgCustomParams01 = @{ PowerShellCustomizer = $true Name = 'settingUpMgmtAgtPath' RunElevated = $false Inline = @("mkdir c:\\buildActions", "mkdir c:\\buildArtifacts", "echo Azure-Image-Builder-Was-Here > c:\\buildActions\\buildActionsOutput.txt") } $Customizer01 = New-AzImageBuilderTemplateCustomizerObject @ImgCustomParams01
Создайте второй объект настройки Конструктора образов виртуальных машин.
$ImgCustomParams02 = @{ FileCustomizer = $true Name = 'downloadBuildArtifacts' Destination = 'c:\\buildArtifacts\\index.html' SourceUri = 'https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/exampleArtifacts/buildArtifacts/index.html' } $Customizer02 = New-AzImageBuilderTemplateCustomizerObject @ImgCustomParams02
Создайте шаблон Конструктора образов виртуальных машин.
$ImgTemplateParams = @{ ImageTemplateName = $imageTemplateName ResourceGroupName = $imageResourceGroup Source = $srcPlatform Distribute = $disSharedImg Customize = $Customizer01, $Customizer02 Location = $location UserAssignedIdentityId = $identityNameResourceId } New-AzImageBuilderTemplate @ImgTemplateParams
После создания шаблона возвращается сообщение и создается шаблон конфигурации Конструктора образов виртуальных машин в $imageResourceGroup
.
Чтобы определить успешность создания шаблона, используйте следующий пример.
Get-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup |
Select-Object -Property Name, LastRunStatusRunState, LastRunStatusMessage, ProvisioningState
В фоновом режиме Конструктор образов виртуальных машин также создаст в вашей подписке промежуточную группу ресурсов. Эта группа ресурсов используется для сборки образа. Формат — IT_<DestinationResourceGroup>_<TemplateName>
.
Предупреждение
Не удаляйте промежуточную группу ресурсов напрямую. Чтобы удалить промежуточную группу ресурсов, удалите артефакт шаблона образа.
Если служба сообщает об ошибке при отправке шаблона конфигурации образа, выполните следующие действия:
См. статью Устранение неполадок с Конструктором образов виртуальных машин Azure.
Перед повторной попыткой отправки шаблона удалите его, следуя этому примеру:
Remove-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup
Запустите сборку образа
Отправьте конфигурацию образа в службу Конструктора образов виртуальных машин, выполнив следующую команду:
Start-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName
Дождитесь завершения процесса создания образа, что может занять до часа.
При возникновении ошибок см. статью Устранение неполадок с Конструктором образов виртуальных машин Azure.
создание виртуальной машины;
Сохраните учетные данные входа для виртуальной машины в переменной. Пароль должен быть сложным.
$Cred = Get-Credential
Создайте виртуальную машину с помощью созданного вами образа.
$ArtifactId = (Get-AzImageBuilderTemplateRunOutput -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup).ArtifactId New-AzVM -ResourceGroupName $imageResourceGroup -Image $ArtifactId -Name myWinVM01 -Credential $Cred
Проверка внесенных изменений
Подключитесь к виртуальной машине через удаленный рабочий стол, используя имя пользователя и пароль, заданные при создании виртуальной машины.
В виртуальной машине откройте PowerShell и выполните
Get-Content
, как показано в следующем примере.Get-Content -Path C:\buildActions\buildActionsOutput.txt
Выходные данные основаны на содержимом файла, созданного в процессе настройки образа.
Azure-Image-Builder-Was-Here
В том же сеансе PowerShell проверьте, успешно ли выполнена вторая настройка. Для этого проверьте наличие файла
c:\buildArtifacts\index.html
, как показано в следующем примере.Get-ChildItem c:\buildArtifacts\
Результатом должен быть список содержимого каталога, в котором присутствует файл, скачанный в процессе настройки образа.
Directory: C:\buildArtifacts Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 29/01/2021 10:04 276 index.html
Очистка ресурсов
Если вам больше не нужны ресурсы, созданные во время этого процесса, их можно удалить следующим образом:
Удалите шаблон Конструктора образов виртуальных машин.
Remove-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName
Удалите группу ресурсов образа.
Внимание
В следующем примере показано, как удалить указанную группу ресурсов и все содержащиеся в ней ресурсы. Если в указанной группе ресурсов существуют другие ресурсы, кроме созданных для этой статьи, они также будут удалены.
Remove-AzResourceGroup -Name $imageResourceGroup
Следующие шаги
Дополнительные сведения о компонентах файла JSON, используемых в этой статье, см. в статье Справочник по шаблонам Конструктора образов виртуальных машин.