Condividi tramite


Configurare una casella di sviluppo usando Image Builder di macchine virtuali di Azure e Microsoft Dev Box

In questo articolo si usa Image Builder di macchine virtuali di Azure per creare una casella di sviluppo personalizzata in Microsoft Dev Box usando un modello. Il modello include un passaggio di personalizzazione per installare Visual Studio Code (VS Code).

Quando l'organizzazione usa immagini di macchine virtuali (VM) standardizzate, può eseguire più facilmente la migrazione al cloud e garantire la coerenza nelle distribuzioni. Le immagini in genere includono sicurezza predefinita, impostazioni di configurazione e qualsiasi software necessario. La configurazione della pipeline di creazione di immagini richiede tempo, infrastruttura e molti altri dettagli. Con Image Builder di macchine virtuali di Azure è possibile creare una configurazione che descrive l'immagine. Il servizio compila quindi l'immagine e la invia a un progetto dev box.

Anche se è possibile creare immagini di vm personalizzate a mano o usando altri strumenti, il processo può essere complesso e inaffidabile. Image Builder di macchine virtuali, basato su HashiCorp Packer, offre i vantaggi di un servizio gestito.

Per ridurre la complessità della creazione di immagini di macchine virtuali, Image Builder della macchina virtuale:

  • Rimuove la necessità di usare strumenti, processi e passaggi manuali complessi per creare un'immagine di macchina virtuale. Image Builder di macchine virtuali astrae tutti questi dettagli e nasconde i requisiti specifici di Azure, ad esempio la necessità di generalizzare l'immagine (Sysprep). E offre agli utenti più avanzati la possibilità di ignorare tali requisiti.

  • Funziona con le pipeline di compilazione di immagini esistenti per un'esperienza click-and-go. È possibile chiamare Image Builder della macchina virtuale dalla pipeline o usare un'attività DevOps del servizio Image Builder di macchine virtuali di Azure.

  • Recupera i dati di personalizzazione da varie origini, eliminando la necessità di raccoglierli tutti da un'unica posizione.

  • Si integra con Azure Compute Gallery, che crea un sistema di gestione delle immagini per la distribuzione, la replica, il controllo delle versioni e il ridimensionamento delle immagini a livello globale. Inoltre, è possibile distribuire la stessa immagine risultante di un disco rigido virtuale o di una o più immagini gestite, senza doverle ricompilare da zero.

Importante

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

Prerequisiti

Per effettuare il provisioning di un'immagine personalizzata creata usando Image Builder di macchine virtuali, è necessario:

