Condividi tramite


Usare Image Builder per macchine virtuali di Azure per creare un'immagine di macchina di sviluppo

Questo articolo illustra come usare un modello di Image Builder di macchine virtuali di Azure per creare un'immagine di macchina virtuale personalizzata nella raccolta di calcolo di Azure e distribuirla a livello globale. È quindi possibile usare l'immagine per creare caselle di sviluppo in Microsoft Dev Box.

Le immagini di macchine virtuali standardizzate consentono di garantire distribuzioni coerenti di dev box, includendo la sicurezza predefinita, la configurazione e il software. Tuttavia, la configurazione manuale di una pipeline di creazione di immagini richiede molto tempo e complessa e la creazione di immagini di macchine virtuali personalizzate può risultare difficile e inaffidabile.

Azure VM Image Builder è un servizio gestito basato su HashiCorp Packer che semplifica il processo di creazione di immagini di macchine virtuali per ambienti di sviluppo. Il modello Image Builder in questo articolo include i passaggi di personalizzazione che installano Visual Studio Code e Chocolatey.

Il generatore di immagini della macchina virtuale può:

  • Astrarre passaggi manuali o processi e strumenti complessi e nascondere le esigenze specifiche di Azure. Ad esempio, generalizzare un'immagine eseguendo sysprep ma consentire agli utenti avanzati di eseguirne l'override.
  • Usare le pipeline di compilazione di immagini esistenti. È possibile chiamare il VM Image Builder dalla pipeline o usare un'attività di servizio di Azure VM Image Builder in Azure Pipelines.
  • Raccogliere i dati di personalizzazione da varie origini, quindi non è necessario raccoglierli manualmente.
  • Eseguire l'integrazione con Azure Compute Gallery per creare un sistema di gestione delle immagini per la distribuzione globale, la replica, il controllo delle versioni e il ridimensionamento. È possibile distribuire un'immagine sia come disco rigido virtuale che come immagine gestita senza ricompilarla.

Importante

Microsoft Dev Box supporta solo immagini che usano il tipo di sicurezza Avvio attendibile .

Prerequisiti

L'esempio in questo articolo usa Azure PowerShell. È anche possibile usare l'interfaccia della riga di comando di Azure.

Categoria Requisiti
Strumenti e autorizzazioni Un gruppo di risorse di Azure a cui si dispone delle autorizzazioni Proprietario o Collaboratore .
Tools Azure PowerShell 6.0 o versione successiva installata. Per istruzioni, vedere Installare Azure PowerShell in Windows.

Configurare strumenti e ruoli

Per configurare strumenti e ruoli, è necessario:

  1. Installare i moduli di Azure PowerShell necessari.
  2. Impostare le variabili per le informazioni usate più volte.
  3. Registrare i provider di risorse di Azure necessari.
  4. Creare un'identità utente per il gruppo di risorse e assegnarla un ruolo che consenta la distribuzione delle immagini.

Installare i moduli di PowerShell

Installare i moduli di PowerShell necessari eseguendo il comando seguente:

'Az.ImageBuilder', 'Az.ManagedServiceIdentity' | ForEach-Object {Install-Module -Name $_ -AllowPrerelease}

Rispondere a Y alle richieste relative ai repository non attendibili.

Impostare variabili

Creare variabili per archiviare le informazioni usate più volte. Eseguire il codice seguente, sostituendo <resource-group> con il nome del gruppo di risorse e <location> con l'area di Azure da usare.

# Get existing context 
$currentAzContext = Get-AzContext

# Get your current subscription ID  
$subscriptionID=$currentAzContext.Subscription.Id

# Destination image resource group  
$imageResourceGroup="<resource-group>"

# Location
$location="<location>"

# Image distribution metadata reference name  
$runOutputName="aibCustWinManImg01"

# Image template name  
$imageTemplateName="vscodeWinTemplate"  

Registrare i provider di risorse di Azure

