Dela via


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

Gäller för: ✔️ Virtuella Windows-datorer

I den här artikeln får du lära dig hur du skapar en Azure Virtual Desktop-avbildning med följande anpassningar:

I artikeln beskrivs 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 artikeln är avsedd som en övning för att kopiera och klistra in.

Kommentar

Du hittar skripten för att installera apparna på GitHub. De är endast i illustrations- och testsyfte. Använd dem inte för produktionsarbetsbelastningar.

Tips för att skapa Windows-avbildningar

  • VM-storlek: Använd eller större för Windows Standard_D2_v2 . 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"
    

Kommentar

Om du får felet "New-AzRoleDefinition: Rolldefinitionsgränsen har överskridits. Inga fler rolldefinitioner kan skapas", se Felsöka Azure RBAC (rollbaserad åtkomstkontroll).

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

I det här exemplet har vi 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. All kod kan visas.

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).

Rensa dina resurser

Om du inte längre behöver de resurser som skapades under den här processen kan du ta bort dem genom att göra följande:

Viktigt!

Ta först bort resursgruppsmallen. Om du bara tar bort resursgruppen rensas inte den mellanlagringsresursgrupp (IT_) som används av VM Image Builder.

  1. Ta bort mallen för VM Image Builder.

    Remove-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name vd10ImageTemplate
    
  2. Ta bort rolltilldelningen.

    Remove-AzRoleAssignment -ObjectId $identityNamePrincipalId -RoleDefinitionName $imageRoleDefName -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    
    ## Remove the definitions
    Remove-AzRoleDefinition -Name "$identityNamePrincipalId" -Force -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    
    ## Delete the identity
    Remove-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Force
    
  3. Ta bort resursgruppen.

    Remove-AzResourceGroup $imageResourceGroup -Force
    

Nästa steg

Om du vill prova fler exempel på VM Image Builder går du till GitHub.