使用 Azure VM Image Builder 和 Microsoft 開發箱設定開發箱
在本文中,您會使用 Azure VM Image Builder,使用範本在 Microsoft 開發箱中建立自訂開發箱。 範本包含安裝 Visual Studio Code (VS Code) 的自訂步驟。
使用標準化的虛擬機 (VM) 映射可協助您在移轉至雲端時確保一致的部署。 這些映像可以包含預先定義的安全性、組態設定和必要的軟體。 設定映射管線可能非常耗時且複雜。 Azure VM 映射產生器可讓您建立映像的組態,然後服務會建置並提交至開發方塊專案,藉此簡化此程式。
手動建立自定義 VM 映像或其他工具可能很困難且不可靠。 建置在HashiCorpPacker上的 VM 映像產生器提供受控服務的優點。
若要簡化 VM 映射建立,VM 映射產生器:
- 不需要複雜的工具、程式和手動步驟。 它會抽象化這些詳細數據並隱藏 Azure 特定需求,例如將映像一般化 (Sysprep),同時允許進階使用者在必要時覆寫。
- 使用現有的映像組建管線。 可以從管線呼叫 VM Image Builder,或使用 Azure VM Image Builder 服務 DevOps 工作。
- 從各種來源收集自定義數據,因此您不需要在單一位置收集所有自定義數據。
- 與 Azure 計算資源庫整合,建立全域散發、復寫、版本設定和調整的映像管理系統。 您可以發佈與虛擬硬碟或受控映射相同的映像,而不需重建映像。
必要條件
若要布建您使用 VM Image Builder 建立的自訂映像,您需要:
- Azure PowerShell 6.0 或更新版本。 如果您沒有安裝 PowerShell,請遵循在 Windows 上安裝 Azure PowerShell 中的步驟。
- Azure 訂閱或特定資源群組的擁有者或參與者權限。
- 資源群組。
- 具有連結網路連線的開發人員中心。 如果您沒有,請遵循藉由設定網路將開發箱連線到資源中的步驟。
建立 Windows 映像並將其發佈到 Azure Compute Gallery
第一個步驟是使用 Azure VM 映射產生器與 Azure PowerShell 在 Azure 計算資源庫中建立映像,並將其散發到全球。
下列範例使用 PowerShell。 您也可以使用 Azure 命令列介面 (CLI)。
若要使用 VM Image Builder,您必須註冊該功能。
檢查您的提供者註冊。 請確定每個指令都會針對指定功能傳回
Registered
。Get-AzResourceProvider -ProviderNamespace Microsoft.VirtualMachineImages | Format-table -Property ResourceTypes,RegistrationState Get-AzResourceProvider -ProviderNamespace Microsoft.Storage | Format-table -Property ResourceTypes,RegistrationState Get-AzResourceProvider -ProviderNamespace Microsoft.Compute | Format-table -Property ResourceTypes,RegistrationState Get-AzResourceProvider -ProviderNamespace Microsoft.KeyVault | Format-table -Property ResourceTypes,RegistrationState Get-AzResourceProvider -ProviderNamespace Microsoft.Network | Format-table -Property ResourceTypes,RegistrationState
如果提供者註冊未傳回
Registered
,請執行下列命令來註冊提供者:Register-AzResourceProvider -ProviderNamespace Microsoft.VirtualMachineImages Register-AzResourceProvider -ProviderNamespace Microsoft.Storage Register-AzResourceProvider -ProviderNamespace Microsoft.Compute Register-AzResourceProvider -ProviderNamespace Microsoft.KeyVault Register-AzResourceProvider -ProviderNamespace Microsoft.Network
安裝 PowerShell 模組:
'Az.ImageBuilder', 'Az.ManagedServiceIdentity' | ForEach-Object {Install-Module -Name $_ -AllowPrerelease}
建立變數來儲存您多次使用的資訊。
- 複製下列範例程式碼。
- 將
<Resource group>
取代為您用來建立開發人員中心的資源群組。 - 在 PowerShell 中執行更新後的程式碼。
# Get existing context $currentAzContext = Get-AzContext # Get your current subscription ID $subscriptionID=$currentAzContext.Subscription.Id # Destination image resource group $imageResourceGroup="<Resource group>" # Location $location="eastus2" # Image distribution metadata reference name $runOutputName="aibCustWinManImg01" # Image template name $imageTemplateName="vscodeWinTemplate"
在 PowerShell 中執行下列程式碼,以建立使用者指派的身分識別並設定資源群組的許可權。
VM 映射產生器會使用您提供的使用者身分識別,將映像儲存在 Azure 計算資源庫中。 下列範例會建立具有特定動作的 Azure 角色定義,以用於散發映像。 然後此將角色定義指派給使用者身分識別。
# Set up role definition names, which need to be unique $timeInt=$(get-date -UFormat "%s") $imageRoleDefName="Azure Image Builder Image Def"+$timeInt $identityName="aibIdentity"+$timeInt # Add an Azure PowerShell module to support AzUserAssignedIdentity Install-Module -Name Az.ManagedServiceIdentity # Create an 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
為身分識別指派權限以散發映像。
使用此指令來下載 Azure 角色定義樣本,並使用先前指定的參數加以更新:
$aibRoleImageCreationUrl="https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json" $aibRoleImageCreationPath = "aibRoleImageCreation.json" # Download the configuration 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 計算資源庫使用 VM 映射產生器,請確定您有現有的資源庫和映像定義。 VM Image Builder 不會為您建立資源庫和映像定義。
執行下列命令來建立新的資源庫和映像定義。
此程式碼會建立具有可信啟動安全性類型的定義,並符合 Windows 365 映像需求。
# Gallery name $galleryName= "devboxGallery" # Image definition name $imageDefName ="vscodeImageDef" # Additional replication region $replRegion2="eastus" # Create the gallery New-AzGallery -GalleryName $galleryName -ResourceGroupName $imageResourceGroup -Location $location $SecurityType = @{Name='SecurityType';Value='TrustedLaunch'} $features = @($SecurityType) # Create the image definition New-AzGalleryImageDefinition -GalleryName $galleryName -ResourceGroupName $imageResourceGroup -Location $location -Name $imageDefName -OsState generalized -OsType Windows -Publisher 'myCompany' -Offer 'vscodebox' -Sku '1-0-0' -Feature $features -HyperVGeneration "V2"
建立檔案來儲存範本定義,例如 c:/temp/mytemplate.txt。
將 VM Image Builder 的下列 Azure Resource Manger 範本複製到新的範本檔案中。
此範本會指出已套用的來源映像和自訂映像。 此範本會安裝 Choco 和 VS Code,也會指出映像散發位置。
{ "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "imageTemplateName": { "type": "string" }, "api-version": { "type": "string" }, "svclocation": { "type": "string" } }, "variables": {}, "resources": [ { "name": "[parameters('imageTemplateName')]", "type": "Microsoft.VirtualMachineImages/imageTemplates", "apiVersion": "[parameters('api-version')]", "location": "[parameters('svclocation')]", "dependsOn": [], "tags": { "imagebuilderTemplate": "win11multi", "userIdentity": "enabled" }, "identity": { "type": "UserAssigned", "userAssignedIdentities": { "<imgBuilderId>": {} } }, "properties": { "buildTimeoutInMinutes": 100, "vmProfile": { "vmSize": "Standard_DS2_v2", "osDiskSizeGB": 127 }, "source": { "type": "PlatformImage", "publisher": "MicrosoftWindowsDesktop", "offer": "Windows-11", "sku": "win11-21h2-ent", "version": "latest" }, "customize": [ { "type": "PowerShell", "name": "Install Choco and Vscode", "inline": [ "Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))", "choco install -y vscode" ] } ], "distribute": [ { "type": "SharedImage", "galleryImageId": "/subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<sharedImageGalName>/images/<imageDefName>", "runOutputName": "<runOutputName>", "artifactTags": { "source": "azureVmImageBuilder", "baseosimg": "win11multi" }, "replicationRegions": [ "<region1>", "<region2>" ] } ] } } ] }
在繼續進行下一個步驟之前,請先關閉範本檔案。
使用變數設定新的範本。
將
<Template Path>
取代為樣本檔案的位置,例如c:/temp/mytemplate
。$templateFilePath = <Template Path> (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 '<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>',$galleryName| Set-Content -Path $templateFilePath (Get-Content -path $templateFilePath -Raw ) -replace '<region1>',$location | Set-Content -Path $templateFilePath (Get-Content -path $templateFilePath -Raw ) -replace '<region2>',$replRegion2 | Set-Content -Path $templateFilePath ((Get-Content -path $templateFilePath -Raw) -replace '<imgBuilderId>',$identityNameResourceId) | Set-Content -Path $templateFilePath
將您的範本提交至服務。
下列命令會下載任何相依成品 (例如指令碼),並將其儲存在暫存資源群組中。 預備資源群組以
IT_
作為前置詞。New-AzResourceGroupDeployment -ResourceGroupName $imageResourceGroup -TemplateFile $templateFilePath -Api-Version "2020-02-14" -imageTemplateName $imageTemplateName -svclocation $location
在樣本上叫用
Run
命令來建置映像:在確認執行程式的提示字元中,輸入「Yes」。
Invoke-AzResourceAction -ResourceName $imageTemplateName -ResourceGroupName $imageResourceGroup -ResourceType Microsoft.VirtualMachineImages/imageTemplates -ApiVersion "2020-02-14" -Action Run
重要
建立映像並將其同時複寫到兩個區域,可能需要一些時間。 您可能會看到 PowerShell 與 Azure 入口網站之間進行中的報告差異。 請請等候程式完成之後再開始建立開發箱定義。
取得新建置映像的相關信息,包括執行狀態和布建狀態。
Get-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup | Select-Object -Property Name, LastRunStatusRunState, LastRunStatusMessage, ProvisioningState
範例輸出:
Name LastRunStatusRunState LastRunStatusMessage ProvisioningState --------------------------------------------------------------------------------------- vscodeWinTemplate Creating
您也可以在 Azure 入口網站中檢視映像的布建狀態。 移至您的資源庫並檢視映像定義。
設定資源庫
當您的自定義映像儲存在資源庫中時,您可以將資源庫設定為使用開發人員中心中的映像。 如需詳細資訊,請參閱設定 Azure Compute Gallery。
使用自訂映像設定 Microsoft 開發箱
當開發人員中心提供資源庫映射時,您可以使用自定義映像搭配Microsoft開發人員方塊。 如需詳細資訊,請參閱快速入門:設定 Microsoft 開發箱。