Создание образа Windows и его распространение в Коллекции вычислений Azure
Область применения: ✔️ Виртуальные машины Windows
В этой статье описано, как можно использовать Конструктор образов виртуальных машин Azure и Azure PowerShell для создания версии образа в Коллекции вычислений Azure (прежнее название — Общая коллекция образов) и глобально распространить этот образ. Это также можно сделать с помощью Azure CLI.
Для настройки образа в этой статье используется шаблон JSON, который можно найти по этой ссылке: armTemplateWinSIG.json. Вы скачаете и измените локальную версию шаблона, поэтому вы также будете использовать локальный сеанс PowerShell.
С целью распространения образа в Коллекции вычислений Azure для раздела шаблона distribute
используется значение sharedImage.
Конструктор образов виртуальных машин автоматически выполняет Sysprep
для подготовки образа к использованию. Эта команда является универсальной командой Sysprep
, и при необходимости ее можно переопределить.
Учитывайте количество раз изменения настроек. Команду Sysprep
можно выполнить для образа Windows ограниченное количество раз. После достижения предела Sysprep
необходимо повторно создать образ Windows. Дополнительные сведения см. в разделе Ограничения на количество выполнений команды Sysprep.
Регистрация поставщиков
Чтобы использовать построителе образов виртуальных машин, необходимо зарегистрировать поставщиков.
Проверьте регистрации поставщиков. Убедитесь, что каждый из них возвращает значение Зарегистрировано.
Get-AzResourceProvider -ProviderNamespace Microsoft.VirtualMachineImages | Format-table -Property ResourceTypes,RegistrationState Get-AzResourceProvider -ProviderNamespace Microsoft.Storage | Format-table -Property ResourceTypes,RegistrationState Get-AzResourceProvider -ProviderNamespace Microsoft.Compute | Format-table -Property ResourceTypes,RegistrationState Get-AzResourceProvider -ProviderNamespace Microsoft.KeyVault | Format-table -Property ResourceTypes,RegistrationState Get-AzResourceProvider -ProviderNamespace Microsoft.Network | Format-table -Property ResourceTypes,RegistrationState Get-AzResourceProvider -ProviderNamespace Microsoft.ContainerInstance | Format-table -Property ResourceTypes,RegistrationState
Если они не возвращают значение Зарегистрировано, зарегистрируйте поставщиков, выполнив следующие команды:
Register-AzResourceProvider -ProviderNamespace Microsoft.VirtualMachineImages Register-AzResourceProvider -ProviderNamespace Microsoft.Storage Register-AzResourceProvider -ProviderNamespace Microsoft.Compute Register-AzResourceProvider -ProviderNamespace Microsoft.KeyVault Register-AzResourceProvider -ProviderNamespace Microsoft.ContainerInstance
Установите модули PowerShell:
'Az.ImageBuilder', 'Az.ManagedServiceIdentity' | ForEach-Object {Install-Module -Name $_ -AllowPrerelease}
Создание переменных
Так как вы будете использовать несколько блоков информации повторно, необходимо создать переменные для их хранения.
Замените значения переменных, например username
и vmpassword
, собственными сведениями.
# Get existing context
$currentAzContext = Get-AzContext
# Get your current subscription ID.
$subscriptionID=$currentAzContext.Subscription.Id
# Destination image resource group
$imageResourceGroup="aibwinsig"
# Location
$location="westus"
# Image distribution metadata reference name
$runOutputName="aibCustWinManImg02ro"
# Image template name
$imageTemplateName="helloImageTemplateWin02ps"
# Distribution properties object name (runOutput).
# This gives you the properties of the managed image on completion.
$runOutputName="winclientR01"
# Create a resource group for the VM Image Builder template and Azure Compute Gallery
New-AzResourceGroup `
-Name $imageResourceGroup `
-Location $location
Создание назначаемого пользователем удостоверения и задание разрешений для группы ресурсов
Конструктор образов виртуальных машин использует предоставленное удостоверение пользователя для внедрения образа в Коллекцию вычислений Azure. В этом примере вы создаете определение роли Azure с помощью специальных действий для распространения образа. Затем определение роли будет назначено удостоверению пользователя.
# setup role def names, these need to be unique
$timeInt=$(get-date -UFormat "%s")
$imageRoleDefName="Azure Image Builder Image Def"+$timeInt
$identityName="aibIdentity"+$timeInt
## Add an Azure PowerShell module to support AzUserAssignedIdentity
Install-Module -Name Az.ManagedServiceIdentity
# Create an identity
New-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName
$identityNameResourceId=$(Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).Id
$identityNamePrincipalId=$(Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).PrincipalId
Назначение разрешений для удостоверения для распространения образов
Воспользуйтесь этой командой, чтобы скачать шаблон определения ролей Azure, а затем обновить его с помощью ранее заданных параметров.
$aibRoleImageCreationUrl="https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json"
$aibRoleImageCreationPath = "aibRoleImageCreation.json"
# Download the configuration
Invoke-WebRequest -Uri $aibRoleImageCreationUrl -OutFile $aibRoleImageCreationPath -UseBasicParsing
((Get-Content -path $aibRoleImageCreationPath -Raw) -replace '<subscriptionID>',$subscriptionID) | Set-Content -Path $aibRoleImageCreationPath
((Get-Content -path $aibRoleImageCreationPath -Raw) -replace '<rgName>', $imageResourceGroup) | Set-Content -Path $aibRoleImageCreationPath
((Get-Content -path $aibRoleImageCreationPath -Raw) -replace 'Azure Image Builder Service Image Creation Role', $imageRoleDefName) | Set-Content -Path $aibRoleImageCreationPath
# Create a role definition
New-AzRoleDefinition -InputFile ./aibRoleImageCreation.json
# Grant the role definition to the VM Image Builder service principal
New-AzRoleAssignment -ObjectId $identityNamePrincipalId -RoleDefinitionName $imageRoleDefName -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
Примечание.
В случае отображения ошибки: "New-AzRoleDefinition. Предел определения роли превышен. Невозможно создать дополнительные определения.", см. статью Устранение неполадок с Azure RBAC (управление доступом на основе ролей).
Создание Коллекции вычислений Azure
Чтобы использовать Конструктор образов виртуальных машин с Коллекцией вычислений Azure, вам потребуются существующая коллекция и определение образа. Конструктор образов виртуальных машин автоматические не создает коллекцию и определение образа.
Если у вас еще нет коллекции и определения образа, начните с их создания.
# Gallery name
$sigGalleryName= "myIBSIG"
# Image definition name
$imageDefName ="winSvrimage"
# Additional replication region
$replRegion2="eastus"
# Create the gallery
New-AzGallery `
-GalleryName $sigGalleryName `
-ResourceGroupName $imageResourceGroup `
-Location $location
# Create the image definition
New-AzGalleryImageDefinition `
-GalleryName $sigGalleryName `
-ResourceGroupName $imageResourceGroup `
-Location $location `
-Name $imageDefName `
-OsState generalized `
-OsType Windows `
-Publisher 'myCompany' `
-Offer 'WindowsServer' `
-Sku 'WinSrv2019'
Скачивание и настройка шаблона
Скачайте JSON-файл шаблона и настройте его, указав нужные значения переменных.
$templateFilePath = "armTemplateWinSIG.json"
Invoke-WebRequest `
-Uri "https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/1_Creating_a_Custom_Win_Shared_Image_Gallery_Image/armTemplateWinSIG.json" `
-OutFile $templateFilePath `
-UseBasicParsing
(Get-Content -path $templateFilePath -Raw ) `
-replace '<subscriptionID>',$subscriptionID | Set-Content -Path $templateFilePath
(Get-Content -path $templateFilePath -Raw ) `
-replace '<rgName>',$imageResourceGroup | Set-Content -Path $templateFilePath
(Get-Content -path $templateFilePath -Raw ) `
-replace '<runOutputName>',$runOutputName | Set-Content -Path $templateFilePath
(Get-Content -path $templateFilePath -Raw ) `
-replace '<imageDefName>',$imageDefName | Set-Content -Path $templateFilePath
(Get-Content -path $templateFilePath -Raw ) `
-replace '<sharedImageGalName>',$sigGalleryName | Set-Content -Path $templateFilePath
(Get-Content -path $templateFilePath -Raw ) `
-replace '<region1>',$location | Set-Content -Path $templateFilePath
(Get-Content -path $templateFilePath -Raw ) `
-replace '<region2>',$replRegion2 | Set-Content -Path $templateFilePath
((Get-Content -path $templateFilePath -Raw) -replace '<imgBuilderId>',$identityNameResourceId) | Set-Content -Path $templateFilePath
Создание версии образа
Шаблон нужно отправить в службу. Следующие команды скачивают все зависимые артефакты, например скрипты, и сохраняют их в промежуточной группе ресурсов, которая имеет префикс IT_.
New-AzResourceGroupDeployment `
-ResourceGroupName $imageResourceGroup `
-TemplateFile $templateFilePath `
-ApiVersion "2022-02-14" `
-imageTemplateName $imageTemplateName `
-svclocation $location
Чтобы выполнить сборку образа, используйте команду "Выполнить" для шаблона.
Invoke-AzResourceAction `
-ResourceName $imageTemplateName `
-ResourceGroupName $imageResourceGroup `
-ResourceType Microsoft.VirtualMachineImages/imageTemplates `
-ApiVersion "2022-02-14" `
-Action Run
Создание образа и его репликация в оба региона могут занять некоторое время. Прежде чем приступить к созданию виртуальной машины, дождитесь завершения этой части.
Get-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup |
Select-Object -Property Name, LastRunStatusRunState, LastRunStatusMessage, ProvisioningState
Создание виртуальной машины
Создайте виртуальную машину на основе версии образа, созданной Конструктором образов виртуальных машин.
Получите созданную версию образа:
$imageVersion = Get-AzGalleryImageVersion ` -ResourceGroupName $imageResourceGroup ` -GalleryName $sigGalleryName ` -GalleryImageDefinitionName $imageDefName $imageVersionId = $imageVersion.Id
Создайте виртуальную машину во втором регионе, в который реплицирован образ:
$vmResourceGroup = "myResourceGroup" $vmName = "myVMfromImage" # Create user object $cred = Get-Credential -Message "Enter a username and password for the virtual machine." # Create a resource group New-AzResourceGroup -Name $vmResourceGroup -Location $replRegion2 # Network pieces $subnetConfig = New-AzVirtualNetworkSubnetConfig -Name mySubnet -AddressPrefix 192.168.1.0/24 $vnet = New-AzVirtualNetwork -ResourceGroupName $vmResourceGroup -Location $replRegion2 ` -Name MYvNET -AddressPrefix 192.168.0.0/16 -Subnet $subnetConfig $pip = New-AzPublicIpAddress -ResourceGroupName $vmResourceGroup -Location $replRegion2 ` -Name "mypublicdns$(Get-Random)" -AllocationMethod Static -IdleTimeoutInMinutes 4 $nsgRuleRDP = New-AzNetworkSecurityRuleConfig -Name myNetworkSecurityGroupRuleRDP -Protocol Tcp ` -Direction Inbound -Priority 1000 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix * ` -DestinationPortRange 3389 -Access Deny $nsg = New-AzNetworkSecurityGroup -ResourceGroupName $vmResourceGroup -Location $replRegion2 ` -Name myNetworkSecurityGroup -SecurityRules $nsgRuleRDP $nic = New-AzNetworkInterface -Name myNic -ResourceGroupName $vmResourceGroup -Location $replRegion2 ` -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id -NetworkSecurityGroupId $nsg.Id # Create a virtual machine configuration using $imageVersion.Id to specify the image $vmConfig = New-AzVMConfig -VMName $vmName -VMSize Standard_D1_v2 | ` Set-AzVMOperatingSystem -Windows -ComputerName $vmName -Credential $cred | ` Set-AzVMSourceImage -Id $imageVersion.Id | ` Add-AzVMNetworkInterface -Id $nic.Id # Create a virtual machine New-AzVM -ResourceGroupName $vmResourceGroup -Location $replRegion2 -VM $vmConfig
Проверка настройки
Подключитесь к виртуальной машине через удаленный рабочий стол, используя имя пользователя и пароль, заданные при создании виртуальной машины. На виртуальной машине откройте окно командной строки и выполните следующую команду:
dir c:\
Вы должны увидеть каталог с именем buildActions
, созданный во время настройки образа.
Очистка ресурсов
Примечание.
Если вы хотите повторно настроить версию образа, чтобы создать новую версию того же образа, пропустите этот шаг и перейдите к статье Использование Конструктора образов виртуальных машин для создания другой версии образа.
Если вам больше не нужны ресурсы, созданные при работе с этой статьей, вы можете удалить их.
Следующий процесс удаляет как созданный вами образ, так и все остальные файлы ресурсов. Убедитесь, что развертывание завершено, прежде чем удалять ресурсы.
Сначала удалите шаблон группы ресурсов. В противном случае промежуточная группа ресурсов (IT_), которую использует Конструктор образов виртуальных машин, не будет очищена.
Получите ResourceID шаблона образа.
$resTemplateId = Get-AzResource -ResourceName $imageTemplateName -ResourceGroupName $imageResourceGroup -ResourceType Microsoft.VirtualMachineImages/imageTemplates -ApiVersion "2022-02-14"
Удалите шаблон образа.
Remove-AzResource -ResourceId $resTemplateId.ResourceId -Force
Удалите назначение роли.
Remove-AzRoleAssignment -ObjectId $identityNamePrincipalId -RoleDefinitionName $imageRoleDefName -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
Удалите определения.
Remove-AzRoleDefinition -Name "$identityNamePrincipalId" -Force -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
Удалите удостоверение.
Remove-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Force
Удалите ее.
Remove-AzResourceGroup $imageResourceGroup -Force
Следующие шаги
Сведения о том, как обновить созданную версию образа, см. в статье Использование Конструктора образов Azure для создания другой версии образа.