Compartilhar via


Usar o Construtor de Imagens de VM do Azure para criar uma imagem de ambiente de desenvolvimento

Este artigo mostra como usar um modelo do Construtor de Imagens de VM do Azure para criar uma imagem de VM personalizada na Galeria de Computação do Azure e distribuí-la globalmente. Em seguida, você pode usar a imagem para criar caixas de desenvolvimento no Microsoft Dev Box.

As imagens de VM padronizadas podem ajudá-lo a garantir implantações consistentes de caixa de desenvolvimento, incluindo segurança predefinida, configuração e software. Mas a configuração manual de um pipeline de imagens é demorada e complexa, e criar imagens de máquina virtual (VM) personalizadas pode ser difícil e não confiável.

O Construtor de Imagens de VM do Azure é um serviço gerenciado baseado no HashiCorp Packer que simplifica o processo de criação e criação de imagens de VM para caixas de desenvolvimento. O modelo do Construtor de Imagens neste artigo inclui etapas de personalização que instalam o Visual Studio Code e o Chocolatey.

O Construtor de Imagens da VM pode:

  • Abstrair etapas manuais ou ferramentas e processos complexos e ocultar necessidades específicas do Azure. Por exemplo, generalize uma imagem executando sysprep, mas permita que usuários avançados a substituam.
  • Trabalhe com pipelines de criação de imagem existentes. Você pode chamar o Construtor de Imagens de VM do pipeline ou usar uma tarefa de serviço do Construtor de Imagens de VM do Azure no Azure Pipelines.
  • Colete dados de personalização de várias fontes para que você não precise recolhê-los por conta própria.
  • Integre-se à Galeria de Computação do Azure para criar um sistema de gerenciamento de imagens para distribuição global, replicação, controle de versão e dimensionamento. Você pode distribuir uma imagem como um disco rígido virtual e uma imagem gerenciada sem recompilá-la.

Importante

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

Pré-requisitos

O exemplo neste artigo usa o Azure PowerShell. Você também pode usar a CLI do Azure.

Categoria Requirements
Ferramentas e permissões Um grupo de recursos do Azure para o qual você tem permissões de Proprietário ou Colaborador .
Tools Azure PowerShell 6.0 ou posterior instalado. Para obter instruções, consulte Instalar o Azure PowerShell no Windows.

Configurar ferramentas e funções

Para configurar ferramentas e funções, você:

  1. Instale os módulos necessários do Azure PowerShell.
  2. Defina variáveis para obter informações que você usa mais de uma vez.
  3. Registre os provedores de recursos necessários do Azure.
  4. Crie uma identidade de usuário para o grupo de recursos e atribua uma função que permita a distribuição de imagens.

Instalar módulos do PowerShell

Instale os módulos necessários do PowerShell executando o seguinte comando:

'Az.ImageBuilder', 'Az.ManagedServiceIdentity' | ForEach-Object {Install-Module -Name $_ -AllowPrerelease}

Responda Y aos prompts sobre repositórios não confiáveis.

Definir variáveis

Crie variáveis para armazenar informações que você usa mais de uma vez. Execute o código a seguir, substituindo <resource-group> pelo nome do grupo de recursos e <location> pela região do Azure que você deseja usar.

# Get existing context 
$currentAzContext = Get-AzContext

# Get your current subscription ID  
$subscriptionID=$currentAzContext.Subscription.Id

# Destination image resource group  
$imageResourceGroup="<resource-group>"

# Location
$location="<location>"

# Image distribution metadata reference name  
$runOutputName="aibCustWinManImg01"

# Image template name  
$imageTemplateName="vscodeWinTemplate"  

Registrar provedores de recursos do Azure

Para usar o Construtor de Imagens de VM, os seguintes provedores de recursos do Azure devem ser registrados:

  • Microsoft.VirtualMachineImages
  • Microsoft.Compute
  • Microsoft.Network
  • Microsoft.Storage
  • Microsoft.KeyVault
  • Microsoft.ContainerInstance
  1. Verifique os registros do provedor executando o seguinte comando:

      Get-AzResourceProvider -ProviderNamespace "Microsoft.VirtualMachineImages", "Microsoft.Compute", "Microsoft.Network", "Microsoft.Storage", "Microsoft.KeyVault", "Microsoft.ContainerInstance" | Format-table -Property ProviderNamespace,RegistrationState
    
  2. Se qualquer um dos registros do provedor não retornar Registered, registre o provedor executando o Register-AzResourceProvider comando. O exemplo a seguir registra o Microsoft.VirtualMachineImages provedor de recursos.

      Register-AzResourceProvider -ProviderNamespace Microsoft.VirtualMachineImages
    