Per usare Azure VM Image Builder, è necessario registrare i seguenti provider di risorse di Azure:

  • Microsoft.VirtualMachineImages
  • Microsoft.Compute
  • Microsoft.Network
  • Microsoft.Storage
  • Microsoft.KeyVault
  • Microsoft.ContainerInstance
  1. Controllare le registrazioni del provider eseguendo il comando seguente:

      Get-AzResourceProvider -ProviderNamespace "Microsoft.VirtualMachineImages", "Microsoft.Compute", "Microsoft.Network", "Microsoft.Storage", "Microsoft.KeyVault", "Microsoft.ContainerInstance" | Format-table -Property ProviderNamespace,RegistrationState
    
  2. Se una delle registrazioni del provider non restituisce Registered, registrare il provider eseguendo il comando Register-AzResourceProvider. Nell'esempio seguente viene registrato il Microsoft.VirtualMachineImages provider di risorse.

      Register-AzResourceProvider -ProviderNamespace Microsoft.VirtualMachineImages
    

Creare e assegnare un'identità utente

Creare una definizione di ruolo di Azure che consenta la distribuzione dell'immagine. Creare quindi un'identità assegnata dall'utente per il gruppo di risorse e assegnare il ruolo all'identità utente. Vm Image Builder usa l'identità utente per archiviare l'immagine in Azure Compute Gallery.

  1. Eseguire il codice seguente per creare una definizione di ruolo di Azure e un'identità utente.

    # Set up a unique role definition name
    $timeInt=$(get-date -UFormat "%s") 
    $imageRoleDefName="Azure Image Builder Image Def"+$timeInt 
    $identityName="aibIdentity"+$timeInt 
    
    # Create an 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. Eseguire il codice seguente per scaricare un modello di definizione del ruolo di Azure che consente di distribuire un'immagine, aggiornare il modello con i parametri e assegnare il ruolo all'identità utente.

    $aibRoleImageCreationUrl="https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json" 
    $aibRoleImageCreationPath = "aibRoleImageCreation.json" 
    
    # Download the configuration 
    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" 
    