Il primo passaggio consiste nell'usare Image Builder di macchine virtuali di Azure e Azure PowerShell per creare una versione dell'immagine in Azure Compute Gallery e quindi distribuire l'immagine a livello globale. È anche possibile eseguire questa attività usando l'interfaccia della riga di comando di Azure.

  1. Per usare Image Builder di macchine virtuali, è necessario registrare le funzionalità.

    Controllare le registrazioni del provider. Assicurarsi che ogni comando restituisca Registered per la funzionalità specificata.

       Get-AzResourceProvider -ProviderNamespace Microsoft.VirtualMachineImages | Format-table -Property ResourceTypes,RegistrationState 
       Get-AzResourceProvider -ProviderNamespace Microsoft.Storage | Format-table -Property ResourceTypes,RegistrationState  
       Get-AzResourceProvider -ProviderNamespace Microsoft.Compute | Format-table -Property ResourceTypes,RegistrationState 
       Get-AzResourceProvider -ProviderNamespace Microsoft.KeyVault | Format-table -Property ResourceTypes,RegistrationState 
       Get-AzResourceProvider -ProviderNamespace Microsoft.Network | Format-table -Property ResourceTypes,RegistrationState 
    

    Se le registrazioni del provider non restituiscono Registered, registrare i provider eseguendo i comandi seguenti:

       Register-AzResourceProvider -ProviderNamespace Microsoft.VirtualMachineImages  
       Register-AzResourceProvider -ProviderNamespace Microsoft.Storage  
       Register-AzResourceProvider -ProviderNamespace Microsoft.Compute  
       Register-AzResourceProvider -ProviderNamespace Microsoft.KeyVault  
       Register-AzResourceProvider -ProviderNamespace Microsoft.Network 
    
  2. Installare i moduli di PowerShell:

    'Az.ImageBuilder', 'Az.ManagedServiceIdentity' | ForEach-Object {Install-Module -Name $_ -AllowPrerelease}
    
  3. Creare variabili per archiviare le informazioni usate più volte.

    1. Copiare il codice di esempio seguente.
    2. Sostituire <Resource group> con il gruppo di risorse usato per creare il dev center.
    3. Eseguire il codice aggiornato in PowerShell.
    # Get existing context 
    $currentAzContext = Get-AzContext
    
    # Get your current subscription ID  
    $subscriptionID=$currentAzContext.Subscription.Id
    
    # Destination image resource group  
    $imageResourceGroup="<Resource group>"
    
    # Location  
    $location="eastus2"
    
    # Image distribution metadata reference name  
    $runOutputName="aibCustWinManImg01"
    
    # Image template name  
    $imageTemplateName="vscodeWinTemplate"  
    
  4. Creare un'identità assegnata dall'utente e impostare le autorizzazioni per il gruppo di risorse eseguendo il codice seguente in PowerShell.

    Vm Image Builder usa l'identità utente fornita per inserire l'immagine nella raccolta di calcolo di Azure. L'esempio seguente crea una definizione di ruolo di Azure con azioni specifiche per la distribuzione dell'immagine. La definizione del ruolo viene quindi assegnata all'identità utente.

    # Set up role definition names, which need to be unique 
    $timeInt=$(get-date -UFormat "%s") 
    $imageRoleDefName="Azure Image Builder Image Def"+$timeInt 
    $identityName="aibIdentity"+$timeInt 
    
    # Add an Azure PowerShell module to support AzUserAssignedIdentity 
    Install-Module -Name Az.ManagedServiceIdentity 
    
    # 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
    
  5. Assegnare le autorizzazioni per l'identità per distribuire le immagini.

    Usare questo comando per scaricare un modello di definizione del ruolo di Azure e quindi aggiornarlo con i parametri specificati in precedenza:

    $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 Image Builder di macchine virtuali con La raccolta di calcolo di Azure, è necessario avere una raccolta esistente e una definizione di immagine. Image Builder di macchine virtuali non crea automaticamente la raccolta e la definizione di immagine.

  1. Eseguire i comandi seguenti per creare una nuova raccolta e una nuova definizione di immagine.

    Questo codice crea una definizione con il tipo di sicurezza di avvio attendibile e soddisfa i requisiti dell'immagine di Windows 365.

    # Gallery name 
    $galleryName= "devboxGallery" 
    
    # Image definition name 
    $imageDefName ="vscodeImageDef" 
    
    # Additional 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. Creare un file per archiviare la definizione del modello, ad esempio c:/temp/mytemplate.txt.

  3. Copiare il modello di Azure Resource Manger seguente per Image Builder della macchina virtuale nel nuovo file modello.

    Questo modello indica l'immagine di origine e le personalizzazioni applicate. Installa Choco e VS Code e indica anche 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 Vscode",
                "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>"
                   ]
                }
             ]
          }
         }
       ]
      }
    

    Chiudere il file del modello prima di procedere al passaggio successivo.

  4. Configurare il nuovo modello con le variabili.

    Sostituire <Template Path> con il percorso del file modello, ad esempio c:/temp/mytemplate.

    $templateFilePath = <Template Path>
    
    (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 
    
  5. Inviare il modello al servizio.

    Il comando seguente scarica tutti gli artefatti dipendenti, ad esempio gli script, e li archivia nel gruppo di risorse di staging. Il gruppo di risorse di staging è preceduto da IT_.

    New-AzResourceGroupDeployment  -ResourceGroupName $imageResourceGroup  -TemplateFile $templateFilePath  -Api-Version "2020-02-14"  -imageTemplateName $imageTemplateName  -svclocation $location 
    
  6. Compilare l'immagine richiamando il Run comando nel modello:

    Al prompt per confermare il processo di esecuzione immettere .

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

    Importante

    La creazione dell'immagine e la relativa replica in entrambe le aree possono richiedere del tempo. È possibile che venga visualizzata una differenza nella creazione di report in corso tra PowerShell e il portale di Azure. Prima di iniziare a creare una definizione di dev box, attendere il completamento del processo.

  7. Ottenere informazioni sull'immagine appena compilata, inclusi 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                                                    Creating
    

    È anche possibile visualizzare lo stato di provisioning dell'immagine nel portale di Azure. Passare alla raccolta e visualizzare la definizione dell'immagine.

    Screenshot that shows the provisioning state of the customized image version.

Dopo il provisioning dell'immagine personalizzata nella raccolta, è possibile configurare la raccolta per l'uso delle immagini nel dev center. Per altre informazioni, vedere Configurare la raccolta di calcolo di Azure.

Configurare Microsoft Dev Box con un'immagine personalizzata

Dopo che le immagini della raccolta sono disponibili nel Dev Center, è possibile usare l'immagine personalizzata con Microsoft Dev Box. Per altre informazioni, vedere Avvio rapido: Configurare Microsoft Dev Box.