Configurar um computador de desenvolvimento usando o Construtor de Imagens de VM do Azure e o Computador de Desenvolvimento da Microsoft
Neste artigo, você usará o Construtor de Imagens de VM do Azure para criar um computador de desenvolvimento personalizado no Computador de Desenvolvimento da Microsoft usando um modelo. O modelo inclui uma etapa de personalização para instalar o VS Code (Visual Studio Code).
O uso de imagens de VM (máquina virtual) padronizadas ajuda a garantir implantações consistentes à medida que você 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 Construtor de Imagens de VM do Azure simplifica esse processo permitindo que você crie uma configuração para sua imagem, que o serviço cria e envia para um projeto de computador de desenvolvimento.
Criar imagens de VM personalizadas manualmente ou com outras ferramentas pode ser difícil e não confiável. O Construtor de Imagens de VM do Azure, criado no HashiCorp Packer, oferece os benefícios de um serviço gerenciado.
Para simplificar a criação de imagens da VM, o Construtor de Imagens de VM:
- Elimina a necessidade de processos e ferramentas complexos e etapas manuais. Ele abstrai esses detalhes e oculta as necessidades específicas do Azure, como generalizar a imagem (Sysprep), permitindo que usuários avançados substituam, se necessário.
- Funciona com pipelines de build de imagem existentes. Você pode chamar o Construtor de Imagens de VM do pipeline ou usar uma tarefa de DevOps do serviço do Construtor de Imagens de VM do Azure.
- Coleta dados de personalização de várias fontes, para que você não precise coletar tudo em apenas um lugar.
- Integra-se à 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 recompilá-las.
Importante
O Computador de Desenvolvimento da Microsoft dá suporte apenas a imagens que usam o tipo de segurança Início Confiável habilitado.
Pré-requisitos
Para provisionar uma imagem personalizada que você criou usando o Construtor de Imagens da VM, você precisa de:
- Azure PowerShell 6.0 ou posterior. Se 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 anexada. Se você não tiver um, siga as etapas em Conectar computadores de desenvolvimento aos recursos configurando conexões de rede.
Criar uma imagem do Windows e distribuí-la para uma 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 Construtor de Imagens de VM, é preciso registrar os recursos.
Verifique os registros do provedor. Verifique se 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
Instalar 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 do usuário fornecida para armazenar a imagem na Galeria de Computação do Azure. O exemplo a seguir cria uma definição de regra 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
Atribuir permissões para que a identidade distribua 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"
Criar uma galeria
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ê.
Execute os comandos a seguir para criar uma definição de galeria e de imagem.
Esse código cria uma definição com o tipo de segurança de início 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 modelo do Azure Resource Manger a seguir para o Construtor de Imagens de VM em seu novo arquivo de modelo.
Esse modelo indica a imagem de origem e as personalizações aplicadas. Ele instala o Choco e o VS Code e também indica o local de distribuição de imagens.
{ "$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 o modelo para o serviço.
Os comandos a seguir baixam artefatos dependentes, como scripts, e os armazenam 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
Crie a imagem invocando o comando
Run
no modelo:No prompt para confirmar o processo de execução, insira 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 computador de desenvolvimento, aguarde até que o processo seja concluído.
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 da imagem no portal do Azure. Vá para 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, confira Galeria de Computação do Azure.
Configurar o Computador de Desenvolvimento da Microsoft com uma imagem personalizada
Quando as imagens da galeria estiverem disponíveis no centro de desenvolvimento, você poderá usar a imagem personalizada com o Computador de Desenvolvimento da Microsoft. Para obter mais informações, confira Início Rápido: Configurar o Computador de Desenvolvimento da Microsoft.