Condividi tramite


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:

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

  1. 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
    
    
  2. 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.

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.

  1. Rimuovere il modello di Generatore immagini macchina virtuale.

    Remove-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name vd10ImageTemplate
    
  2. 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
    
  3. Eliminare il gruppo di risorse.

    Remove-AzResourceGroup $imageResourceGroup -Force
    

Passaggi successivi

Per provare altri esempi di Generatore immagini vm, passare a GitHub.