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).
L'uso di immagini di macchine virtuali standardizzate consente di garantire distribuzioni coerenti durante la migrazione al cloud. Queste immagini possono includere la sicurezza predefinita, le impostazioni di configurazione e il software necessario. La configurazione di una pipeline di imaging può richiedere molto tempo e complessità. Image Builder di macchine virtuali di Azure semplifica questo processo consentendo di creare una configurazione per l'immagine, che il servizio compila e invia a un progetto dev box.
La creazione di immagini di macchine virtuali personalizzate manualmente o con altri strumenti può essere difficile e inaffidabile. Image Builder di macchine virtuali, basato su HashiCorp Packer, offre i vantaggi di un servizio gestito.
Per semplificare la creazione dell'immagine della macchina virtuale, Image Builder della macchina virtuale:
- Elimina la necessità di strumenti, processi e passaggi manuali complessi. Astrae questi dettagli e nasconde le esigenze specifiche di Azure, ad esempio la generalizzazione dell'immagine (Sysprep), consentendo agli utenti avanzati di eseguire l'override, se necessario.
- Funziona con le pipeline di compilazione di immagini esistenti. È possibile chiamare Image Builder della macchina virtuale dalla pipeline o usare un'attività DevOps del servizio Image Builder di macchine virtuali di Azure.
- Raccoglie i dati di personalizzazione da varie origini, quindi non è necessario raccoglierli tutti in un'unica posizione.
- Si integra con Azure Compute Gallery, creando un sistema di gestione delle immagini per la distribuzione globale, la replica, il controllo delle versioni e il ridimensionamento. È possibile distribuire la stessa immagine di un disco rigido virtuale o di immagini gestite senza ricompilarle.
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:
- Azure PowerShell 6.0 o versione successiva. Se PowerShell non è installato, seguire la procedura descritta in Installare Azure PowerShell in Windows.
- Autorizzazioni di proprietario o collaboratore per una sottoscrizione di Azure o per un gruppo di risorse specifico.
- Un gruppo di risorse.
- Dev Center con una connessione di rete collegata. Se non è disponibile, seguire la procedura descritta in Connettere le caselle di sviluppo alle risorse configurando le connessioni di rete.
Creare un'immagine Windows e distribuirla in Azure Compute Gallery
Il primo passaggio consiste nell'usare Image Builder di macchine virtuali di Azure e Azure PowerShell per creare un'immagine in Azure Compute Gallery e distribuirla a livello globale.
L'esempio seguente usa PowerShell. È anche possibile usare l'interfaccia della riga di comando di interfaccia della riga di comando di Azure.
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
Installare i moduli di PowerShell:
'Az.ImageBuilder', 'Az.ManagedServiceIdentity' | ForEach-Object {Install-Module -Name $_ -AllowPrerelease}
Creare variabili per archiviare le informazioni usate più volte.
- Copiare il codice di esempio seguente.
- Sostituire
<Resource group>
con il gruppo di risorse usato per creare il dev center. - 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"
Creare un'identità assegnata dall'utente e impostare le autorizzazioni per il gruppo di risorse eseguendo il codice seguente in PowerShell.
Image Builder di macchine virtuali usa l'identità utente specificata per archiviare 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
Assegnare le autorizzazioni per l'identità per distribuire le immagini.
Usare questo comando per scaricare un modello di definizione del ruolo di Azure e 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"
Creare una raccolta
Per usare Image Builder di macchine virtuali con La raccolta di calcolo di Azure, assicurarsi di avere una raccolta e una definizione di immagine esistenti. Image Builder per macchine virtuali non crea automaticamente la raccolta e la definizione di immagine.
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"
Creare un file per archiviare la definizione del modello, ad esempio c:/temp/mytemplate.txt.
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.
Configurare il nuovo modello con le variabili.
Sostituire
<Template Path>
con il percorso del file modello, ad esempioc:/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
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
Compilare l'immagine richiamando il
Run
comando nel modello:Al prompt per confermare il processo di esecuzione immettere Sì.
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.
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.
Configurare la raccolta
Quando l'immagine personalizzata viene archiviata 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
Quando 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.