Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: ✔️ Виртуальные машины Windows
Из этой статьи вы узнаете, как с помощью построителя образов виртуальных машин Azure и Azure PowerShell создать версию образа в коллекции вычислений Azure (прежнее название — общая коллекция образов), а затем глобально распределить образ. Это также можно сделать с помощью Azure CLI.
Чтобы настроить изображение, в этой статье используется шаблон JSON, который можно найти на armTemplateWinSIG.json. Вы скачайте и измените локальную версию шаблона, поэтому вы также будете использовать локальный сеанс PowerShell.
Для распространения образа в Галерея Azure Compute шаблон использует sharedImage в качестве значения для раздела distribute шаблона.
Средство подготовки образа виртуальной машины автоматически запускает Sysprep для обобщения образа. Команда является универсальной Sysprep командой, и ее можно переопределить , если вам нужно.
Будьте внимательны к количеству раз, когда вы накладываете настройки. Вы можете выполнить Sysprep команду с ограниченным количеством раз на одном образе Windows. После достижения Sysprep ограничения необходимо повторно создать образ Windows. Дополнительные сведения см. в разделе "Ограничения на количество запусков Sysprep".
Регистрация поставщиков
Чтобы использовать VM Image Builder, необходимо зарегистрировать провайдеров.
Проверьте регистрации поставщиков. Убедитесь, что каждый возвращает зарегистрированный.
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 Compute, необходимо иметь существующую галерею и определение образа. Сборщик образов виртуальных машин не создаёт галерею и определение образа для вас.
Если у вас еще нет коллекции и определения изображений, сначала создайте их.
# 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
Дальнейшие шаги
Чтобы обновить версию образа, созданную в этой статье, см. раздел "Использование построителя образов виртуальных машин" для создания другой версии образа.