Share via


Een Azure Virtual Desktop-installatiekopieën maken met behulp van VM Image Builder en PowerShell

Van toepassing op: ✔️ Windows-VM's

In dit artikel leert u hoe u een Azure Virtual Desktop-installatiekopieën maakt met de volgende aanpassingen:

In dit artikel wordt beschreven hoe u de aanpassingen automatiseert met behulp van Azure VM Image Builder. Vervolgens kunt u de installatiekopieën distribueren naar een Azure Compute Gallery (voorheen Shared Image Gallery), waar u deze kunt repliceren naar andere regio's, de schaal kunt beheren en de installatiekopieën binnen en buiten uw organisatie kunt delen.

Om de implementatie van een VM Image Builder-configuratie te vereenvoudigen, wordt in ons voorbeeld gebruikgemaakt van een Azure Resource Manager-sjabloon met daarin de VM Image Builder-sjabloon genest. Deze aanpak biedt nog enkele voordelen, zoals variabelen en parameterinvoer. U kunt ook parameters doorgeven vanaf de opdrachtregel.

Dit artikel is bedoeld als een oefening voor kopiëren en plakken.

Notitie

U vindt de scripts voor het installeren van de apps op GitHub. Ze zijn alleen ter illustratie en voor testdoeleinden. Gebruik deze niet voor productieworkloads.

Tips voor het bouwen van Windows-installatiekopieën

  • VM-grootte: gebruik Standard_D2_v2 of hoger voor Windows. De standaardgrootte is Standard_D1_v2, wat niet geschikt is voor Windows.

  • In dit artikel worden PowerShell-aanpasserscripts gebruikt. Gebruik de volgende instellingen, anders reageert de build niet meer:

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

    Bijvoorbeeld:

      {
          "type": "PowerShell",
          "name": "installFSLogix",
          "runElevated": true,
          "runAsSystem": true,
          "scriptUri": "https://raw.githubusercontent.com/azure/azvmimagebuilder/main/solutions/14_Building_Images_WVD/0_installConfFsLogix.ps1"
    
  • Opmerking over uw code: het buildlogboek van VM Image Builder, customization.log, is uitgebreid. Als u commentaar toevoegt aan uw scripts met behulp van 'write-host', worden ze naar de logboeken verzonden, waardoor het oplossen van problemen eenvoudiger wordt.

     write-host 'AIB Customization: Starting OS Optimizations script'
    
  • Afsluitcodes: VM Image Builder verwacht dat alle scripts een 0 afsluitcode retourneren. Als u een afsluitcode gebruikt die niet nul is, mislukt de aanpassing van VM Image Builder en wordt de build gestopt. Als u complexe scripts hebt, voegt u instrumentatie toe en verzendt u afsluitcodes, die worden weergegeven in het bestand customization.log .

     Write-Host "Exit code: " $LASTEXITCODE
    
  • Testen: test en test uw code opnieuw op een zelfstandige VM. Zorg ervoor dat er geen gebruikersprompts zijn, dat u de juiste bevoegdheden gebruikt, enzovoort.

  • Netwerken: Set-NetAdapterAdvancedProperty is ingesteld in het optimalisatiescript, maar de build van VM Image Builder mislukt. Omdat de verbinding met het netwerk wordt verbroken, wordt het uitgeschakeld. We onderzoeken dit probleem.

Vereisten

U moet de meest recente Azure PowerShell cmdlets hebben geïnstalleerd. Zie Overzicht van Azure PowerShell voor meer informatie.

# 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

De omgeving en variabelen instellen

# 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

Machtigingen, gebruikersidentiteit en rol

  1. Maak een gebruikersidentiteit.

    # 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. Wijs machtigingen toe aan de identiteit om afbeeldingen te distribueren. Met de volgende opdrachten wordt de sjabloon gedownload en bijgewerkt met de eerder opgegeven parameters.

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

Notitie

Als u de fout 'New-AzRoleDefinition: Roldefinitielimiet overschreden. Er kunnen geen roldefinities meer worden gemaakt," zie Problemen met Azure RBAC (op rollen gebaseerd toegangsbeheer) oplossen.

Als u nog geen Azure Compute Gallery hebt, moet u er een maken.

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

De VM Image Builder-sjabloon configureren

Voor dit voorbeeld hebben we een sjabloon opgesteld waarmee de VM Image Builder-sjabloon wordt gedownload en bijgewerkt met de parameters die eerder zijn opgegeven. Met de sjabloon worden FSLogix, besturingssysteemoptimalisaties en Microsoft Teams geïnstalleerd en wordt aan het einde Windows Update uitgevoerd.

Als u de sjabloon opent, ziet u in de broneigenschap de afbeelding die wordt gebruikt. In dit voorbeeld wordt een Windows 10 installatiekopieën voor meerdere sessies gebruikt.

Windows 10 afbeeldingen

U moet rekening houden met twee belangrijke typen installatiekopieën: meerdere sessies en één sessie.

Installatiekopieën met meerdere sessies zijn bedoeld voor gegroepeerd gebruik. Hier volgt een voorbeeld van de details van de installatiekopieën in Azure:

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

Installatiekopieën met één sessie zijn bedoeld voor individueel gebruik. Hier volgt een voorbeeld van de details van de installatiekopieën in Azure:

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

U kunt ook wijzigen welke Windows 10 afbeeldingen beschikbaar zijn:

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

De sjabloon downloaden en configureren

Download nu de sjabloon en configureer deze voor uw eigen gebruik.

$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

U kunt de sjabloon gerust bekijken. Alle code kan worden weergegeven.

De sjabloon verzenden

Uw sjabloon moet worden verzonden naar de service. Hiermee downloadt u afhankelijke artefacten, zoals scripts, en valideert, controleert u machtigingen en slaat u deze op in de faseringsresourcegroep, die wordt voorafgegaan door 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

De installatiekopie bouwen

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

Notitie

De opdracht wacht niet totdat de VM Image Builder-service de build van de installatiekopieën heeft voltooid, dus u kunt de status opvragen zoals hier wordt weergegeven.

$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

Een virtuele machine maken

Nu de installatiekopie is gebouwd, kunt u er een VM van maken. Gebruik de voorbeelden uit New-AzVM (Az PowerShell-module). Compute).

Uw resources opschonen

Als u de resources die tijdens dit proces zijn gemaakt niet meer nodig hebt, kunt u deze als volgt verwijderen:

Belangrijk

Verwijder eerst de resourcegroepsjabloon. Als u alleen de resourcegroep verwijdert, wordt de faseringsresourcegroep (IT_) die wordt gebruikt door VM Image Builder niet opgeschoond.

  1. Verwijder de VM Image Builder-sjabloon.

    Remove-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name vd10ImageTemplate
    
  2. Verwijder de roltoewijzing.

    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. Verwijder de resourcegroep.

    Remove-AzResourceGroup $imageResourceGroup -Force
    

Volgende stappen

Als u meer voorbeelden van VM Image Builder wilt proberen, gaat u naar GitHub.