Freigeben über


Verwenden des Azure VM Image Builder zum Erstellen eines Dev Box-Images

In diesem Artikel wird gezeigt, wie Sie eine Azure VM Image Builder-Vorlage verwenden, um ein benutzerdefiniertes VM-Image in Azure Compute Gallery zu erstellen und global zu verteilen. Anschließend können Sie das Image verwenden, um Entwicklerfelder in Microsoft Dev Box zu erstellen.

Standardisierte VM-Images können Ihnen helfen, konsistente Entwicklungsboxbereitstellungen sicherzustellen, indem sie vordefinierte Sicherheit, Konfiguration und Software einschließen. Das manuelle Einrichten einer Imageerstellungspipeline ist jedoch zeitaufwändig und komplex, und das Erstellen von benutzerdefinierten VM-Images kann schwierig und unzuverlässig sein.

Azure VM Image Builder ist ein verwalteter Dienst, der auf HashiCorp Packer basiert und das Erstellen von VM-Images für Entwicklungsumgebungen vereinfacht. Die Image Builder-Vorlage in diesem Artikel enthält Anpassungsschritte zum Installieren von Visual Studio Code und Chocolatey.

VM Image Builder kann:

  • Manuelle oder komplexe Tools und Prozesse abstrahieren und Azure-spezifische Anforderungen verbergen. Verallgemeinern Sie zum Beispiel ein Image, indem Sie sysprep ausführen, aber fortgeschrittenen Benutzern die Möglichkeit bieten, es zu überschreiben.
  • Arbeiten Sie mit bestehenden Build-Pipelines für Images. Sie können VM Image Builder aus Ihrer Pipeline aufrufen oder eine Azure VM Image Builder-Dienstaufgabe in Azure Pipelines verwenden.
  • Sammeln Sie Anpassungsdaten aus verschiedenen Quellen, sodass Sie sie nicht selbst sammeln müssen.
  • Integrieren Sie sich in die Azure Compute Gallery, um ein Imageverwaltungssystem für die globale Verteilung, Replikation, Verwaltung von Versionen und Skalierung zu erstellen. Sie können ein Image sowohl als virtuelle Festplatte als auch als verwaltetes Image verteilen, ohne es neu zu erstellen.

Wichtig

Microsoft Dev Box unterstützt nur Bilder, die den Sicherheitstyp "Vertrauenswürdiger Start" verwenden.

Voraussetzungen

Das Beispiel in diesem Artikel verwendet Azure PowerShell. Sie können auch die Azure CLI verwenden.

Kategorie Anforderungen
Tools und Berechtigungen Eine Azure-Ressourcengruppe, für die Sie über Berechtigungen "Besitzer " oder "Mitwirkender " verfügen.
Tools Azure PowerShell 6.0 oder höher installiert. Anweisungen finden Sie unter Installieren von Azure PowerShell unter Windows.

Einrichten von Tools und Rollen

Zum Einrichten von Tools und Rollen führen Sie folgende Aktionen aus:

  1. Installieren Sie die erforderlichen Azure PowerShell-Module.
  2. Legen Sie Variablen für Informationen fest, die Sie mehrmals verwenden.
  3. Registrieren Sie die erforderlichen Azure-Ressourcenanbieter.
  4. Erstellen Sie eine Benutzeridentität für Ihre Ressourcengruppe, und weisen Sie sie einer Rolle zu, mit der Bilder verteilt werden können.

Installieren von PowerShell-Modulen

Installieren Sie die erforderlichen PowerShell-Module, indem Sie den folgenden Befehl ausführen:

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

Antworten Sie Y auf die Eingabeaufforderungen zu nicht vertrauenswürdigen Repositorys.

Festlegen von Variablen

Erstellen Sie Variablen zum Speichern von Informationen, die Sie mehrmals verwenden. Führen Sie den folgenden Code aus, ersetzen Sie <resource-group> durch den Namen Ihrer Ressourcengruppe und <location> durch die Azure-Region, die Sie verwenden möchten.

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

Registrieren von Azure-Ressourcenanbietern

Um VM Image Builder zu verwenden, müssen die folgenden Azure-Ressourcenanbieter registriert werden:

  • Microsoft.VirtualMachineImages
  • Microsoft.Compute
  • Microsoft.Network
  • Microsoft.Storage
  • Microsoft.KeyVault
  • Microsoft.ContainerInstance
  1. Überprüfen Sie die Anbieterregistrierungen, indem Sie den folgenden Befehl ausführen:

      Get-AzResourceProvider -ProviderNamespace "Microsoft.VirtualMachineImages", "Microsoft.Compute", "Microsoft.Network", "Microsoft.Storage", "Microsoft.KeyVault", "Microsoft.ContainerInstance" | Format-table -Property ProviderNamespace,RegistrationState
    
  2. Wenn eine der Anbieterregistrierungen nicht Registered zurückgibt, registrieren Sie den Anbieter, indem Sie den Register-AzResourceProvider-Befehl ausführen. Im folgenden Beispiel wird der Microsoft.VirtualMachineImages Ressourcenanbieter registriert.

      Register-AzResourceProvider -ProviderNamespace Microsoft.VirtualMachineImages
    

