Configurer une zone de développement à l’aide du Générateur d’images de machine virtuelle Azure et de Microsoft Dev Box

Dans cet article, vous utilisez Azure VM Image Builder pour créer une zone de développement personnalisée dans Microsoft Dev Box à l’aide d’un modèle. Le modèle inclut une étape de personnalisation pour installer Visual Studio Code (VS Code).

Lorsque votre organisation utilise des images de machine virtuelle normalisées, elle peut migrer plus facilement vers le cloud et garantir la cohérence dans vos déploiements. Les images incluent généralement des paramètres de sécurité et de configuration prédéfinis, ainsi que tout logiciel nécessaire. La configuration de votre propre pipeline de création d’images nécessite du temps, une infrastructure et bien d’autres détails. Avec Azure VM Image Builder, vous pouvez créer une configuration qui décrit votre image. Le service génère ensuite l’image et l’envoie à un projet de zone de développement.

Bien qu’il soit possible de créer des images de machine virtuelle personnalisées manuellement ou à l’aide d’autres outils, le processus peut être fastidieux et peu fiable. VM Image Builder, qui s’appuie sur HashiCorp Packer, vous offre les avantages d’un service managé.

Pour réduire la complexité de la création d’images de machine virtuelle, VM Image Builder :

  • Élimine la nécessité d’utiliser des outils, des processus et des étapes manuelles complexes pour créer une image de machine virtuelle. VM Image Builder fait abstraction de tous ces détails et masque les exigences spécifiques à Azure, comme la nécessité de généraliser l’image (Sysprep). Cela donne aux utilisateurs plus avancés la possibilité de ne pas tenir compte de ces exigences.

  • Fonctionne avec les pipelines de génération d’images existants pour une expérience de clic et d’utilisation. Vous pouvez appeler vm Image Builder à partir de votre pipeline ou utiliser une tâche DevOps du service Azure VM Image Builder.

  • Récupère les données de personnalisation de différentes sources, ce qui supprime la nécessité de les collecter à partir d’un seul emplacement.

  • S’intègre à Azure Compute Gallery, qui crée un système de gestion des images pour la distribution, la réplication, le contrôle de version et la mise à l’échelle des images à l’échelle mondiale. En outre, vous pouvez distribuer la même image résultante qu’un disque dur virtuel ou en tant qu’une ou plusieurs images gérées, sans avoir à les reconstruire à partir de zéro.

Important

Microsoft Dev Box prend uniquement en charge les images qui utilisent le type de sécurité Approuvé Launch activé.

Prérequis

Pour provisionner une image personnalisée que vous avez créée à l’aide du Générateur d’images de machine virtuelle, vous avez besoin des éléments suivants :

La première étape consiste à utiliser Azure VM Image Builder et Azure PowerShell pour créer une version d’image dans Azure Compute Gallery, puis à distribuer l’image globalement. Vous pouvez également effectuer cette tâche à l’aide d’Azure CLI.

  1. Pour utiliser VM Image Builder, vous devez inscrire ces fonctionnalités.

    Vérifiez les inscriptions de votre fournisseur. Vérifiez que chaque commande retourne Registered la fonctionnalité spécifiée.

       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 
    

    Si les inscriptions de fournisseurs ne retournent Registeredpas, inscrivez les fournisseurs en exécutant les commandes suivantes :

       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. Installez les modules PowerShell :

    'Az.ImageBuilder', 'Az.ManagedServiceIdentity' | ForEach-Object {Install-Module -Name $_ -AllowPrerelease}
    
  3. Créez des variables pour stocker des informations que vous utilisez plusieurs fois.

    1. Copiez l’exemple de code suivant.
    2. Remplacez <Resource group> par le groupe de ressources que vous avez utilisé pour créer le centre de développement.
    3. Exécutez le code mis à jour dans 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. Créez une identité affectée par l’utilisateur et définissez des autorisations sur le groupe de ressources en exécutant le code suivant dans PowerShell.

    Vm Image Builder utilise l’identité utilisateur fournie pour injecter l’image dans Azure Compute Gallery. L’exemple suivant crée une définition de rôle Azure avec des actions spécifiques pour distribuer l’image. La définition de rôle est alors attribuée à l’identité de l’utilisateur.

    # 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. Attribuez des autorisations pour l’identité pour distribuer les images.

    Utilisez cette commande pour télécharger un modèle de définition de rôle Azure, puis mettez-le à jour avec les paramètres précédemment spécifiés :

    $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" 
    

Pour utiliser VM Image Builder avec Azure Compute Gallery, vous devez disposer d’une galerie et d’une définition d’image existantes. VM Image Builder ne crée pas la galerie et la définition d’image pour vous.

  1. Exécutez les commandes suivantes pour créer une nouvelle galerie et une définition d’image.

    Ce code crée une définition avec le type de sécurité de lancement approuvé et répond aux exigences de l’image 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. Créez un fichier pour stocker votre définition de modèle, par exemple c :/temp/mytemplate.txt.

  3. Copiez le modèle Azure Resource Manager suivant pour vm Image Builder dans votre nouveau fichier de modèle.

    Ce modèle indique l’image source et les personnalisations appliquées. Il installe Choco et VS Code, et indique également l’emplacement de distribution d’images.

    {
       "$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>"
                   ]
                }
             ]
          }
         }
       ]
      }
    

    Fermez votre fichier de modèle avant de passer à l’étape suivante.

  4. Configurez votre nouveau modèle avec vos variables.

    Remplacez <Template Path> par l’emplacement de votre fichier de modèle, par c:/temp/mytemplateexemple .

    $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. Envoyez votre modèle au service.

    La commande suivante télécharge tous les artefacts dépendants, tels que les scripts, et les stocke dans le groupe de ressources intermédiaire. Le groupe de ressources intermédiaire est préfixé par IT_.

    New-AzResourceGroupDeployment  -ResourceGroupName $imageResourceGroup  -TemplateFile $templateFilePath  -Api-Version "2020-02-14"  -imageTemplateName $imageTemplateName  -svclocation $location 
    
  6. Générez l’image en appelant la Run commande sur le modèle :

    À l’invite pour confirmer le processus d’exécution, entrez Oui.

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

    Important

    La création de l’image et sa réplication dans les deux régions peut prendre un certain temps. Vous pouvez voir une différence dans la création de rapports d’avancement entre PowerShell et le Portail Azure. Avant de commencer à créer une définition de zone de développement, attendez que le processus se termine.

  7. Obtenez des informations sur l’image nouvellement générée, notamment l’état d’exécution et l’état d’approvisionnement.

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

    Exemple de sortie :

    Name                 LastRunStatusRunState    LastRunStatusMessage   ProvisioningState
    ---------------------------------------------------------------------------------------
    vscodeWinTemplate                                                    Creating
    

    Vous pouvez également afficher l’état d’approvisionnement de votre image dans la Portail Azure. Accédez à votre galerie et affichez la définition d’image.

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

Une fois que votre image personnalisée est configurée dans la galerie, vous pouvez configurer la galerie pour utiliser les images dans le centre de développement. Pour plus d’informations, consultez Configurer Azure Compute Gallery.

Configurer Microsoft Dev Box avec une image personnalisée

Une fois les images de galerie disponibles dans le centre de développement, vous pouvez utiliser l’image personnalisée avec Microsoft Dev Box. Pour plus d’informations, consultez Démarrage rapide : Configurer Microsoft Dev Box.