Criar e atribuir uma identidade de usuário

Crie uma definição de função do Azure que permita a distribuição da imagem. Em seguida, crie uma identidade atribuída pelo usuário para o grupo de recursos e atribua a função à identidade do usuário. O Construtor de Imagens de VM usa a identidade do usuário para armazenar a imagem na Galeria de Computação do Azure.

  1. Execute o código a seguir para criar uma definição de função do Azure e uma identidade de usuário.

    # Set up a unique role definition name
    $timeInt=$(get-date -UFormat "%s") 
    $imageRoleDefName="Azure Image Builder Image Def"+$timeInt 
    $identityName="aibIdentity"+$timeInt 
    
    # 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
    
  2. Execute o código a seguir para baixar um modelo de definição de função do Azure que permite distribuir uma imagem, atualizar o modelo com seus parâmetros e atribuir a função à identidade do usuário.

    $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 de uma galeria e uma definição de imagem. As etapas a seguir criam uma nova definição de galeria e imagem e personalizam um modelo do Construtor de Imagens de VM.

  1. Execute os comandos a seguir para criar uma nova galeria e uma definição de imagem que tenha o tipo de segurança de inicialização confiável necessário para uma imagem do Windows 365.

    # Gallery name 
    $galleryName= "devboxGallery" 
    
    # Image definition name 
    $imageDefName ="vscodeImageDef" 
    
    # Second 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. Copie e cole o seguinte modelo do Azure Resource Manager para o Construtor de Imagens de VM em um novo arquivo. Salve o arquivo em um local como c:\temp\mytemplate.js e feche o arquivo.

    O modelo define a imagem de origem e as personalizações aplicadas, instala o Chocolatey e o Visual Studio Code e 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 VS Code",
                "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>"
                   ]
                }
             ]
          }
         }
       ]
      }
    
  3. Configure o novo modelo com suas configurações executando o código a seguir, substituindo <template-location> pelo local e pelo nome do arquivo de modelo.

    $templateFilePath = "<template-location>"
    
    (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 
    

Criar e exibir a imagem

Envie seu modelo personalizado para o serviço construtor de imagens da VM e crie a imagem.

  1. Execute o comando a seguir para enviar seu modelo para o serviço. O comando baixa quaisquer artefatos dependentes, como scripts, e os armazena em um grupo de recursos de preparo prefixado com IT_.

    New-AzResourceGroupDeployment  -ResourceGroupName $imageResourceGroup  -TemplateFile $templateFilePath  -Api-Version "2020-02-14"  -imageTemplateName $imageTemplateName  -svclocation $location 
    
  2. Crie a imagem invocando a ação Run no modelo. No prompt de confirmação, insira Y para Yes.

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

Importante

Criar a imagem e replicá-la em duas regiões pode levar algum tempo. Você pode ver relatórios de progresso diferentes entre o PowerShell e o portal do Azure. Aguarde até que o processo seja concluído antes de começar a criar uma definição de dev box a partir da imagem.

Obter informações sobre a imagem

Execute o comando a seguir para obter 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 Running                                    Succeeded

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

Captura de tela que mostra o estado de provisionamento da versão da imagem personalizada.

Depois que sua imagem personalizada for armazenada na galeria, você poderá configurar a galeria para usar suas imagens em um centro de desenvolvimento do Microsoft Dev Box. Para obter mais informações, consulte Configurar a Galeria de Computação do Azure para Microsoft Dev Box.

Depois de disponibilizar as imagens da galeria no centro de desenvolvimento, você pode anexar a imagem personalizada a um projeto de caixa de desenvolvimento e usá-la para criar caixas de desenvolvimento. Para obter mais informações, confira Início Rápido: Configurar o Computador de Desenvolvimento da Microsoft.