Konfigurowanie pola deweloperskiego przy użyciu narzędzia Azure VM Image Builder i usługi Microsoft Dev Box

W tym artykule użyjesz narzędzia Azure VM Image Builder do utworzenia dostosowanego pola deweloperskiego w usłudze Microsoft Dev Box przy użyciu szablonu. Szablon zawiera krok dostosowywania umożliwiający zainstalowanie programu Visual Studio Code (VS Code).

Gdy organizacja używa standardowych obrazów maszyn wirtualnych, może łatwiej przeprowadzić migrację do chmury i zapewnić spójność wdrożeń. Obrazy zwykle zawierają wstępnie zdefiniowane zabezpieczenia, ustawienia konfiguracji i wszelkie niezbędne oprogramowanie. Skonfigurowanie własnego potoku tworzenia obrazów wymaga czasu, infrastruktury i wielu innych szczegółów. Za pomocą narzędzia Azure VM Image Builder możesz utworzyć konfigurację opisową obrazu. Następnie usługa kompiluje obraz i przesyła go do projektu dev box.

Chociaż istnieje możliwość ręcznego tworzenia niestandardowych obrazów maszyn wirtualnych lub przy użyciu innych narzędzi, proces może być uciążliwy i zawodny. Konstruktor obrazów maszyny wirtualnej, który jest zbudowany na platformie HashiCorp Packer, zapewnia korzyści wynikające z usługi zarządzanej.

Aby zmniejszyć złożoność tworzenia obrazów maszyn wirtualnych, konstruktor obrazów maszyny wirtualnej:

  • Eliminuje konieczność użycia złożonych narzędzi, procesów i ręcznych kroków w celu utworzenia obrazu maszyny wirtualnej. Konstruktor obrazów maszyny wirtualnej wyodrębnia wszystkie te szczegóły i ukrywa wymagania specyficzne dla platformy Azure, takie jak konieczność uogólninia obrazu (Sysprep). Dzięki temu bardziej zaawansowani użytkownicy mogą zastąpić takie wymagania.

  • Współpracuje z istniejącymi potokami kompilacji obrazów w celu uzyskania środowiska kliknięć i przechodzenia. Konstruktor obrazów maszyny wirtualnej można wywołać z potoku lub użyć zadania DevOps usługi Azure VM Image Builder.

  • Pobiera dane dostosowywania z różnych źródeł, co eliminuje konieczność zbierania ich wszystkich z jednego miejsca.

  • Integruje się z usługą Azure Compute Gallery, która tworzy system zarządzania obrazami do dystrybucji, replikowania, przechowywania wersji i skalowania obrazów na całym świecie. Ponadto można dystrybuować ten sam obraz wynikowy co wirtualny dysk twardy lub co najmniej jeden zarządzany obraz bez konieczności ponownego kompilowania ich od podstaw.

Ważne

Usługa Microsoft Dev Box obsługuje tylko obrazy używające typu zabezpieczeń Włączone zaufane uruchamianie .

Wymagania wstępne

Aby aprowizować obraz niestandardowy utworzony za pomocą narzędzia VM Image Builder, potrzebne są następujące elementy:

