Поделиться через


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

В следующем примере используется PowerShell. Вы также можете использовать интерфейс командной строки Azure (CLI).

  1. Чтобы использовать Конструктор образов виртуальных машин, необходимо зарегистрировать функции.

    Проверьте регистрации поставщиков. Убедитесь, что каждая команда возвращается 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 
    
  2. Установите модули PowerShell:

    'Az.ImageBuilder', 'Az.ManagedServiceIdentity' | ForEach-Object {Install-Module -Name $_ -AllowPrerelease}
    
  3. Создайте переменные для хранения информации, используемой более одного раза.

    1. Скопируйте следующий пример кода.
    2. Замените <Resource group> группу ресурсов, которая использовалась для создания центра разработки.
    3. Запустите обновленный код в 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"  
    
  4. Создайте удостоверение, назначаемое пользователем, и задайте разрешения для группы ресурсов, выполнив следующий код в 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
    
  5. Назначьте разрешения для удостоверения для распространения изображений.

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

  1. Выполните следующие команды, чтобы создать новую коллекцию и определение образа.

    Этот код создает определение с доверенным типом безопасности запуска и соответствует требованиям образа 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" 
    
  2. Создайте файл для хранения определения шаблона, например c:/temp/mytemplate.txt.

  3. Скопируйте следующий шаблон 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>"
                   ]
                }
             ]
          }
         }
       ]
      }
    

    Закройте файл шаблона, прежде чем перейти к следующему шагу.

  4. Настройте новый шаблон с помощью переменных.

    Замените <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 
    
  5. Отправьте шаблон в службу.

    Следующая команда скачивает все зависимые артефакты, такие как скрипты, и сохраняет их в промежуточной группе ресурсов. Промежуточная группа ресурсов имеет префикс IT_.

    New-AzResourceGroupDeployment  -ResourceGroupName $imageResourceGroup  -TemplateFile $templateFilePath  -Api-Version "2020-02-14"  -imageTemplateName $imageTemplateName  -svclocation $location 
    
  6. Создайте образ, вызвав Run команду на шаблоне:

    В командной строке, чтобы подтвердить процесс выполнения, введите "Да".

    Invoke-AzResourceAction  -ResourceName $imageTemplateName  -ResourceGroupName $imageResourceGroup  -ResourceType Microsoft.VirtualMachineImages/imageTemplates  -ApiVersion "2020-02-14"  -Action Run
    

    Внимание

    Создание образа и репликация в обоих регионах может занять некоторое время. Вы можете увидеть разницу в отчетах о ходе выполнения между PowerShell и портал Azure. Прежде чем приступить к созданию определения поля разработки, дождитесь завершения процесса.

  7. Получение сведений о недавно созданном образе, включая состояние выполнения и состояние подготовки.

    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.