Creare un'immagine di Desktop virtuale Azure usando Image Builder di macchine virtuali e PowerShell
Si applica a: ✔️ macchine virtuali di Windows
Questo articolo illustra come creare un'immagine di Desktop virtuale Azure con queste personalizzazioni:
- Installazione di FSLogix
- Ottimizzazione di Desktop virtuale Azure
- Installazione di Microsoft Teams
- Funzione di personalizzazione di Windows Restart
- Funzione di personalizzazione di Windows Update
L'articolo illustra come automatizzare le personalizzazioni usando Image Builder di macchine virtuali di Azure. È quindi possibile distribuire l'immagine in una Raccolta di calcolo di Azure (in precedenza Raccolta immagini condivise), in cui è possibile replicarla in altre aree, controllare la scalabilità e condividere l'immagine all'interno e all'esterno dell'organizzazione.
Per semplificare la distribuzione di una configurazione di Image Builder per macchine virtuali, nell'esempio viene usato un modello di Azure Resource Manager in cui è annidato un modello di Image Builder per macchine virtuali. Questo approccio offre alcuni altri vantaggi, ad esempio variabili e input dei parametri. È anche possibile passare parametri dalla riga di comando.
Questo articolo è destinato a un esercizio di copia e incolla.
Nota
Gli script per l'installazione delle app sono disponibili in GitHub. Sono solo a scopo illustrativo e di test. Non usarli per i carichi di lavoro di produzione.
Suggerimenti per la creazione di immagini Di Windows
Dimensioni della macchina virtuale: per Windows, usare
Standard_D2_v2
o versione successiva. La dimensione predefinita èStandard_D1_v2
, che non è adatta per Windows.Questo articolo usa script di personalizzazione di PowerShell. Usare le impostazioni seguenti oppure la compilazione smette di rispondere:
"runElevated": true, "runAsSystem": true,
Ad esempio:
{ "type": "PowerShell", "name": "installFSLogix", "runElevated": true, "runAsSystem": true, "scriptUri": "https://raw.githubusercontent.com/azure/azvmimagebuilder/main/solutions/14_Building_Images_WVD/0_installConfFsLogix.ps1"
Commentare il codice: il log di compilazione di Image Builder della macchina virtuale, customization.log, è dettagliato. Se gli script vengono commentati usando "write-host", vengono inviati ai log, che dovrebbero semplificare la risoluzione dei problemi.
write-host 'AIB Customization: Starting OS Optimizations script'
Codici di uscita: Image Builder di macchine virtuali prevede che tutti gli script restituiscano un
0
codice di uscita. Se si usa un codice di uscita diverso da 0, Image Builder per macchine virtuali non riesce a eseguire la personalizzazione e arresta la compilazione. Se sono presenti script complessi, aggiungere strumentazione e generare codici di uscita, che verranno visualizzati nel file customization.log.Write-Host "Exit code: " $LASTEXITCODE
Test: testare e ripetere il codice in una macchina virtuale autonoma. Assicurarsi che non siano presenti richieste utente, che siano in uso i privilegi corretti e così via.
Rete:
Set-NetAdapterAdvancedProperty
è impostata nello script di ottimizzazione ma non riesce la compilazione di Image Builder della macchina virtuale. Poiché disconnette la rete, è impostata come commento. Stiamo analizzando questo problema.
Prerequisiti
È necessario che siano installati i cmdlet Azure PowerShell più recenti. Per altre informazioni, vedere la panoramica di 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
Configurare l'ambiente e le variabili
# 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
Autorizzazioni, identità utente e ruolo
Creare un'identità utente.
# 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
Assegnare le autorizzazioni all'identità per la distribuzione di immagini. I comandi seguenti scaricano e aggiornano il modello con i parametri specificati in precedenza.
$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"
Nota
Se viene visualizzato l'errore "New-AzRoleDefinition: Limite di definizione del ruolo superato. Non è possibile creare altre definizioni di ruolo", vedere Risolvere i problemi relativi al controllo degli accessi in base al ruolo di Azure.
Creare una Raccolta di calcolo di Azure
Se non si dispone ancora di una Raccolta di calcolo di Azure, è necessario crearne una.
$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'
Configurare il modello di Image Builder per macchine virtuali
Per questo esempio è stato preparato un modello che scarica e aggiorna il modello di Image Builder della macchina virtuale con i parametri specificati in precedenza. Il modello installa FSLogix, le ottimizzazioni del sistema operativo e Microsoft Teams e alla fine esegue Windows Update.
Se si apre il modello, è possibile visualizzare nella proprietà di origine l'immagine usata. In questo esempio viene usata un'immagine multi-sessione di Windows 10.
immagini di Windows 10
È consigliabile tenere presenti due tipi principali di immagini: multi-sessione e a sessione singola.
Le immagini multi-sessione sono destinate all'utilizzo in pool. Ecco un esempio dei dettagli dell'immagine in Azure:
"publisher": "MicrosoftWindowsDesktop",
"offer": "Windows-10",
"sku": "20h2-avd",
"version": "latest"
Le immagini a sessione singola sono destinate all'utilizzo individuale. Ecco un esempio dei dettagli dell'immagine in Azure:
"publisher": "MicrosoftWindowsDesktop",
"offer": "Windows-10",
"sku": "19h2-ent",
"version": "latest"
È anche possibile modificare le immagini di Windows 10 disponibili:
Get-AzVMImageSku -Location westus2 -PublisherName MicrosoftWindowsDesktop -Offer windows-10
Scaricare e configurare il modello
Scaricare ora il modello e configurarlo per il proprio uso.
$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
È possibile visualizzare il modello. Tutto il codice è visualizzabile.
Inviare il modello
Il modello deve essere inviato al servizio. In questo modo, scarica tutti gli artefatti dipendenti, ad esempio gli script, e li convalida, ne controlla le autorizzazioni e li archivia nel gruppo di risorse di staging, che viene preceduto da 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
Compilare l'immagine
Start-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName -NoWait
Nota
Il comando non attende che il servizio Image Builder per macchine virtuali completi la compilazione dell'immagine, quindi è possibile eseguire query sullo stato come illustrato qui.
$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
Creazione di una macchina virtuale
Una volta completata la compilazione dell'immagine, è possibile compilare una macchina virtuale. Usare gli esempi di New-AzVM (Az PowerShell module.Compute).
Pulire le risorse
Se non sono più necessarie le risorse create durante questo processo, è possibile eliminarle eseguendo la procedura seguente:
Importante
Eliminare prima il modello del gruppo di risorse. Se si elimina solo il gruppo di risorse, il gruppo di risorse di staging (IT_) usato da Image Builder della macchina virtuale non verrà pulito.
Rimuovere il modello image builder della macchina virtuale.
Remove-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name vd10ImageTemplate
Eliminare l'assegnazione di ruolo.
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
Eliminare il gruppo di risorse.
Remove-AzResourceGroup $imageResourceGroup -Force
Passaggi successivi
Per provare altri esempi di Image Builder di macchine virtuali, passare a GitHub.