Pierwszym krokiem jest użycie narzędzia Azure VM Image Builder i programu Azure PowerShell do utworzenia wersji obrazu w galerii obliczeń platformy Azure, a następnie dystrybuowania obrazu globalnie. To zadanie można również wykonać przy użyciu interfejsu wiersza polecenia platformy Azure.

  1. Aby użyć narzędzia VM Image Builder, należy zarejestrować funkcje.

    Sprawdź rejestracje dostawcy. Upewnij się, że każde polecenie jest zwracane Registered dla określonej funkcji.

       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 
    

    Jeśli rejestracje dostawcy nie zwracają Registered, zarejestruj dostawców, uruchamiając następujące polecenia:

       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. Zainstaluj moduły programu PowerShell:

    'Az.ImageBuilder', 'Az.ManagedServiceIdentity' | ForEach-Object {Install-Module -Name $_ -AllowPrerelease}
    
  3. Utwórz zmienne do przechowywania informacji używanych więcej niż raz.

    1. Skopiuj następujący przykładowy kod.
    2. Zastąp element <Resource group> grupą zasobów użytą do utworzenia centrum deweloperskiego.
    3. Uruchom zaktualizowany kod w programie 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. Utwórz tożsamość przypisaną przez użytkownika i ustaw uprawnienia w grupie zasobów, uruchamiając następujący kod w programie PowerShell.

    Konstruktor obrazów maszyny wirtualnej używa podanej tożsamości użytkownika do wstrzykiwania obrazu do galerii obliczeń platformy Azure. Poniższy przykład tworzy definicję roli platformy Azure z określonymi akcjami do dystrybucji obrazu. Definicja roli jest następnie przypisywana do tożsamości użytkownika.

    # 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. Przypisz uprawnienia do tożsamości, aby rozpowszechniać obrazy.

    Użyj tego polecenia, aby pobrać szablon definicji roli platformy Azure, a następnie zaktualizować go przy użyciu wcześniej określonych parametrów:

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

Aby używać konstruktora obrazów maszyn wirtualnych z galerią obliczeń platformy Azure, musisz mieć istniejącą galerię i definicję obrazu. Konstruktor obrazów maszyny wirtualnej nie tworzy galerii i definicji obrazu.

  1. Uruchom następujące polecenia, aby utworzyć nową galerię i definicję obrazu.

    Ten kod tworzy definicję z zaufanym typem zabezpieczeń uruchamiania i spełnia wymagania dotyczące obrazu systemu 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. Utwórz plik do przechowywania definicji szablonu, na przykład c:/temp/mytemplate.txt.

  3. Skopiuj następujący szablon usługi Azure Resource Manger dla konstruktora obrazów maszyny wirtualnej do nowego pliku szablonu.

    Ten szablon wskazuje obraz źródłowy i zastosowane dostosowania. Instaluje oprogramowanie Choco i VS Code, a także wskazuje lokalizację dystrybucji obrazów.

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

    Zamknij plik szablonu przed przejściem do następnego kroku.

  4. Skonfiguruj nowy szablon przy użyciu zmiennych.

    Zastąp <Template Path> element lokalizacją pliku szablonu, na przykład 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. Prześlij szablon do usługi.

    Następujące polecenie pobiera wszystkie zależne artefakty, takie jak skrypty, i przechowuje je w przejściowej grupie zasobów. Tymczasowa grupa zasobów ma prefiks IT_.

    New-AzResourceGroupDeployment  -ResourceGroupName $imageResourceGroup  -TemplateFile $templateFilePath  -Api-Version "2020-02-14"  -imageTemplateName $imageTemplateName  -svclocation $location 
    
  6. Skompiluj obraz, wywołując Run polecenie w szablonie:

    Po wyświetleniu monitu o potwierdzenie procesu uruchamiania wprowadź wartość Tak.

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

    Ważne

    Utworzenie obrazu i replikowanie go do obu regionów może zająć trochę czasu. Może wystąpić różnica w raportowaniu postępu między programem PowerShell i witryną Azure Portal. Przed rozpoczęciem tworzenia definicji pola deweloperskiego poczekaj na zakończenie procesu.

  7. Uzyskaj informacje o nowo utworzonym obrazie, w tym o stanie uruchomienia i stanie aprowizacji.

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

    Przykładowe dane wyjściowe:

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

    Stan aprowizacji obrazu można również wyświetlić w witrynie Azure Portal. Przejdź do galerii i wyświetl definicję obrazu.

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

Po aprowizacji obrazu niestandardowego w galerii możesz skonfigurować galerię tak, aby korzystała z obrazów w centrum deweloperów. Aby uzyskać więcej informacji, zobacz Konfigurowanie galerii obliczeń platformy Azure.

Konfigurowanie usługi Microsoft Dev Box przy użyciu obrazu niestandardowego

Po udostępnieniu obrazów galerii w centrum deweloperów możesz użyć obrazu niestandardowego z usługą Microsoft Dev Box. Aby uzyskać więcej informacji, zobacz Szybki start: Konfigurowanie usługi Microsoft Dev Box.