Создание образа Windows и его распространение в коллекцию вычислений Azure

Область применения: ✔️ Виртуальные машины 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, необходимо зарегистрировать провайдеров.

  1. Проверьте регистрации поставщиков. Убедитесь, что каждый возвращает зарегистрированный.

    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
    
  2. Если они не возвращают регистрацию, выполните регистрацию поставщиков с помощью следующих команд:

    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
    
  3. Установите модули 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 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

Создание виртуальной машины

Создайте виртуальную машину из версии образа, созданной с помощью построителя образов виртуальных машин.

  1. Получите созданную версию образа:

    $imageVersion = Get-AzGalleryImageVersion `
    -ResourceGroupName $imageResourceGroup `
    -GalleryName $sigGalleryName `
    -GalleryImageDefinitionName $imageDefName
    $imageVersionId = $imageVersion.Id
    
  2. Создайте виртуальную машину во втором регионе, где был реплицирован образ:

    $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_), которая используется построителем образов виртуальных машин, не будет удалена.

  1. Получите ResourceID шаблона изображения.

    $resTemplateId = Get-AzResource -ResourceName $imageTemplateName -ResourceGroupName $imageResourceGroup -ResourceType Microsoft.VirtualMachineImages/imageTemplates -ApiVersion "2022-02-14"
    
  2. Удаление шаблона изображения.

    Remove-AzResource -ResourceId $resTemplateId.ResourceId -Force
    
  3. Удалите назначение роли.

    Remove-AzRoleAssignment -ObjectId $identityNamePrincipalId -RoleDefinitionName $imageRoleDefName -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    
  4. Удалите определения.

    Remove-AzRoleDefinition -Name "$identityNamePrincipalId" -Force -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    
  5. Удалите идентичность.

    Remove-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Force
    
  6. Удалите группу ресурсов.

    Remove-AzResourceGroup $imageResourceGroup -Force
    

Дальнейшие шаги

Чтобы обновить версию образа, созданную в этой статье, см. раздел "Использование построителя образов виртуальных машин" для создания другой версии образа.