Creare un'immagine desktop virtuale di Azure usando Generatore immagini vm e PowerShell
Si applica a: ✔️ macchine virtuali Windows
In questo articolo viene illustrato 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 Azure VM Image Builder. È 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 per scopi di illustrazione e 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 maggiore. 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 smetterà 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"
Commenta il codice: il log di compilazione di Vm Image Builder, personalizzazione.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: Vm Image Builder prevede che tutti gli script restituiscono 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, è commentata. Stiamo esaminando 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
In questo esempio è stato preparato un modello che scarica e aggiorna il modello di Generatore immagini vm 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 l'uso personalizzato.
$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
Creare una VM
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 le operazioni seguenti:
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 Generatore immagini macchina virtuale non verrà pulito.
Rimuovere il modello di Generatore immagini 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 Generatore immagini vm, passare a GitHub.
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per