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

Voltooid

In deze les ziet u 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.

Deze eenheid is bedoeld als een overzicht van het proces of een oefening voor kopiëren en plakken.

Overwegingen voor het bouwen van Windows-installatiekopieën

  • VM-grootte: gebruik voor Windows Standard_D2_v2 of hoger. De standaardgrootte is Standard_D1_v2, die 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 afsluitcode van 0 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"
    

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

We hebben 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.

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