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 przy użyciu następujących dostosowań:
- Konfiguracja programu FSLogix
- Optymalizacja usługi Azure Virtual Desktop
- Instalacja usługi Microsoft Teams
- Konfigurator ponownego uruchamiania systemu Windows
- Konfigurator usługi Windows Update
W tym artykule omówiono sposób automatyzowania dostosowań przy użyciu narzędzia Azure VM Image Builder. Następnie możesz rozpowszechnić obraz w galerii obliczeniowej platformy Azure (wcześniej udostępnionej galerii obrazów), gdzie można replikować go do innych regionów, kontrolować skalę i udostępniać obraz w organizacji i poza nią.
Aby uprościć wdrażanie konfiguracji narzędzia Image Builder 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 kilka dodatkowych 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 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 nowszego. Domyślny rozmiar toStandard_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,
Na 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, konstruktor obrazów maszyny wirtualnej 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 ustawiana w skrygcie optymalizacji, ale kończy się niepowodzeniem kompilacji konstruktora obrazów maszyny wirtualnej. Ponieważ rozłącza sieć, jest ona oznaczona jako komentarz. Badamy ten problem.
Wymagania wstępne
Musisz mieć zainstalowane najnowsze polecenia cmdlet programu Azure PowerShell. Aby uzyskać więcej informacji, zobacz Omówienie programu 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
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
Przypisz uprawnienia do tożsamości, aby dystrybuować obrazy. 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.
Tworzenie galerii zasobów obliczeniowych platformy Azure
Jeśli nie masz jeszcze galerii zasobów obliczeniowych 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, a na końcu uruchamia usługę Windows Update.
Jeśli otworzysz szablon, możesz zobaczyć we właściwości źródłowej używany obraz. W tym przykładzie użyto obrazu z wieloma sesjami systemu Windows 10.
Obrazy systemu Windows 10
Należy pamiętać o dwóch kluczowych typach obrazów: wielu sesjach i jednej sesji.
Obrazy wielosesyjne 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 indywidualnego użycia. 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 systemu 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 i zweryfikowanie, sprawdzenie uprawnień i zapisanie 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 skompilować maszynę wirtualną. Skorzystaj z przykładów z modułu New-AzVM (Az PowerShell). Obliczenia).
Oczyszczanie 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.
Usuń szablon konstruktora obrazów maszyny wirtualnej.
Remove-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name vd10ImageTemplate
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
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.