Konfigurieren eines Entwicklerfelds mithilfe von Azure VM Image Builder und Microsoft Dev Box

In diesem Artikel verwenden Sie den Azure VM Image Builder, um mithilfe einer Vorlage ein benutzerdefiniertes Entwicklerfeld in Microsoft Dev Box zu erstellen. Die Vorlage enthält einen Anpassungsschritt zum Installieren von Visual Studio Code (VS Code).

Wenn Ihre Organisation standardisierte VM-Images (Virtual Machine) verwendet, kann sie einfacher in die Cloud migriert werden und die Konsistenz in Ihren Bereitstellungen sicherstellen. Die Images beinhalten üblicherweise vordefinierte Sicherheits- und Konfigurationseinstellungen sowie die notwendige Software. Das Einrichten einer eigenen Imaging-Pipeline erfordert Zeit, Infrastruktur und viele weitere Einzelheiten. Mit azure VM Image Builder können Sie eine Konfiguration erstellen, die Ihr Image beschreibt. Anschließend erstellt der Dienst das Image und sendet es an ein Dev Box-Projekt.

Obwohl es möglich ist, benutzerdefinierte VM-Images manuell oder mit anderen Tools zu erstellen, kann der Prozess umständlich und unzuverlässig sein. VM Image Builder basiert auf HashiCorp Packer und bietet Ihnen die Vorteile eines verwalteten Diensts.

Um die Komplexität des Erstellens von VM-Images zu reduzieren, führt VM Image Generator folgendes durch:

  • Es macht die Verwendung komplexer Tools, Prozesse und manueller Schritte zur Erstellung eines VM-Images überflüssig. Der VM Image Builder abstrahiert alle diese Details und blendet Azure-spezifische Anforderungen aus, z. B. die Notwendigkeit, das Image (Sysprep) zu generalisieren. Und es bietet fortgeschrittenen Benutzern die Möglichkeit, solche Anforderungen zu überschreiben.

  • Funktioniert mit vorhandenen Imagebuildpipelines für eine Klick-und-Los-Erfahrung. Sie können VM Image Builder über Ihre Pipeline aufrufen oder eine DevOps-Aufgabe des Azure VM Image Builder-Diensts verwenden.

  • Ruft Anpassungsdaten aus verschiedenen Quellen ab, wodurch die Notwendigkeit entfernt wird, sie alle von einem Ort zu sammeln.

  • Integriert in den Azure Compute Gallery, der ein Imageverwaltungssystem für die globale Verteilung, Replikation, Versionsverwaltung und Skalierung von Bildern erstellt. Darüber hinaus können Sie dasselbe resultierende Image wie eine virtuelle Festplatte oder als ein oder mehrere verwaltete Images verteilen, ohne sie von Grund auf neu erstellen zu müssen.

Wichtig

Microsoft Dev Box unterstützt nur Bilder, die den vertrauenswürdigen Starttyp "vertrauenswürdig" verwenden.

Voraussetzungen

Um ein benutzerdefiniertes Image bereitzustellen, das Sie mit vm Image Builder erstellt haben, benötigen Sie Folgendes:

Der erste Schritt besteht darin, Azure VM Image Builder und Azure PowerShell zu verwenden, um eine Imageversion in Azure Compute Gallery zu erstellen und das Image dann global zu verteilen. Sie können diese Aufgabe auch mithilfe der Azure CLI ausführen.

  1. Um VM Image Builder zu verwenden, müssen Sie die Features registrieren.

    Überprüfen Sie Ihre Anbieterregistrierungen. Stellen Sie sicher, dass jeder Befehl für das angegebene Feature zurückgegeben wird Registered .

       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 
    

    Wenn die Anbieterregistrierungen nicht zurückgegeben Registeredwerden, registrieren Sie die Anbieter, indem Sie die folgenden Befehle ausführen:

       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. Installieren Sie PowerShell-Module:

    'Az.ImageBuilder', 'Az.ManagedServiceIdentity' | ForEach-Object {Install-Module -Name $_ -AllowPrerelease}
    
  3. Erstellen Sie Variablen zum Speichern von Informationen, die Sie mehrmals verwenden.

    1. Kopieren Sie den folgenden Beispielcode.
    2. Ersetzen Sie durch <Resource group> die Ressourcengruppe, die Sie zum Erstellen des Dev Centers verwendet haben.
    3. Führen Sie den aktualisierten Code in PowerShell aus.
    # 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. Erstellen Sie eine vom Benutzer zugewiesene Identität, und legen Sie Berechtigungen für die Ressourcengruppe fest, indem Sie den folgenden Code in PowerShell ausführen.

    VM Image Builder verwendet die bereitgestellte Benutzeridentität, um das Image in den Azure Compute Gallery einzufügen. Im folgenden Beispiel wird eine Azure-Rollendefinition mit bestimmten Aktionen zum Verteilen des Bilds erstellt. Die Rollendefinition wird dann der Benutzeridentität zugewiesen.

    # 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. Weisen Sie berechtigungen für die Identität zu, um die Bilder zu verteilen.

    Verwenden Sie diesen Befehl, um eine Azure-Rollendefinitionsvorlage herunterzuladen und dann mit den zuvor angegebenen Parametern zu aktualisieren:

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

