Criar uma VM do Windows com o Construtor de Imagens de VM usando o PowerShell
Aplica-se a: ✔️ VMs do Windows
Este artigo demonstra como criar uma imagem personalizada de VM do Windows usando o módulo PowerShell do Azure VM Image Builder.
Pré-requisitos
Se não tiver uma subscrição do Azure, crie uma conta gratuita antes de começar.
Se você optar por usar o PowerShell localmente, este artigo exigirá que você instale o módulo do Azure PowerShell e se conecte à sua conta do Azure usando o cmdlet Connect-AzAccount . Para obter mais informações, consulte Instalar o Azure PowerShell.
Algumas das etapas exigem cmdlets do módulo Az.ImageBuilder . Instale separadamente usando o seguinte comando.
Install-Module -Name Az.ImageBuilder
Azure Cloud Shell
O Azure aloja o Azure Cloud Shell, um ambiente de shell interativo que pode utilizar através do seu browser. Pode utilizar o Bash ou o PowerShell com o Cloud Shell para trabalhar com os serviços do Azure. Você pode usar os comandos pré-instalados do Cloud Shell para executar o código neste artigo, sem precisar instalar nada em seu ambiente local.
Para iniciar o Azure Cloud Shell:
Opção | Exemplo/Ligação |
---|---|
Selecione Experimentar no canto superior direito de um código ou bloco de comandos. Selecionar Experimentar não copia automaticamente o código ou comando para o Cloud Shell. | |
Aceda a https://shell.azure.com ou selecione o botão Iniciar Cloud Shell para abrir o Cloud Shell no browser. | |
Selecione o botão Cloud Shell na barra de menus, na parte direita do portal do Azure. |
Para usar o Azure Cloud Shell:
Inicie o Cloud Shell.
Selecione o botão Copiar em um bloco de código (ou bloco de comando) para copiar o código ou comando.
Cole o código ou comando na sessão do Cloud Shell selecionando Ctrl+Shift+V no Windows e Linux ou selecionando Cmd+Shift+V no macOS.
Selecione Enter para executar o código ou comando.
Se você tiver várias assinaturas do Azure, escolha a assinatura apropriada na qual os recursos devem ser cobrados. Selecione uma assinatura específica usando o cmdlet Set-AzContext .
Set-AzContext -SubscriptionId 00000000-0000-0000-0000-000000000000
Registar fornecedores
Se ainda não tiver feito isso, registre os seguintes provedores de recursos para usar com sua assinatura do Azure:
- Microsoft.Compute
- Microsoft.KeyVault
- Microsoft.Storage
- Microsoft.Network
- Microsoft.VirtualMachineImages
- Microsoft.ManagedIdentity
- Microsoft.ContainerInstance
Get-AzResourceProvider -ProviderNamespace Microsoft.Compute, Microsoft.KeyVault, Microsoft.Storage, Microsoft.VirtualMachineImages, Microsoft.Network, Microsoft.ManagedIdentity |
Where-Object RegistrationState -ne Registered |
Register-AzResourceProvider
Definir variáveis
Como você usará algumas informações repetidamente, crie algumas variáveis para armazenar essas informações:
# Destination image resource group name
$imageResourceGroup = 'myWinImgBuilderRG'
# Azure region
$location = 'WestUS2'
# Name of the image to be created
$imageTemplateName = 'myWinImage'
# Distribution properties of the managed image upon completion
$runOutputName = 'myDistResults'
Crie uma variável para sua ID de assinatura do Azure. Para confirmar se a variável contém sua ID de subscriptionID
assinatura, você pode executar a segunda linha no exemplo a seguir:
# Your Azure Subscription ID
$subscriptionID = (Get-AzContext).Subscription.Id
Write-Output $subscriptionID
Criar um grupo de recursos
Crie um grupo de recursos do Azure usando o cmdlet New-AzResourceGroup. Um grupo de recursos é um contentor lógico no qual os recursos do Azure são implementados e geridos como um grupo.
O exemplo a seguir cria um grupo de recursos baseado no nome da $imageResourceGroup
variável na região especificada na $location
variável. Esse grupo de recursos é usado para armazenar o artefato de modelo de configuração de imagem e a imagem.
New-AzResourceGroup -Name $imageResourceGroup -Location $location
Criar uma identidade de usuário e definir permissões de função
Conceda permissões ao construtor de imagens do Azure para criar imagens no grupo de recursos especificado usando o exemplo a seguir. Sem essa permissão, o processo de compilação da imagem não será concluído com êxito.
Crie variáveis para a definição de função e nomes de identidade. Estes valores devem ser únicos.
[int]$timeInt = $(Get-Date -UFormat '%s') $imageRoleDefName = "Azure Image Builder Image Def $timeInt" $identityName = "myIdentity$timeInt"
Crie uma identidade de usuário.
New-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Location $location
Armazene o recurso de identidade e os IDs principais em variáveis.
$identityNameResourceId = (Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).Id $identityNamePrincipalId = (Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).PrincipalId
Atribuir permissões para a identidade distribuir as imagens
Baixe o arquivo de configuração JSON e modifique-o com base nas configurações definidas neste artigo.
$myRoleImageCreationUrl = 'https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json' $myRoleImageCreationPath = "myRoleImageCreation.json" Invoke-WebRequest -Uri $myRoleImageCreationUrl -OutFile $myRoleImageCreationPath -UseBasicParsing $Content = Get-Content -Path $myRoleImageCreationPath -Raw $Content = $Content -replace '<subscriptionID>', $subscriptionID $Content = $Content -replace '<rgName>', $imageResourceGroup $Content = $Content -replace 'Azure Image Builder Service Image Creation Role', $imageRoleDefName $Content | Out-File -FilePath $myRoleImageCreationPath -Force
Crie a definição de função.
New-AzRoleDefinition -InputFile $myRoleImageCreationPath
Conceda a definição de função à entidade de serviço do Construtor de Imagens de VM.
$RoleAssignParams = @{ ObjectId = $identityNamePrincipalId RoleDefinitionName = $imageRoleDefName Scope = "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup" } New-AzRoleAssignment @RoleAssignParams
Nota
Se você receber o erro "New-AzRoleDefinition: limite de definição de função excedido. Não é possível criar mais definições de função", consulte Solucionar problemas do RBAC do Azure (controle de acesso baseado em função).
Criar uma Galeria de Computação do Azure
Crie a galeria.
$myGalleryName = 'myImageGallery' $imageDefName = 'winSvrImages' New-AzGallery -GalleryName $myGalleryName -ResourceGroupName $imageResourceGroup -Location $location
Crie uma definição de galeria.
$GalleryParams = @{ GalleryName = $myGalleryName ResourceGroupName = $imageResourceGroup Location = $location Name = $imageDefName OsState = 'generalized' OsType = 'Windows' Publisher = 'myCo' Offer = 'Windows' Sku = 'Win2019' } New-AzGalleryImageDefinition @GalleryParams
Criar uma imagem
Crie um objeto de origem do Construtor de Imagens de VM. Para obter valores de parâmetros válidos, consulte Localizar imagens de VM do Windows no Azure Marketplace com o Azure PowerShell.
$SrcObjParams = @{ PlatformImageSource = $true Publisher = 'MicrosoftWindowsServer' Offer = 'WindowsServer' Sku = '2019-Datacenter' Version = 'latest' } $srcPlatform = New-AzImageBuilderTemplateSourceObject @SrcObjParams
Crie um objeto de distribuidor do VM Image Builder.
$disObjParams = @{ SharedImageDistributor = $true ArtifactTag = @{tag='dis-share'} GalleryImageId = "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup/providers/Microsoft.Compute/galleries/$myGalleryName/images/$imageDefName" ReplicationRegion = $location RunOutputName = $runOutputName ExcludeFromLatest = $false } $disSharedImg = New-AzImageBuilderTemplateDistributorObject @disObjParams
Crie um objeto de personalização do Construtor de Imagens de VM.
$ImgCustomParams01 = @{ PowerShellCustomizer = $true Name = 'settingUpMgmtAgtPath' RunElevated = $false Inline = @("mkdir c:\\buildActions", "mkdir c:\\buildArtifacts", "echo Azure-Image-Builder-Was-Here > c:\\buildActions\\buildActionsOutput.txt") } $Customizer01 = New-AzImageBuilderTemplateCustomizerObject @ImgCustomParams01
Crie um segundo objeto de personalização do Construtor de Imagens de VM.
$ImgCustomParams02 = @{ FileCustomizer = $true Name = 'downloadBuildArtifacts' Destination = 'c:\\buildArtifacts\\index.html' SourceUri = 'https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/exampleArtifacts/buildArtifacts/index.html' } $Customizer02 = New-AzImageBuilderTemplateCustomizerObject @ImgCustomParams02
Crie um modelo do Construtor de Imagens de VM.
$ImgTemplateParams = @{ ImageTemplateName = $imageTemplateName ResourceGroupName = $imageResourceGroup Source = $srcPlatform Distribute = $disSharedImg Customize = $Customizer01, $Customizer02 Location = $location UserAssignedIdentityId = $identityNameResourceId } New-AzImageBuilderTemplate @ImgTemplateParams
Quando o modelo é criado, uma mensagem é retornada e um modelo de configuração do Construtor de Imagens de VM é criado no $imageResourceGroup
.
Para determinar se o processo de criação do modelo foi bem-sucedido, use o seguinte exemplo:
Get-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup |
Select-Object -Property Name, LastRunStatusRunState, LastRunStatusMessage, ProvisioningState
Em segundo plano, o Construtor de Imagens de VM também cria um grupo de recursos de preparo em sua assinatura. Este grupo de recursos é usado para a compilação de imagem. Está no formato IT_<DestinationResourceGroup>_<TemplateName>
.
Aviso
Não exclua o grupo de recursos de preparo diretamente. Para fazer com que o grupo de recursos de preparo seja excluído, exclua o artefato do modelo de imagem.
Se o serviço relatar uma falha quando o modelo de configuração de imagem for enviado, faça o seguinte:
Consulte Solucionar problemas de falhas do Construtor de Imagens de VM do Azure.
Antes de tentar enviar novamente o modelo, exclua-o seguindo este exemplo:
Remove-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup
Iniciar a construção da imagem
Envie a configuração da imagem para o serviço VM Image Builder executando o seguinte comando:
Start-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName
Aguarde até que o processo de construção da imagem termine, o que pode levar até uma hora.
Se você encontrar erros, revise Solucionar problemas de falhas do Construtor de Imagens de VM do Azure.
Criar uma VM
Armazene as credenciais de login da VM em uma variável. A senha deve ser complexa.
$Cred = Get-Credential
Crie a VM usando a imagem que você criou.
$ArtifactId = (Get-AzImageBuilderTemplateRunOutput -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup).ArtifactId New-AzVM -ResourceGroupName $imageResourceGroup -Image $ArtifactId -Name myWinVM01 -Credential $Cred
Verificar as personalizações
Crie uma conexão de Área de Trabalho Remota para a VM usando o nome de usuário e a senha que você definiu quando criou a VM.
Dentro da VM, abra o PowerShell e execute
Get-Content
, conforme mostrado no exemplo a seguir:Get-Content -Path C:\buildActions\buildActionsOutput.txt
A saída é baseada no conteúdo do arquivo que você criou durante o processo de personalização da imagem.
Azure-Image-Builder-Was-Here
Na mesma sessão do PowerShell, verifique se a segunda personalização foi concluída com êxito verificando a presença do
c:\buildArtifacts\index.html
, conforme mostrado no exemplo a seguir:Get-ChildItem c:\buildArtifacts\
O resultado deve ser uma listagem de diretório mostrando que o arquivo foi baixado durante o processo de personalização da imagem.
Directory: C:\buildArtifacts Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 29/01/2021 10:04 276 index.html
Limpar os recursos
Se você não precisar mais dos recursos que foram criados durante esse processo, poderá excluí-los fazendo o seguinte:
Exclua o modelo do Construtor de Imagens da VM.
Remove-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName
Exclua o grupo de recursos de imagem.
Atenção
O exemplo a seguir exclui o grupo de recursos especificado e todos os recursos que ele contém. Se existirem recursos fora do escopo deste artigo no grupo de recursos, eles também serão excluídos.
Remove-AzResourceGroup -Name $imageResourceGroup
Próximos passos
Para saber mais sobre os componentes do arquivo JSON que este artigo usa, consulte a referência de modelo do VM Image Builder.