Skapa en Azure Virtual Desktop-avbildning med hjälp av VM Image Builder och PowerShell

Slutförd

Den här lektionen visar hur du automatiserar anpassningarna med hjälp av Azure VM Image Builder. Du kan sedan distribuera avbildningen till ett Azure Compute-galleri (tidigare delat bildgalleri), där du kan replikera den till andra regioner, styra skalan och dela avbildningen inom och utanför organisationen.

För att förenkla distributionen av en vm Image Builder-konfiguration använder vårt exempel en Azure Resource Manager-mall med mallen VM Image Builder kapslad i den. Den här metoden ger dig några fler fördelar, till exempel variabler och parameterindata. Du kan också skicka parametrar från kommandoraden.

Den här lektionen är avsedd som en översikt över processen eller en kopierings- och inklistringsövning.

Överväganden för att skapa Windows-avbildningar

  • VM-storlek: Använd Standard_D2_v2 eller större för Windows. Standardstorleken är Standard_D1_v2, vilket inte är lämpligt för Windows.

  • Den här artikeln använder PowerShell-anpassningsskript. Använd följande inställningar, annars slutar bygget att svara:

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

    Till exempel:

    {
    "type": "PowerShell",
    "name": "installFSLogix",
    "runElevated": true,
    "runAsSystem": true,
    "scriptUri": "https://raw.githubusercontent.com/azure/azvmimagebuilder/main/solutions/14_Building_Images_WVD/0_installConfFsLogix.ps1"
    
  • Kommentera koden: Build-loggen för den virtuella datorn Image Builder, customization.log, är utförlig. Om du kommenterar skripten med hjälp av "write-host" skickas de till loggarna, vilket gör felsökningen enklare.

    write-host 'AIB Customization: Starting OS Optimizations script'
    
  • Slutkoder: VM Image Builder förväntar sig att alla skript returnerar en 0-slutkod. Om du använder en slutkod som inte är noll misslyckas den virtuella datorn Image Builder med anpassningen och stoppar bygget. Om du har komplexa skript lägger du till instrumentation och avger slutkoder, som visas i filen customization.log .

    Write-Host "Exit code: " $LASTEXITCODE
    
  • Test: Testa och testa koden igen på en fristående virtuell dator. Se till att det inte finns några användarfrågor, att du använder rätt behörigheter och så vidare.

  • Nätverk: Set-NetAdapterAdvancedProperty anges i optimeringsskriptet men misslyckas med genereringen av VM Image Builder. Eftersom nätverket kopplas från kommenteras det ut. Vi undersöker det här problemet.

Förutsättningar

Du måste ha de senaste Azure PowerShell-cmdletarna installerade. Mer information finns i Översikt över 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

Konfigurera miljön och variablerna

# 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

Behörigheter, användaridentitet och roll

  1. Skapa en användaridentitet.

    # 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. Tilldela behörigheter till identiteten för att distribuera avbildningar. Följande kommandon laddar ned och uppdaterar mallen med de tidigare angivna parametrarna.

    $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"
    

Om du inte redan har ett Azure Compute-galleri måste du skapa ett.

$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'

Konfigurera mallen för VM Image Builder

Vi har förberett en mall som laddar ned och uppdaterar mallen för vm Image Builder med de parametrar som angavs tidigare. Mallen installerar FSLogix, operativsystemoptimeringar och Microsoft Teams och kör Windows Update i slutet.

Om du öppnar mallen kan du i källegenskapen se den avbildning som används. I det här exemplet använder den en Windows 10-avbildning med flera sessioner.

Windows 10-avbildningar

Du bör känna till två viktiga typer av bilder: flera sessioner och en session.

Avbildningar med flera sessioner är avsedda för poolanvändning. Här är ett exempel på bildinformationen i Azure:

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

Ensessionsbilder är avsedda för individuell användning. Här är ett exempel på bildinformationen i Azure:

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

Du kan också ändra vilka Windows 10-avbildningar som är tillgängliga:

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

Ladda ned och konfigurera mallen

Ladda nu ned mallen och konfigurera den för eget bruk.

$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


Visa gärna mallen.

Skicka mallen

Mallen måste skickas till tjänsten. På så sätt laddas alla beroende artefakter ned, till exempel skript och validerar, kontrollerar behörigheter och lagrar dem i mellanlagringsresursgruppen, som är prefixet med 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

Skapa avbildningen

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

Kommentar

Kommandot väntar inte på att den virtuella datorn Image Builder-tjänsten ska slutföra avbildningsversionen, så du kan fråga efter statusen som visas här.

$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

Skapa en virtuell dator

Nu när avbildningen har skapats kan du skapa en virtuell dator från den. Använd exemplen från New-AzVM (Az PowerShell-modulen. Beräkning).