Zum Verwenden von VM Image Builder mit Azure Compute Gallery benötigen Sie einen vorhandenen Katalog und eine Imagedefinition. Der Katalog und die Imagedefinition werden nicht von VM Image Builder für Sie erstellt.

  1. Führen Sie die folgenden Befehle aus, um eine neue Katalog- und Bilddefinition zu erstellen.

    Dieser Code erstellt eine Definition mit dem vertrauenswürdigen Startsicherheitstyp und erfüllt die Windows 365-Imageanforderungen.

    # 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. Erstellen Sie eine Datei zum Speichern Ihrer Vorlagendefinition, z. B. c:/temp/mytemplate.txt.

  3. Kopieren Sie die folgende Azure Resource Manger-Vorlage für VM Image Builder in die neue Vorlagendatei.

    Diese Vorlage gibt das Quellbild und die angewendeten Anpassungen an. Es installiert Choco und VS Code und gibt auch den Speicherort der Imageverteilung an.

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

    Schließen Sie die Vorlagendatei, bevor Sie mit dem nächsten Schritt fortfahren.

  4. Konfigurieren Sie Ihre neue Vorlage mit Ihren Variablen.

    Ersetzen Sie <Template Path> den Speicherort der Vorlagendatei, z c:/temp/mytemplate. B. durch .

    $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. Übermitteln Sie Ihre Vorlage an den Dienst.

    Der folgende Befehl lädt alle abhängigen Artefakte herunter, z. B. Skripts, und speichert sie in der Stagingressourcengruppe. Der Stagingressourcengruppe wird das Präfix " IT_.

    New-AzResourceGroupDeployment  -ResourceGroupName $imageResourceGroup  -TemplateFile $templateFilePath  -Api-Version "2020-02-14"  -imageTemplateName $imageTemplateName  -svclocation $location 
    
  6. Erstellen Sie das Bild, indem Sie den Run Befehl in der Vorlage aufrufen:

    Geben Sie an der Eingabeaufforderung, um den Ausführungsprozess zu bestätigen, "Ja" ein.

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

    Wichtig

    Das Erstellen des Bilds und das Replizieren des Bilds in beiden Regionen kann einige Zeit in Anspruch nehmen. Möglicherweise sehen Sie einen Unterschied in der Fortschrittsberichterstattung zwischen PowerShell und dem Azure-Portal. Bevor Sie mit dem Erstellen einer Dev Box-Definition beginnen, warten Sie, bis der Prozess abgeschlossen ist.

  7. Rufen Sie Informationen zum neu erstellten Image ab, einschließlich des Ausführungsstatus und des Bereitstellungsstatus.

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

    Beispielausgabe:

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

    Sie können auch den Bereitstellungsstatus Ihres Bilds im Azure-Portal anzeigen. Wechseln Sie zu Ihrem Katalog, und zeigen Sie die Bilddefinition an.

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

Nachdem Ihr benutzerdefiniertes Bild im Katalog bereitgestellt wurde, können Sie den Katalog so konfigurieren, dass die Bilder im Dev Center verwendet werden. Weitere Informationen finden Sie unter Konfigurieren von Azure Compute Gallery.

Einrichten von Microsoft Dev Box mit einem benutzerdefinierten Image

Nachdem die Katalogbilder im Dev Center verfügbar sind, können Sie das benutzerdefinierte Image mit Microsoft Dev Box verwenden. Weitere Informationen finden Sie in der Schnellstartanleitung: Konfigurieren von Microsoft Dev Box.