Configurar uma caixa de desenvolvimento usando o Construtor de Imagens de VM do Azure e a Caixa de Desenvolvimento da Microsoft

Neste artigo, você usa o Construtor de Imagens de VM do Azure para criar uma caixa de desenvolvimento personalizada no Microsoft Dev Box usando um modelo. O modelo inclui uma etapa de personalização para instalar o Visual Studio Code (VS Code).

Quando sua organização usa imagens de máquina virtual (VM) padronizadas, ela pode migrar mais facilmente para a nuvem e ajudar a garantir a consistência em suas implantações. As imagens normalmente incluem segurança predefinida, definições de configuração e o software necessário. Configurar seu próprio pipeline de geração de imagens requer tempo, infraestrutura e diversos outros detalhes. Com o Construtor de Imagens de VM do Azure, você pode criar uma configuração que descreva sua imagem. Em seguida, o serviço cria a imagem e a envia para um projeto de caixa de desenvolvimento.

Embora seja possível criar imagens de VM personalizadas manualmente ou usando outras ferramentas, o processo pode ser complicado e não confiável. O Construtor de Imagens de VM do Azure, criado no HashiCorp Packer, fornece os benefícios de um serviço gerenciado.

Para reduzir a complexidade da criação de imagens de VM, o Construtor de Imagens de VM:

  • Elimina a necessidade de usar ferramentas complexas, processos e etapas manuais para criar uma imagem de VM. O Construtor de Imagens de VM abstrai todos esses detalhes e oculta requisitos específicos do Azure, como a necessidade de generalizar a imagem (Sysprep). E oferece aos usuários mais avançados a capacidade de substituir esses requisitos.

  • Funciona com pipelines de criação de imagem existentes para uma experiência de clique e uso. Você pode chamar o Construtor de Imagens de VM de seu pipeline ou usar uma tarefa de DevOps do serviço Construtor de Imagens de VM do Azure.

  • Busca dados de personalização de várias fontes, o que elimina a necessidade de coletá-los todos de um só lugar.

  • Integra-se à Galeria de Computação do Azure, que cria um sistema de gerenciamento de imagens para distribuir, replicar, controlar o controle de versão e dimensionar imagens globalmente. Além disso, você pode distribuir a mesma imagem resultante como um disco rígido virtual ou como uma ou mais imagens gerenciadas, sem ter que recriá-las do zero.

Importante

O Microsoft Dev Box oferece suporte apenas a imagens que usam o tipo de segurança Inicialização Confiável habilitado.

Pré-requisitos

Para provisionar uma imagem personalizada criada usando o VM Image Builder, você precisa:

A primeira etapa é usar o Azure VM Image Builder e o Azure PowerShell para criar uma versão de imagem na Galeria de Computação do Azure e, em seguida, distribuir a imagem globalmente. Você também pode fazer essa tarefa usando a CLI do Azure.

  1. Para usar o Construtor de Imagens de VM, é preciso registrar os recursos.

    Verifique os registros do provedor. Certifique-se de que cada comando retorne Registered para o recurso especificado.

       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 
    

    Se os registros do provedor não retornarem Registered, registre os provedores executando os seguintes comandos:

       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. Instalar módulos do PowerShell:

    'Az.ImageBuilder', 'Az.ManagedServiceIdentity' | ForEach-Object {Install-Module -Name $_ -AllowPrerelease}
    
  3. Crie variáveis para armazenar informações que você usa mais de uma vez.

    1. Copie o código de exemplo a seguir.
    2. Substitua <Resource group> pelo grupo de recursos que você usou para criar o centro de desenvolvimento.
    3. Execute o código atualizado no 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. Crie uma identidade atribuída pelo usuário e defina permissões no grupo de recursos executando o código a seguir no PowerShell.

    O Construtor de Imagens de VM usa a identidade de usuário fornecida para injetar a imagem na Galeria de Computação do Azure. O exemplo a seguir cria uma definição de função do Azure com ações específicas para distribuir a imagem. A definição de função será atribuída à identidade do usuário.

    # 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. Atribua permissões para a identidade para distribuir as imagens.

    Use este comando para baixar um modelo de definição de função do Azure e atualize-o com os parâmetros especificados anteriormente:

    $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" 
    

Para usar o Construtor de Imagens de VM com a Galeria de Computação do Azure, você precisa ter uma definição de imagem e de galeria. O Construtor de Imagens de VM cria a definição de imagem e de galeria para você.

  1. Execute os seguintes comandos para criar uma nova galeria e definição de imagem.

    Esse código cria uma definição com o tipo de segurança de inicialização confiável e atende aos requisitos de imagem do 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. Crie um arquivo para armazenar sua definição de modelo, como c:/temp/mytemplate.txt.

  3. Copie o seguinte modelo do Gerenciador de Recursos do Azure para o Construtor de Imagens de VM em seu novo arquivo de modelo.

    Este modelo indica a imagem de origem e as personalizações aplicadas. Ele instala Choco e VS Code, e também indica o local de distribuição da imagem.

    {
       "$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>"
                   ]
                }
             ]
          }
         }
       ]
      }
    

    Feche o arquivo de modelo antes de prosseguir para a próxima etapa.

  4. Configure seu novo modelo com suas variáveis.

    Substitua <Template Path> pelo local do arquivo de modelo, como 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. Envie seu modelo para o serviço.

    O comando a seguir baixa quaisquer artefatos dependentes, como scripts, e os armazena no grupo de recursos de preparo. O grupo de recursos de preparo é prefixado com IT_.

    New-AzResourceGroupDeployment  -ResourceGroupName $imageResourceGroup  -TemplateFile $templateFilePath  -Api-Version "2020-02-14"  -imageTemplateName $imageTemplateName  -svclocation $location 
    
  6. Crie a imagem invocando o Run comando no modelo:

    No prompt para confirmar o processo de execução, digite Sim.

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

    Importante

    Criar a imagem e replicá-la para ambas as regiões pode levar algum tempo. Você pode ver uma diferença nos relatórios de andamento entre o PowerShell e o portal do Azure. Antes de começar a criar uma definição de caixa de desenvolvimento, aguarde até que o processo seja concluído.

  7. Obtenha informações sobre a imagem recém-criada, incluindo o status de execução e o estado de provisionamento.

    Get-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup | Select-Object -Property Name, LastRunStatusRunState, LastRunStatusMessage, ProvisioningState 
    

    Saída de exemplo:

    Name                 LastRunStatusRunState    LastRunStatusMessage   ProvisioningState
    ---------------------------------------------------------------------------------------
    vscodeWinTemplate                                                    Creating
    

    Você também pode exibir o estado de provisionamento de sua imagem no portal do Azure. Acesse sua galeria e veja a definição da imagem.

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

Depois que sua imagem personalizada for provisionada na galeria, você poderá configurá-la para usar as imagens no centro de desenvolvimento. Para obter mais informações, confira Galeria de Computação do Azure.

Configurar o Microsoft Dev Box com uma imagem personalizada

Depois que as imagens da galeria estiverem disponíveis no centro de desenvolvimento, você poderá usar a imagem personalizada com o Microsoft Dev Box. Para obter mais informações, consulte Guia de início rápido: configurar o Microsoft Dev Box.