Per usare VM Image Builder con la Galleria di Calcolo di Azure, è necessaria una galleria e una definizione di immagine. La procedura seguente consente di creare una nuova raccolta e una nuova definizione di immagine e personalizzare un modello di Image Builder della macchina virtuale.

  1. Eseguire i comandi seguenti per creare una nuova raccolta e una definizione di immagine con il tipo di sicurezza di avvio attendibile richiesto per un'immagine di Windows 365.

    # Gallery name 
    $galleryName= "devboxGallery" 
    
    # Image definition name 
    $imageDefName ="vscodeImageDef" 
    
    # Second replication region 
    $replRegion2="eastus" 
    
    # Create the gallery 
    New-AzGallery -GalleryName $galleryName -ResourceGroupName $imageResourceGroup -Location $location 
    
    $SecurityType = @{Name='SecurityType';Value='TrustedLaunch'} 
    $features = @($SecurityType) 
    
    # Create the image definition
    New-AzGalleryImageDefinition -GalleryName $galleryName -ResourceGroupName $imageResourceGroup -Location $location -Name $imageDefName -OsState generalized -OsType Windows -Publisher 'myCompany' -Offer 'vscodebox' -Sku '1-0-0' -Feature $features -HyperVGeneration "V2" 
    
  2. Copiare e incollare il modello di Azure Resource Manager seguente per Image Builder di macchine virtuali in un nuovo file. Salvare il file in un percorso come c:\temp\mytemplate.jssu e quindi chiudere il file.

    Il modello definisce l'immagine di origine e le personalizzazioni applicate, installa Chocolatey e Visual Studio Code e indica il percorso di distribuzione delle immagini.

    {
       "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
       "contentVersion": "1.0.0.0",
       "parameters": {
         "imageTemplateName": {
          "type": "string"
         },
         "api-version": {
          "type": "string"
         },
         "svclocation": {
          "type": "string"
         }
       },
       "variables": {},
       "resources": [
         {
          "name": "[parameters('imageTemplateName')]",
          "type": "Microsoft.VirtualMachineImages/imageTemplates",
          "apiVersion": "[parameters('api-version')]",
          "location": "[parameters('svclocation')]",
          "dependsOn": [],
          "tags": {
            "imagebuilderTemplate": "win11multi",
            "userIdentity": "enabled"
          },
          "identity": {
            "type": "UserAssigned",
            "userAssignedIdentities": {
             "<imgBuilderId>": {}
            }
          },
          "properties": {
            "buildTimeoutInMinutes": 100,
            "vmProfile": {
             "vmSize": "Standard_DS2_v2",
             "osDiskSizeGB": 127
            },
          "source": {
             "type": "PlatformImage",
             "publisher": "MicrosoftWindowsDesktop",
             "offer": "Windows-11",
             "sku": "win11-21h2-ent",
             "version": "latest"
          },
            "customize": [
             {
                "type": "PowerShell",
                "name": "Install Choco and VS Code",
                "inline": [
                   "Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))",
                   "choco install -y vscode"
                ]
             }
            ],
             "distribute": 
             [
                {   
                   "type": "SharedImage",
                   "galleryImageId": "/subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<sharedImageGalName>/images/<imageDefName>",
                   "runOutputName": "<runOutputName>",
                   "artifactTags": {
                      "source": "azureVmImageBuilder",
                      "baseosimg": "win11multi"
                   },
                   "replicationRegions": [
                     "<region1>",
                     "<region2>"
                   ]
                }
             ]
          }
         }
       ]
      }
    
  3. Configurare il nuovo modello con le impostazioni eseguendo il codice seguente, sostituendo <template-location> con il percorso e il nome del file modello.

    $templateFilePath = "<template-location>"
    
    (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 '<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>',$galleryName| Set-Content -Path $templateFilePath  
    (Get-Content -path $templateFilePath -Raw ) -replace '<region1>',$location | Set-Content -Path $templateFilePath  
    (Get-Content -path $templateFilePath -Raw ) -replace '<region2>',$replRegion2 | Set-Content -Path $templateFilePath  
    ((Get-Content -path $templateFilePath -Raw) -replace '<imgBuilderId>',$identityNameResourceId) | Set-Content -Path $templateFilePath 
    

Compilare e visualizzare l'immagine

Inviare il modello personalizzato al servizio Image Builder della macchina virtuale e compilare l'immagine.

  1. Eseguire il comando seguente per inviare il modello al servizio. Il comando scarica tutti gli artefatti dipendenti, ad esempio gli script, e li archivia in un gruppo di risorse di staging preceduto da IT_.

    New-AzResourceGroupDeployment  -ResourceGroupName $imageResourceGroup  -TemplateFile $templateFilePath  -Api-Version "2020-02-14"  -imageTemplateName $imageTemplateName  -svclocation $location 
    
  2. Compilare l'immagine richiamando l'azione Run sul modello. Al prompt di conferma immettere Y per Yes.

    Invoke-AzResourceAction  -ResourceName $imageTemplateName  -ResourceGroupName $imageResourceGroup  -ResourceType Microsoft.VirtualMachineImages/imageTemplates  -ApiVersion "2020-02-14"  -Action Run
    

Importante

La creazione dell'immagine e la replica in due aree possono richiedere del tempo. È possibile che vengano visualizzati report di stato diversi tra PowerShell e il portale di Azure. Attendere il completamento del processo prima di iniziare a creare una definizione di dev box dall'immagine.

Ottenere informazioni sull'immagine

Eseguire il comando seguente per ottenere informazioni sull'immagine appena compilata, incluso lo stato di esecuzione e lo stato di provisioning.

Get-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup | Select-Object -Property Name, LastRunStatusRunState, LastRunStatusMessage, ProvisioningState 

Output di esempio:

Name              LastRunStatusRunState LastRunStatusMessage ProvisioningState
----              --------------------- -------------------- -----------------
vscodeWinTemplate Running                                    Succeeded

È anche possibile visualizzare lo stato di provisioning dell'immagine nel portale di Azure. Vai alla tua galleria per visualizzare la definizione dell'immagine.

Screenshot che mostra lo stato di fornitura della versione personalizzata dell'immagine.

Dopo aver archiviato l'immagine personalizzata nella raccolta, è possibile configurare la raccolta per l'uso delle immagini in un dev center di Microsoft Dev Box. Per altre informazioni, vedere Configurare Azure Compute Gallery per Microsoft Dev Box.

Dopo aver reso disponibili le immagini della raccolta nel dev center, è possibile allegare l'immagine personalizzata a un progetto dev box e usarla per creare box di sviluppo. Per altre informazioni, vedere Avvio rapido: Configurare Microsoft Dev Box.