Настройка поля разработки с помощью построителя образов виртуальных машин Azure и Microsoft Dev Box
В этой статье вы используете конструктор образов виртуальных машин Azure для создания настраиваемого поля разработки в Microsoft Dev Box с помощью шаблона. Шаблон включает шаг настройки для установки Visual Studio Code (VS Code).
Использование стандартных образов виртуальных машин помогает обеспечить согласованные развертывания при миграции в облако. Эти образы могут включать предопределенную безопасность, параметры конфигурации и необходимое программное обеспечение. Настройка конвейера визуализации может быть трудоемкой и сложной. Построитель образов виртуальных машин Azure упрощает этот процесс, позволяя создавать конфигурацию для образа, которая затем создается и отправляется в проект разработки.
Создание пользовательских образов виртуальных машин вручную или с другими инструментами может оказаться трудным и ненадежным. Построитель образов виртуальных машин, созданный на основе HashiCorp Packer, предлагает преимущества управляемой службы.
Чтобы упростить создание образа виртуальной машины, построитель образов виртуальных машин:
- Устраняет потребность в сложных инструментах, процессах и ручных шагах. Он абстрагирует эти сведения и скрывает потребности в Azure, такие как обобщение образа (Sysprep), позволяя расширенным пользователям переопределять при необходимости.
- Работает с существующими конвейерами сборки образов. Вы можете вызвать конструктор образов виртуальных машин из конвейера или использовать задачу DevOps службы Конструктора образов виртуальных машин Azure.
- Собирает данные настройки из различных источников, поэтому вам не нужно собирать их в одном месте.
- Интегрируется с коллекцией вычислений Azure, создавая систему управления образами для глобального распространения, репликации, управления версиями и масштабирования. Вы можете распространять тот же образ, что и виртуальный жесткий диск или управляемые образы, не перестроив их.
Внимание
Microsoft Dev Box поддерживает только образы, использующие включенный доверенный запуск типа безопасности.
Необходимые компоненты
Чтобы подготовить пользовательский образ, созданный с помощью построителя образов виртуальных машин, вам потребуется:
- Azure PowerShell 6.0 или более поздней версии. Если у вас нет PowerShell, выполните действия, описанные в статье "Установка Azure PowerShell в Windows".
- Разрешения владельца или участника для подписки Azure или определенной группы ресурсов.
- Группа ресурсов.
- Центр разработки с подключенным сетевым подключением. Если у вас нет одного, выполните действия, описанные в разделе "Подключение полей разработки" к ресурсам, настроив сетевые подключения.
Создание образа Windows и его распространение в коллекцию вычислений Azure
Первым шагом является использование построителя образов виртуальных машин Azure и Azure PowerShell для создания образа в коллекции вычислений Azure и его глобального распространения.
В следующем примере используется PowerShell. Вы также можете использовать интерфейс командной строки Azure (CLI).
Чтобы использовать Конструктор образов виртуальных машин, необходимо зарегистрировать функции.
Проверьте регистрации поставщиков. Убедитесь, что каждая команда возвращается
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.
Построитель образов виртуальных машин использует удостоверение пользователя, предоставленное для хранения образа в коллекции вычислений 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, убедитесь, что у вас есть существующая коллекция и определение образа. Конструктор образов виртуальных машин автоматические не создает коллекцию и определение образа.
Выполните следующие команды, чтобы создать новую коллекцию и определение образа.
Этот код создает определение с доверенным типом безопасности запуска и соответствует требованиям образа 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.
Скопируйте следующий шаблон 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
команду на шаблоне:В командной строке, чтобы подтвердить процесс выполнения, введите "Да".
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".
Настройка Microsoft Dev Box с помощью пользовательского образа
Когда образы коллекции доступны в центре разработки, можно использовать настраиваемый образ с помощью Microsoft Dev Box. Дополнительные сведения см . в кратком руководстве по настройке Microsoft Dev Box.