Tworzenie obrazu usługi Azure Virtual Desktop przy użyciu konstruktora obrazów maszyny wirtualnej i programu PowerShell

Dotyczy: ✔️ maszyny wirtualne z systemem Windows

Z tego artykułu dowiesz się, jak utworzyć obraz usługi Azure Virtual Desktop z następującymi dostosowaniami:

W tym artykule omówiono sposób automatyzowania dostosowań przy użyciu narzędzia Azure VM Image Builder. Następnie możesz dystrybuować obraz do galerii obliczeniowej platformy Azure (wcześniej Shared Image Gallery), gdzie można replikować go do innych regionów, kontrolować skalę i udostępniać obraz w obrębie organizacji i poza nią.

Aby uprościć wdrażanie konfiguracji konstruktora obrazów maszyny wirtualnej, w tym przykładzie użyto szablonu usługi Azure Resource Manager z zagnieżdżonym w nim szablonem konstruktora obrazów maszyny wirtualnej. Takie podejście zapewnia jeszcze kilka korzyści, takich jak zmienne i dane wejściowe parametrów. Parametry można również przekazać z wiersza polecenia.

Ten artykuł jest przeznaczony jako ćwiczenie kopiowania i wklejania.

Uwaga

Skrypty służące do instalowania aplikacji znajdziesz w witrynie GitHub. Są one przeznaczone tylko do celów ilustracyjnych i testowych. Nie należy ich używać w przypadku obciążeń produkcyjnych.

