Настройка поля разработки с помощью построителя образов виртуальных машин 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, а затем глобального распространения образа. Эту задачу также можно выполнить с помощью 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.