Criar uma imagem da Área de Trabalho Virtual do Azure usando o Construtor de Imagens de VM do Azure e o PowerShell

Concluído

Esta unidade mostra como automatizar as personalizações usando o Construtor de Imagens de VM do Azure. Em seguida, você pode distribuir a imagem para uma Galeria de Computação do Azure (antiga Galeria de Imagens Compartilhadas), onde pode replicá-la para outras regiões, controlar a escala e compartilhá-la na sua organização e além.

Para simplificar a implantação de uma configuração do Construtor de Imagens de VM, este exemplo usa um modelo do Azure Resource Manager com o modelo do Construtor de Imagens de VM aninhado. Essa abordagem oferece mais alguns benefícios, como variáveis e entradas de parâmetro. Você também pode passar parâmetros da linha de comando.

Esta unidade destina-se como uma visão geral do processo ou um exercício de copiar e colar.

Considerações sobre a criação de imagens do Windows

  • Tamanho da VM: para Windows, use Standard_D2_v2 ou superior. O tamanho padrão é Standard_D1_v2, que não é adequado ao Windows.

  • Este exemplo usa os Scripts do personalizador do PowerShell. Use as configurações a seguir, ou o build deixará de responder:

    "runElevated": true,
    "runAsSystem": true,
    

    Por exemplo:

    {
    "type": "PowerShell",
    "name": "installFSLogix",
    "runElevated": true,
    "runAsSystem": true,
    "scriptUri": "https://raw.githubusercontent.com/azure/azvmimagebuilder/main/solutions/14_Building_Images_WVD/0_installConfFsLogix.ps1"
    
  • Comente seu código: o log de build do Construtor de Imagens de VM, customization.log, é detalhado. Se você comentar seus scripts usando 'write-host', eles serão enviados aos logs, o que deve facilitar a solução de problemas.

    write-host 'AIB Customization: Starting OS Optimizations script'
    
  • Códigos de saída: o Construtor de Imagens de VM espera que todos os scripts retornem um código de saída 0. Se você usar um código de saída diferente de zero, o Construtor de Imagens de VM falhará na personalização e interromperá o build. Se você tiver scripts complexos, adicione a instrumentação e emita códigos de saída, eles serão mostrados no arquivo customization.log.

    Write-Host "Exit code: " $LASTEXITCODE
    
  • Teste: teste exaustivamente seu código em uma VM autônoma. Verifique se não há solicitações de usuário, se você está usando os privilégios corretos e assim por diante.

  • Rede: Set-NetAdapterAdvancedProperty é definida no script de otimização, mas falha no build do Construtor de Imagens de VM. Como desconecta a rede, ela é comentada. Estamos investigando esse problema.

Pré-requisitos

Você deve ter a versão mais recente dos cmdlets do Azure PowerShell instalada. Para obter mais informações, consulte Visão geral do Azure PowerShell.

# Check to ensure that you're registered for the providers and RegistrationState is set to 'Registered'
Get-AzResourceProvider -ProviderNamespace Microsoft.VirtualMachineImages
Get-AzResourceProvider -ProviderNamespace Microsoft.Storage
Get-AzResourceProvider -ProviderNamespace Microsoft.Compute
Get-AzResourceProvider -ProviderNamespace Microsoft.KeyVault
Get-AzResourceProvider -ProviderNamespace Microsoft.ContainerInstance
# If they don't show as 'Registered', run the following commented-out code
## 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

Configurar o ambiente e as variáveis

# Step 1: Import module
Import-Module Az.Accounts

# Step 2: get existing context
$currentAzContext = Get-AzContext

# Destination image resource group
$imageResourceGroup="avdImageDemoRg"

# Location (see possible locations in the main docs)
$location="westus2"

# Your subscription. This command gets your current subscription
$subscriptionID=$currentAzContext.Subscription.Id

# Image template name
$imageTemplateName="avd10ImageTemplate01"

# Distribution properties object name (runOutput). Gives you the properties of the managed image on completion
$runOutputName="sigOutput"

# Create resource group
New-AzResourceGroup -Name $imageResourceGroup -Location $location

Permissões, identidade do usuário e função

  1. Crie uma identidade de usuário.

    # 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 Azure PowerShell modules to support AzUserAssignedIdentity and Azure VM Image Builder
    'Az.ImageBuilder', 'Az.ManagedServiceIdentity' | ForEach-Object {Install-Module -Name $_ -AllowPrerelease}
    
    # Create the identity
    New-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Location $location
    
    $identityNameResourceId=$(Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).Id
    $identityNamePrincipalId=$(Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).PrincipalId
    
    
    
  2. Atribuir permissões para a identidade para distribuir imagens. Os comandos a seguir baixam e atualizam o modelo com os parâmetros especificados anteriormente.

    $aibRoleImageCreationUrl="https://raw.githubusercontent.com/azure/azvmimagebuilder/main/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json"
    $aibRoleImageCreationPath = "aibRoleImageCreation.json"
    
    # Download the config
    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"
    

Se você ainda não tiver uma Galeria de Computação do Azure, precisará criar uma.

$sigGalleryName= "myaibsig01"
$imageDefName ="win10avd"

# Create the gallery
New-AzGallery -GalleryName $sigGalleryName -ResourceGroupName $imageResourceGroup -Location $location

# Create the gallery definition
New-AzGalleryImageDefinition -GalleryName $sigGalleryName -ResourceGroupName $imageResourceGroup -Location $location -Name $imageDefName -OsState generalized -OsType Windows -Publisher 'myCo' -Offer 'Windows' -Sku '10avd'

Configurar o modelo do Construtor de Imagens de VM

Preparamos um modelo que baixa e atualiza o modelo do Construtor de Imagens de VM com os parâmetros especificados anteriormente. O modelo instala o FSLogix, as otimizações do sistema operacional, o Microsoft Teams e executa o Windows Update no final.

Abrindo o modelo, você pode ver na propriedade source a imagem que está em uso. Neste exemplo, ele usa uma imagem de várias sessões do Windows 10.

Imagens do Windows 10

Tenha em mente que há dois tipos principais de imagens: várias sessões e sessão única.

As imagens de várias sessões destinam-se ao uso em pool. Este é um exemplo dos detalhes da imagem no Azure:

"publisher": "MicrosoftWindowsDesktop",
"offer": "Windows-10",
"sku": "20h2-avd",
"version": "latest"

As imagens de sessão única se destinam ao uso individual. Este é um exemplo dos detalhes da imagem no Azure:

"publisher": "MicrosoftWindowsDesktop",
"offer": "Windows-10",
"sku": "19h2-ent",
"version": "latest"

Você também pode alterar as imagens do Windows 10 que estão disponíveis:

Get-AzVMImageSku -Location westus2 -PublisherName MicrosoftWindowsDesktop -Offer windows-10

Baixar e configurar o modelo

Agora, baixe o modelo e configure-o para seu uso.

$templateUrl="https://raw.githubusercontent.com/azure/azvmimagebuilder/main/solutions/14_Building_Images_WVD/armTemplateWVD.json"
$templateFilePath = "armTemplateWVD.json"

Invoke-WebRequest -Uri $templateUrl -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 '<region>',$location) | 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 '<imgBuilderId>',$identityNameResourceId) | Set-Content -Path $templateFilePath


