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 deze aanpassingen:

In het artikel wordt beschreven hoe u de aanpassingen automatiseert met behulp van Azure VM Image Builder. U kunt de installatiekopieën vervolgens 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 het implementeren van een VM Image Builder-configuratie te vereenvoudigen, wordt in ons voorbeeld een Azure Resource Manager-sjabloon gebruikt waarin de VM Image Builder-sjabloon is genest. Deze benadering biedt u nog enkele voordelen, zoals variabelen en parameterinvoer. U kunt ook parameters doorgeven vanaf de opdrachtregel.

Dit artikel is bedoeld als een kopieer- en plakoefening.

Notitie

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

Tips voor het bouwen van Windows-installatiekopieën

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

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

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

    Voorbeeld:

      {
          "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 bij uw code: het buildlogboek van de VM Image Builder, customization.log, is uitgebreid. Als u uw scripts commentaar geeft met behulp van 'write-host', worden ze verzonden naar de logboeken, 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 zonder nul gebruikt, 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 customization.log-bestand .

     Write-Host "Exit code: " $LASTEXITCODE
    
  • Test: 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 mislukt de build van de VM Image Builder. Omdat de verbinding met het netwerk wordt verbroken, wordt er een opmerking weergegeven. We onderzoeken dit probleem.

Vereisten

U moet de nieuwste 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: Limiet voor roldefinities is 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 voorbereid waarmee de VM Image Builder-sjabloon wordt gedownload en bijgewerkt met de parameters die eerder zijn opgegeven. Met de sjabloon worden FSLogix, optimalisaties van besturingssystemen en Microsoft Teams geïnstalleerd en wordt Windows Update aan het einde uitgevoerd.

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

Windows 10-installatiekopieën

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

Installatiekopieën met meerdere sessies zijn bedoeld voor poolgebruik. Hier volgt een voorbeeld van de afbeeldingsdetails 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 afbeeldingsdetails in Azure:

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

U kunt ook wijzigen welke Windows 10-installatiekopieën 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 naar de service worden verzonden. Als u dit doet, worden afhankelijke artefacten, zoals scripts, gedownload en gevalideerd, worden machtigingen gecontroleerd en opgeslagen 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, zodat u de status kunt 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 VM maken:

Nu de installatiekopie is gebouwd, kunt u er een VIRTUELE machine van bouwen. Gebruik de voorbeelden uit de Module New-AzVM (Az PowerShell). Compute).

Uw resources opschonen

Als u de resources die tijdens dit proces zijn gemaakt niet meer nodig hebt, kunt u ze 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.