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

    Screenshot that shows the provisioning state of the customized image version.

После подготовки пользовательского образа в коллекции можно настроить коллекцию для использования образов в центре разработки. Дополнительные сведения см. в статье "Настройка коллекции вычислений Azure".

Настройка Microsoft Dev Box с помощью пользовательского образа

После того как образы коллекции будут доступны в центре разработки, вы можете использовать пользовательский образ в Microsoft Dev Box. Дополнительные сведения см . в кратком руководстве по настройке Microsoft Dev Box.