Se preferir, consulte o modelo.

Enviar o modelo

Seu modelo deve ser enviado ao serviço. Essa ação baixa quaisquer artefatos dependentes, como scripts, e valida, verifica as permissões e as armazena no grupo de recursos de preparo, o que é prefixado com IT_.

New-AzResourceGroupDeployment -ResourceGroupName $imageResourceGroup -TemplateFile $templateFilePath -TemplateParameterObject @{"api-Version" = "2020-02-14"; "imageTemplateName" = $imageTemplateName; "svclocation" = $location}

# Optional - if you have any errors running the preceding command, run:
$getStatus=$(Get-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName)
$getStatus.ProvisioningErrorCode
$getStatus.ProvisioningErrorMessage

Criar a imagem

Start-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName -NoWait

Observação

O comando não aguarda que o serviço Construtor de Imagens de VM conclua o build de imagem, portanto, você pode consultar o status, conforme mostrado aqui.

$getStatus=$(Get-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName)

# Shows all the properties
$getStatus | Format-List -Property *

# Shows the status of the build
$getStatus.LastRunStatusRunState
$getStatus.LastRunStatusMessage
$getStatus.LastRunStatusRunSubState

Criar uma VM

Com a imagem criada, use-a como base para criar uma VM. Use os exemplos contidos em New-AzVM (Az PowerShell module.Compute).