Erstellen und Zuweisen einer Benutzeridentität

Erstellen Sie eine Azure-Rollendefinition, mit der das Image verteilt werden kann. Erstellen Sie dann eine vom Benutzer zugewiesene Identität für Ihre Ressourcengruppe, und weisen Sie der Benutzeridentität die Rolle zu. DER VM Image Builder verwendet die Benutzeridentität, um das Image im Azure Compute Gallery zu speichern.

  1. Führen Sie den folgenden Code aus, um eine Azure-Rollendefinition und Benutzeridentität zu erstellen.

    # 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. Führen Sie den folgenden Code aus, um eine Azure-Rollendefinitionsvorlage herunterzuladen, die verteilung eines Bilds zu ermöglichen, die Vorlage mit Ihren Parametern zu aktualisieren und die Rolle der Benutzeridentität zuzuweisen.

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

Um VM Image Builder mit Azure Compute Gallery zu verwenden, benötigen Sie einen Katalog und eine Imagedefinition. Die folgenden Schritte erstellen eine neue Katalog- und Imagedefinition und passen eine VM Image Builder-Vorlage an.

  1. Führen Sie die folgenden Befehle aus, um einen neuen Katalog und eine Imagedefinition mit dem erforderlichen vertrauenswürdigen Startsicherheitstyp für ein Windows 365-Image zu erstellen.

    # 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. Kopieren Sie die folgende Azure Resource Manager-Vorlage für vm Image Builder, und fügen Sie sie in eine neue Datei ein. Speichern Sie die Datei an einem Speicherort wie c:\temp\mytemplate.js ein, und schließen Sie die Datei.

    Die Vorlage definiert das angewandte Quellimage und die Anpassungen, installiert Chocolatey und Visual Studio Code und gibt den Speicherort des Images 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 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. Konfigurieren Sie die neue Vorlage mit Ihren Einstellungen, indem Sie den folgenden Code ausführen und <template-location> durch den Speicherort und Namen Ihrer Vorlagendatei ersetzen.

    $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 
    

Das Bild erstellen und anzeigen

Übermitteln Sie Ihre angepasste Vorlage an den VM Image Builder-Dienst, und erstellen Sie das Image.

  1. Führen Sie den folgenden Befehl aus, um Ihre Vorlage an den Dienst zu übermitteln. Der Befehl lädt alle abhängigen Artefakte herunter, z. B. Skripts, und speichert sie in einer Staging-Ressourcengruppe, die dem Präfix vorangestellt ist IT_.

    New-AzResourceGroupDeployment  -ResourceGroupName $imageResourceGroup  -TemplateFile $templateFilePath  -Api-Version "2020-02-14"  -imageTemplateName $imageTemplateName  -svclocation $location 
    
  2. Erstellen Sie das Bild, indem Sie die Run Aktion für die Vorlage aufrufen. Geben Sie an der Bestätigungsaufforderung Y für Yes.

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

Wichtig

Das Erstellen des Bilds und das Replizieren in zwei Regionen kann einige Zeit in Anspruch nehmen. Möglicherweise werden unterschiedliche Fortschrittsberichte zwischen PowerShell und dem Azure-Portal angezeigt. Warten Sie, bis der Prozess abgeschlossen ist, bevor Sie mit dem Erstellen einer Dev Box-Definition aus dem Image beginnen.

Abrufen von Informationen zum Bild

Führen Sie den folgenden Befehl aus, um Informationen zum neu erstellten Image abzurufen, 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 Running                                    Succeeded

Sie können den Status der Bereitstellung Ihres Images auch im Azure-Portal einsehen. Wechseln Sie zu Ihrer Galerie, um die Bilddefinition anzuzeigen.

Ein Screenshot zeigt den Status der Bereitstellung der angepassten Version des Images.

Sobald Ihr benutzerdefiniertes Bild im Katalog gespeichert ist, können Sie den Katalog so konfigurieren, dass es seine Bilder in einem Microsoft Dev Box Dev Center verwendet. Weitere Informationen finden Sie unter Konfigurieren des Azure Compute Gallery für Microsoft Dev Box.

Nachdem Sie die Katalogbilder im Dev Center zur Verfügung gestellt haben, können Sie das benutzerdefinierte Image an ein Dev Box-Projekt anfügen und es zum Erstellen von Entwicklungsfeldern verwenden. Weitere Informationen finden Sie unter Schnellstart: Microsoft Dev Box einrichten.