Vytvoření image pro Azure Virtual Desktop pomocí VM Image Builderu a PowerShellu

Dokončeno

Tato lekce ukazuje, jak automatizovat přizpůsobení pomocí Azure VM Image Builderu. Image pak můžete distribuovat do Galerie výpočetních prostředků Azure (dříve Sdílená galerie imagí), kde ji můžete replikovat do jiných oblastí, řídit škálování a sdílet image v rámci vaší organizace i mimo ni.

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

Tato lekce je určená jako přehled procesu nebo cvičení kopírování a vložení.

Důležité informace o vytváření imagí Windows

  • Velikost virtuálního počítače: Pro Windows použijte Standard_D2_v2 nebo vyšší. 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í nebo sestavení přestane reagovat:

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

    Napří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, customization.log, je podrobný. Pokud své skripty okomentujete pomocí 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: Tvůrce imagí virtuálních počítačů očekává, že všechny skripty vrátí 0 ukončovací kód. Pokud použijete nenulový ukončovací kód, VM Image Builderu se nezdaří přizpůsobení a zastaví sestavení. 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 nejsou k dispozici žádné výzvy uživatele, že používáte správná oprávnění atd.

  • Síťová komunikace: Set-NetAdapterAdvancedProperty je nastavena v optimalizačním skriptu, ale sestavení image virtuálního počítače pomocí Image Builderu selže. Protože se síť odpojí, zakomentuje se. Tento problém prošetřujeme.

Požadavky

Musíte mít nainstalované nejnovější rutiny Azure PowerShellu. Další informace najdete v tématu PřehledAzure PowerShellu .

# 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 obrázků. Následující příkazy stáhnou a aktualizují šablonu použitím 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"
    

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

Připravili jsme šablonu, která stáhne a aktualizuje šablonu VM Image Builderu pomocí parametrů, které byly zadány dříve. Šablona nainstaluje FSLogix, optimalizace operačního systému a Microsoft Teams a na konci spustí službu Windows Update.

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

Obrázky Windows 10

Měli byste vědět o dvou klíčových typech obrazů: multi-session a single-session.

Obrázky s více relacemi jsou určeny k hromadnému použití. Tady je příklad podrobností o obrázku v Azure:

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

Jednorelací obrázky 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é image Windows 10 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


Neváhejte zobrazit šablonu .

Odeslání šablony

Šablona musí být odeslána do služby. Tímto způsobem stáhnete všechny závislé artefakty, jako jsou skripty, a ověříte, zkontrolujete oprávnění a uložíte 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

Vytvořit obraz

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

Poznámka

Příkaz nečeká, až služba Image Builderu virtuálního počítače dokončí sestavení image, 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 New-AzVM (modul Az PowerShell. Compute).