使用 VM Image Builder 和 PowerShell,建立 Azure 虛擬桌面映像
本單元會展示如何使用 Azure VM Image Builder 將自訂自動化。 然後,您可以將映像發佈至 Azure Compute Gallery (先前為共用映像庫),在此處可將映像複製到其他區域、控制規模並在組織內外共用映像。
為了簡化 VM Image Builder 設定的部署,我們的範例會使用 Azure Resource Manager 範本,其中有巢狀 VM Image Builder 範本。 此方法能提供更多優點,例如變數和參數輸入。 您也可以從命令列傳遞參數。
本單元旨在作為程序或複製和貼上練習的概觀。
建置 Windows 映像的考量
VM 大小:針對 Windows,請使用 Standard_D2_v2 或更新版本。 預設大小為 Standard_D1_v2,不適用於 Windows。
本文使用 PowerShell 自訂工具指令碼。 請使用下列設定,否則組建將會停止回應:
"runElevated": true, "runAsSystem": true,
例如:
{ "type": "PowerShell", "name": "installFSLogix", "runElevated": true, "runAsSystem": true, "scriptUri": "https://raw.githubusercontent.com/azure/azvmimagebuilder/main/solutions/14_Building_Images_WVD/0_installConfFsLogix.ps1"
為您的程式碼註解:VM Image Builder 組建記錄檔 customization.log 為詳細資訊。 如果您使用 'write-host' 為指令碼註解,這些指令碼將會傳送至記錄檔,此舉會使疑難排解作業更加輕鬆。
write-host 'AIB Customization: Starting OS Optimizations script'
結束代碼:VM Image Builder 預期所有指令碼都會傳回 0 結束代碼。 如果您使用非零結束代碼,VM Image Builder 會無法自訂並停止組建。 如果您有複雜指令碼,請新增檢測設備並發出結束代碼,其會顯示在 customization.log 檔案中。
Write-Host "Exit code: " $LASTEXITCODE
測試:在獨立 VM 上測試及重新測試程式碼。 請確認並無使用者提示,您使用的是正確的權限等等。
網路:
Set-NetAdapterAdvancedProperty
於最佳化指令碼中設定,但在 VM Image Builder 組建失敗。 由於中斷網路連線,其已註解化。我們正在調查此問題。
必要條件
您必須安裝最新的 Azure PowerShell Cmdlet。 如需詳細資訊,請參閱 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
設定環境及變數
# 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
權限、使用者身分識別和角色
建立使用者身分識別。
# 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
向身分識別指派權限以散發映像。 下列命令會下載範本,並使用先前指定的參數進行更新。
$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"
建立 Azure Compute Gallery
若您並無 Azure Compute Gallery,則須建立一個。
$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'
設定 VM Image Builder 範本
我們準備了一個範本,此範本使用先前指定的參數下載和更新 VM Image Builder 範本。 此範本會安裝 FSLogix、作業系統最佳化和 Microsoft Teams,並在結束時執行 Windows Update。
如果您開啟範本,就能在來源屬性中看到正在使用的映像。 在此範例中,會使用 Windows 10 多工作階段映像。
Windows 10 映像
您應該注意兩種主要映像類型:多工作階段和單一工作階段。
多工作階段映像適用於集區式使用方式。 以下為 Azure 中映像詳細資料的範例:
"publisher": "MicrosoftWindowsDesktop",
"offer": "Windows-10",
"sku": "20h2-avd",
"version": "latest"
單一工作階段映像適用於個別使用方式。 以下為 Azure 中映像詳細資料的範例:
"publisher": "MicrosoftWindowsDesktop",
"offer": "Windows-10",
"sku": "19h2-ent",
"version": "latest"
您也可以變更可用的 Windows 10 映像:
Get-AzVMImageSku -Location westus2 -PublisherName MicrosoftWindowsDesktop -Offer windows-10
下載並設定範本
現在,請下載範本,並按您自身用途進行設定。
$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
您可以隨意檢視範本。
提交範本
您必須將範本提交至服務。 這麼做會下載任何相依成品 (例如指令碼),以及驗證、檢查權限,並將其儲存在開頭為 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
建置映像
Start-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName -NoWait
注意
命令不會等候 VM Image Builder 服務完成映像組建,因此您可以查詢此處所顯示的狀態。
$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
建立 VM
現在已組建映像,您可以從中組建 VM。 使用 New-AzVM (Az PowerShell module.Compute) 中的範例。