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).
O uso de imagens padronizadas de máquina virtual (VM) ajuda a garantir implantações consistentes à medida que migra para a nuvem. Essas imagens podem incluir segurança predefinida, definições de configuração e software necessário. A configuração de um pipeline de geração de imagens pode ser demorada e complexa. O Azure VM Image Builder simplifica esse processo permitindo que você crie uma configuração para sua imagem, que o serviço cria e envia para um projeto de caixa de desenvolvimento.
Criar imagens de VM personalizadas manualmente ou com outras ferramentas pode ser difícil e não confiável. O VM Image Builder, que é construído no HashiCorp Packer, oferece as vantagens de um serviço gerenciado.
Para simplificar a criação de imagens de VM, o Construtor de Imagens de VM:
- Elimina a necessidade de ferramentas, processos e etapas manuais complexas. Ele abstrai esses detalhes e oculta necessidades específicas do Azure, como generalizar a imagem (Sysprep), enquanto permite que usuários avançados substituam, se necessário.
- Funciona com pipelines de construção de imagem existentes. Você pode chamar o Construtor de Imagens de VM do seu pipeline ou usar uma tarefa de DevOps do serviço do Construtor de Imagens de VM do Azure.
- Reúne dados de personalização de várias fontes, para que você não precise coletar tudo em um só lugar.
- Integra-se com a Galeria de Computação do Azure, criando um sistema de gerenciamento de imagens para distribuição, replicação, controle de versão e dimensionamento globais. Você pode distribuir a mesma imagem que um disco rígido virtual ou imagens gerenciadas sem reconstruí-las.
Importante
O Microsoft Dev Box suporta apenas imagens que utilizam o tipo de segurança Trusted Launch ativado.
Pré-requisitos
Para provisionar uma imagem personalizada que você criou usando o VM Image Builder, você precisa:
- Azure PowerShell 6.0 ou posterior. Se você não tiver o PowerShell instalado, siga as etapas em Instalar o Azure PowerShell no Windows.
- Permissões de Proprietário ou Colaborador em uma assinatura do Azure ou em um grupo de recursos específico.
- Um grupo de recursos.
- Um centro de desenvolvimento com uma conexão de rede conectada. Se você não tiver uma, siga as etapas em Conectar caixas de desenvolvimento a recursos configurando conexões de rede.
Criar uma imagem do Windows e distribuí-la para a Galeria de Computação do Azure
A primeira etapa é usar o Construtor de Imagens de VM do Azure e o Azure PowerShell para criar uma imagem na Galeria de Computação do Azure e distribuí-la globalmente.
O exemplo a seguir usa o PowerShell. Você também pode usar a CLI (Interface de Linha de Comando) do Azure.
Para usar o VM Image Builder, você precisa registrar os recursos.
Verifique os registos do seu fornecedor. Certifique-se de que cada comando retorna
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
Instale os módulos do PowerShell:
'Az.ImageBuilder', 'Az.ManagedServiceIdentity' | ForEach-Object {Install-Module -Name $_ -AllowPrerelease}
Crie variáveis para armazenar informações que você usa mais de uma vez.
- Copie o código de exemplo a seguir.
- Substitua
<Resource group>
pelo grupo de recursos que você usou para criar o centro de desenvolvimento. - 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"
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 armazenar 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 é então 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
Atribua permissões para a identidade distribuir as imagens.
Use este comando para baixar um modelo de definição de função do Azure e atualizá-lo 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"
Crie uma galeria
Para utilizar o Construtor de Imagens de VM com a Galeria de Computação do Azure, certifique-se de que tem uma galeria e uma definição de imagem existentes. O VM Image Builder não cria a galeria e a definição de imagem para você.
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"
Crie um arquivo para armazenar sua definição de modelo, como c:/temp/mytemplate.txt.
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.
Configure seu novo modelo com suas variáveis.
Substitua
<Template Path>
pelo local do arquivo de modelo, comoc:/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
Envie seu modelo para o serviço.
O comando a seguir baixa todos os artefatos dependentes, como scripts, e os armazena no grupo de recursos de preparação. O grupo de recursos de preparo é prefixado com
IT_
.New-AzResourceGroupDeployment -ResourceGroupName $imageResourceGroup -TemplateFile $templateFilePath -Api-Version "2020-02-14" -imageTemplateName $imageTemplateName -svclocation $location
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 no relatório de progresso 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.
Obtenha informações sobre a imagem recém-criada, incluindo o status da 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 da sua imagem no portal do Azure. Aceda à sua galeria e veja a definição da imagem.
Configurar a galeria
Quando sua imagem personalizada é armazenada na galeria, você pode configurar a galeria para usar as imagens no centro de desenvolvimento. Para obter mais informações, consulte Configurar a Galeria de Computação do Azure.
Configurar o Microsoft Dev Box com uma imagem personalizada
Quando as imagens da galeria estão disponíveis no centro de desenvolvimento, você pode 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.