Porady dotyczące tworzenia obrazów systemu Windows

  • Rozmiar maszyny wirtualnej: w przypadku systemu Windows użyj Standard_D2_v2 lub więcej. Domyślny rozmiar to Standard_D1_v2, który nie jest odpowiedni dla systemu Windows.

  • W tym artykule są używane skrypty konfiguratora programu PowerShell. Użyj następujących ustawień lub kompilacja przestanie odpowiadać:

      "runElevated": true,
      "runAsSystem": true,
    

    Przykład:

      {
          "type": "PowerShell",
          "name": "installFSLogix",
          "runElevated": true,
          "runAsSystem": true,
          "scriptUri": "https://raw.githubusercontent.com/azure/azvmimagebuilder/main/solutions/14_Building_Images_WVD/0_installConfFsLogix.ps1"
    
  • Oznacz jako komentarz kod: Dziennik kompilacji konstruktora obrazów maszyny wirtualnej, customization.log, jest pełny. Jeśli skomentujesz skrypty przy użyciu polecenia "write-host", zostaną one wysłane do dzienników, co powinno ułatwić rozwiązywanie problemów.

     write-host 'AIB Customization: Starting OS Optimizations script'
    
  • Kody zakończenia: konstruktor obrazów maszyny wirtualnej oczekuje, że wszystkie skrypty zwracają 0 kod zakończenia. Jeśli używasz kodu zakończenia innego niż zero, program VM Image Builder zakończy się niepowodzeniem dostosowywania i zatrzyma kompilację. Jeśli masz złożone skrypty, dodaj instrumentację i emituj kody zakończenia, które będą wyświetlane w pliku customization.log .

     Write-Host "Exit code: " $LASTEXITCODE
    
  • Test: przetestuj i przetestuj kod na autonomicznej maszynie wirtualnej. Upewnij się, że nie ma żadnych monitów użytkownika, że używasz odpowiednich uprawnień itd.

  • Sieć: Set-NetAdapterAdvancedProperty jest ustawiona w skrycie optymalizacji, ale kończy się niepowodzeniem kompilacji konstruktora obrazów maszyny wirtualnej. Ponieważ rozłącza ona sieć, jest oznaczona jako komentarz. Badamy ten problem.

Wymagania wstępne

Musisz mieć zainstalowane najnowsze polecenia cmdlet Azure PowerShell. Aby uzyskać więcej informacji, zobacz Omówienie Azure PowerShell.

# Check to ensure that you're registered for the providers and RegistrationState is set to 'Registered'
Get-AzResourceProvider -ProviderNamespace Microsoft.VirtualMachineImages
Get-AzResourceProvider -ProviderNamespace Microsoft.Storage 
Get-AzResourceProvider -ProviderNamespace Microsoft.Compute
Get-AzResourceProvider -ProviderNamespace Microsoft.KeyVault
Get-AzResourceProvider -ProviderNamespace Microsoft.ContainerInstance

# If they don't show as 'Registered', run the following commented-out code

## Register-AzResourceProvider -ProviderNamespace Microsoft.VirtualMachineImages
## Register-AzResourceProvider -ProviderNamespace Microsoft.Storage
## Register-AzResourceProvider -ProviderNamespace Microsoft.Compute
## Register-AzResourceProvider -ProviderNamespace Microsoft.KeyVault
## Register-AzResourceProvider -ProviderNamespace Microsoft.ContainerInstance

Konfigurowanie środowiska i zmiennych

# Step 1: Import module
Import-Module Az.Accounts

# Step 2: get existing context
$currentAzContext = Get-AzContext

# Destination image resource group
$imageResourceGroup="avdImageDemoRg"

# Location (see possible locations in the main docs)
$location="westus2"

# Your subscription. This command gets your current subscription
$subscriptionID=$currentAzContext.Subscription.Id

# Image template name
$imageTemplateName="avd10ImageTemplate01"

# Distribution properties object name (runOutput). Gives you the properties of the managed image on completion
$runOutputName="sigOutput"

# Create resource group
New-AzResourceGroup -Name $imageResourceGroup -Location $location

Uprawnienia, tożsamość użytkownika i rola

  1. Utwórz tożsamość użytkownika.

    # setup role def names, these need to be unique
    $timeInt=$(get-date -UFormat "%s")
    $imageRoleDefName="Azure Image Builder Image Def"+$timeInt
    $identityName="aibIdentity"+$timeInt
    
    ## Add Azure PowerShell modules to support AzUserAssignedIdentity and Azure VM Image Builder
    'Az.ImageBuilder', 'Az.ManagedServiceIdentity' | ForEach-Object {Install-Module -Name $_ -AllowPrerelease}
    
    # Create the 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. Przypisywanie uprawnień do tożsamości w celu dystrybucji obrazów. Następujące polecenia pobierają i aktualizują szablon przy użyciu wcześniej określonych parametrów.

    $aibRoleImageCreationUrl="https://raw.githubusercontent.com/azure/azvmimagebuilder/main/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json"
    $aibRoleImageCreationPath = "aibRoleImageCreation.json"
    
    # Download the config
    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"
    

Uwaga

Jeśli zostanie wyświetlony błąd "New-AzRoleDefinition: Przekroczono limit definicji roli. Nie można utworzyć więcej definicji ról", zobacz Rozwiązywanie problemów z kontrolą dostępu opartą na rolach na platformie Azure.

Jeśli nie masz jeszcze galerii obliczeniowej platformy Azure, musisz je utworzyć.

$sigGalleryName= "myaibsig01"
$imageDefName ="win10avd"

# Create the gallery
New-AzGallery -GalleryName $sigGalleryName -ResourceGroupName $imageResourceGroup  -Location $location

# Create the gallery definition
New-AzGalleryImageDefinition -GalleryName $sigGalleryName -ResourceGroupName $imageResourceGroup -Location $location -Name $imageDefName -OsState generalized -OsType Windows -Publisher 'myCo' -Offer 'Windows' -Sku '10avd'

Konfigurowanie szablonu konstruktora obrazów maszyny wirtualnej

W tym przykładzie przygotowaliśmy szablon, który pobiera i aktualizuje szablon konstruktora obrazów maszyny wirtualnej z określonymi wcześniej parametrami. Szablon instaluje oprogramowanie FSLogix, optymalizacje systemu operacyjnego i usługę Microsoft Teams oraz uruchamia Windows Update na końcu.

Jeśli otworzysz szablon, możesz zobaczyć we właściwości źródłowej obraz, który jest używany. W tym przykładzie użyto Windows 10 obrazu z wieloma sesjami.

obrazy Windows 10

Należy pamiętać o dwóch kluczowych typach obrazów: wielu sesjach i jednej sesji.

Obrazy z wieloma sesjami są przeznaczone do użycia w puli. Oto przykład szczegółów obrazu na platformie Azure:

"publisher": "MicrosoftWindowsDesktop",
"offer": "Windows-10",
"sku": "20h2-avd",
"version": "latest"

Obrazy z jedną sesją są przeznaczone do użytku indywidualnego. Oto przykład szczegółów obrazu na platformie Azure:

"publisher": "MicrosoftWindowsDesktop",
"offer": "Windows-10",
"sku": "19h2-ent",
"version": "latest"

Możesz również zmienić dostępne obrazy Windows 10:

Get-AzVMImageSku -Location westus2 -PublisherName MicrosoftWindowsDesktop -Offer windows-10

Pobieranie i konfigurowanie szablonu

Teraz pobierz szablon i skonfiguruj go do własnego użycia.

$templateUrl="https://raw.githubusercontent.com/azure/azvmimagebuilder/main/solutions/14_Building_Images_WVD/armTemplateWVD.json"
$templateFilePath = "armTemplateWVD.json"

Invoke-WebRequest -Uri $templateUrl -OutFile $templateFilePath -UseBasicParsing

((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 '<region>',$location) | 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>',$sigGalleryName) | Set-Content -Path $templateFilePath
((Get-Content -path $templateFilePath -Raw) -replace '<region1>',$location) | Set-Content -Path $templateFilePath
((Get-Content -path $templateFilePath -Raw) -replace '<imgBuilderId>',$identityNameResourceId) | Set-Content -Path $templateFilePath

Możesz wyświetlić szablon. Cały kod jest wyświetlany.

Przesyłanie szablonu

Szablon musi zostać przesłany do usługi. Spowoduje to pobranie wszelkich zależnych artefaktów, takich jak skrypty, walidacja, sprawdzanie uprawnień i przechowywanie ich w przejściowej grupie zasobów, która jest poprzedzona IT_.

New-AzResourceGroupDeployment -ResourceGroupName $imageResourceGroup -TemplateFile $templateFilePath -TemplateParameterObject @{"api-Version" = "2020-02-14"; "imageTemplateName" = $imageTemplateName; "svclocation" = $location}

# Optional - if you have any errors running the preceding command, run:
$getStatus=$(Get-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName)
$getStatus.ProvisioningErrorCode 
$getStatus.ProvisioningErrorMessage

Tworzenie obrazu

Start-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName -NoWait

Uwaga

Polecenie nie czeka na ukończenie kompilacji obrazu przez usługę Vm Image Builder, więc możesz wykonać zapytanie o stan, jak pokazano tutaj.

$getStatus=$(Get-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName)

# Shows all the properties
$getStatus | Format-List -Property *

# Shows the status of the build
$getStatus.LastRunStatusRunState 
$getStatus.LastRunStatusMessage
$getStatus.LastRunStatusRunSubState

Tworzenie maszyny wirtualnej

Teraz, gdy obraz został skompilowany, możesz utworzyć z niego maszynę wirtualną. Skorzystaj z przykładów z modułu New-AzVM (Az programu PowerShell). Obliczenia).

Czyszczenie zasobów

Jeśli nie potrzebujesz już zasobów utworzonych podczas tego procesu, możesz je usunąć, wykonując następujące czynności:

Ważne

Najpierw usuń szablon grupy zasobów. Jeśli usuniesz tylko grupę zasobów, tymczasowa grupa zasobów (IT_), która jest używana przez narzędzie VM Image Builder, nie zostanie wyczyszczona.

  1. Usuń szablon konstruktora obrazów maszyny wirtualnej.

    Remove-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name vd10ImageTemplate
    
  2. Usuń przypisanie roli.

    Remove-AzRoleAssignment -ObjectId $identityNamePrincipalId -RoleDefinitionName $imageRoleDefName -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    
    ## Remove the definitions
    Remove-AzRoleDefinition -Name "$identityNamePrincipalId" -Force -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    
    ## Delete the identity
    Remove-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Force
    
  3. Usuń grupę zasobów.

    Remove-AzResourceGroup $imageResourceGroup -Force
    

Następne kroki

Aby wypróbować więcej przykładów narzędzia Image Builder maszyny wirtualnej, przejdź do witryny GitHub.