Sdílet prostřednictvím


Vytvoření image služby Azure Virtual Desktop pomocí nástroje VM Image Builder a PowerShellu

Platí pro: ✔️ Virtuální počítače s Windows

V tomto článku se dozvíte, jak vytvořit image služby Azure Virtual Desktop pomocí těchto přizpůsobení:

Tento článek popisuje, jak automatizovat vlastní nastavení pomocí Azure VM Image Builderu. Image pak můžete distribuovat do služby Azure Compute Gallery (dříve Shared Image Gallery), kde ji můžete replikovat do jiných oblastí, řídit škálování a sdílet image ve vaší organizaci i mimo ni.

Pro zjednodušení nasazení konfigurace Image Builderu virtuálního počítače používá náš příklad šablonu Azure Resource Manager s vnořenou šablonou Image Builderu virtuálního počítače. Tento přístup nabízí několik dalších výhod, jako jsou proměnné a vstupy parametrů. Parametry můžete předat také z příkazového řádku.

Tento článek je určený jako cvičení kopírování a vkládání.

Poznámka

Najdete skripty pro instalaci aplikací na GitHubu. Slouží jenom pro ilustraci a testování. Nepoužívejte je pro produkční úlohy.

Tipy pro vytváření imagí Windows

  • Velikost virtuálního počítače: Pro Windows použijte nebo vyšší Standard_D2_v2 . Výchozí velikost je Standard_D1_v2, která není vhodná pro Windows.

  • Tento článek používá skripty úpravce PowerShellu. Použijte následující nastavení, jinak sestavení přestane reagovat:

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

    Příklad:

      {
          "type": "PowerShell",
          "name": "installFSLogix",
          "runElevated": true,
          "runAsSystem": true,
          "scriptUri": "https://raw.githubusercontent.com/azure/azvmimagebuilder/main/solutions/14_Building_Images_WVD/0_installConfFsLogix.ps1"
    
  • Okomentujte svůj kód: Protokol sestavení nástroje VM Image Builder, custom.log, je podrobný. Pokud skripty okomentujete pomocí příkazu write-host, odešlou se do protokolů, což by mělo usnadnit řešení potíží.

     write-host 'AIB Customization: Starting OS Optimizations script'
    
  • Ukončovací kódy: VM Image Builder očekává, že všechny skripty vrátí ukončovací 0 kód. Pokud použijete nenulový ukončovací kód, nástroj VM Image Builder vlastní nastavení selže a sestavení zastaví. Pokud máte složité skripty, přidejte instrumentaci a vygenerujte ukončovací kódy, které se zobrazí v souboru customization.log .

     Write-Host "Exit code: " $LASTEXITCODE
    
  • Test: Otestujte a znovu otestujte kód na samostatném virtuálním počítači. Ujistěte se, že se nezobrazují žádné výzvy uživatelů, že používáte správná oprávnění atd.

  • Sítě: Set-NetAdapterAdvancedProperty Je nastavený ve skriptu optimalizace, ale selže sestavení Image Builderu virtuálního počítače. Protože síť odpojí, je zakomentovaná. Tento problém prověřujeme.

Požadavky

Musíte mít nainstalované nejnovější rutiny Azure PowerShell. Další informace najdete v tématu Přehled 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

Nastavení prostředí a proměnných

# 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

Oprávnění, identita uživatele a role

  1. Vytvořte identitu uživatele.

    # 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. Přiřaďte identitě oprávnění k distribuci imagí. Následující příkazy stáhněte a aktualizujte šablonu pomocí dříve zadaných parametrů.

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

Poznámka

Pokud se zobrazí chyba New-AzRoleDefinition: Překročení limitu definic rolí. Další definice rolí se nedají vytvořit," viz Řešení potíží s Azure RBAC (řízení přístupu na základě role).

Pokud ještě nemáte Galerii výpočetních prostředků Azure, musíte si ji vytvořit.

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

Konfigurace šablony Image Builderu virtuálního počítače

V tomto příkladu jsme připravili šablonu, která stáhne a aktualizuje šablonu Image Builderu virtuálního počítače pomocí dříve zadaných parametrů. Šablona nainstaluje FSLogix, optimalizace operačního systému a Microsoft Teams a na konci se spustí služba Windows Update.

Pokud šablonu otevřete, uvidíte ve vlastnosti source obrázek, který se používá. V tomto příkladu používá image Windows 10 více relací.

Windows 10 obrázků

Měli byste znát dva klíčové typy imagí: více relací a jednu relaci.

Image s více relacemi jsou určené pro použití ve fondu. Tady je příklad podrobností o obrázku v Azure:

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

Obrázky v jedné relaci jsou určené pro individuální použití. Tady je příklad podrobností o obrázku v Azure:

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

Můžete také změnit, které Windows 10 image jsou k dispozici:

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

Stažení a konfigurace šablony

Teď si stáhněte šablonu a nakonfigurujte ji pro vlastní použití.

$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

Nebojte se zobrazit šablonu. Veškerý kód je možné zobrazit.

Odeslání šablony

Šablona musí být odeslána službě. Tím stáhne všechny závislé artefakty, jako jsou skripty, a ověří, zkontroluje oprávnění a uloží je do přípravné skupiny prostředků, která má předponu 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

Sestavení image

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

Poznámka

Příkaz nečeká na dokončení sestavení image službou VM Image Builder, takže se můžete dotazovat na stav, jak je znázorněno tady.

$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

Vytvoření virtuálního počítače

Teď, když je image sestavená, můžete z ní vytvořit virtuální počítač. Použijte příklady z modulu New-AzVM (Az PowerShell. Compute).

Vyčištění prostředků

Pokud už prostředky vytvořené během tohoto procesu nepotřebujete, můžete je odstranit následujícím způsobem:

Důležité

Nejprve odstraňte šablonu skupiny prostředků. Pokud odstraníte jenom skupinu prostředků, pracovní skupina prostředků (IT_), kterou používá nástroj VM Image Builder, se nevyčistí.

  1. Odeberte šablonu Image Builderu virtuálního počítače.

    Remove-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name vd10ImageTemplate
    
  2. Odstraňte přiřazení role.

    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. Odstraňte skupinu prostředků.

    Remove-AzResourceGroup $imageResourceGroup -Force
    

Další kroky

Pokud chcete vyzkoušet další příklady nástroje VM Image Builder, přejděte na GitHub.