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 de VM do Windows personalizada usando o módulo PowerShell do Construtor de Imagens de VM do Azure.
Pré-requisitos
Se você não tiver uma assinatura 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 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 os cmdlets do módulo Az.ImageBuilder. Instale separadamente usando o seguinte comando.
Install-Module -Name Az.ImageBuilder
Azure Cloud Shell
O Azure hospeda o Azure Cloud Shell, um ambiente de shell interativo que pode ser usado por meio do navegador. É possível usar o bash ou o PowerShell com o Cloud Shell para trabalhar com os serviços do Azure. É possível usar os comandos pré-instalados do Cloud Shell para executar o código neste artigo, sem precisar instalar nada no seu ambiente local.
Para iniciar o Azure Cloud Shell:
Opção | Exemplo/Link |
---|---|
Selecione Experimentar no canto superior direito de um bloco de código ou de comando. Selecionar Experimentar não copia automaticamente o código nem o comando para o Cloud Shell. | |
Acesse https://shell.azure.com ou selecione o botão Iniciar o Cloud Shell para abri-lo no navegador. | |
Selecione o botão Cloud Shell na barra de menus no canto superior direito 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 o comando.
Cole o código ou comando na sessão do Cloud Shell selecionando Ctrl+Shift+V no Windows e no Linux, ou selecionando Cmd+Shift+V no macOS.
Selecione Enter para executar o código ou o comando.
Se tiver várias assinaturas do Azure, escolha a que for adequada para cobrança do recurso. Selecione uma assinatura específica usando o cmdlet Set-AzContext.
Set-AzContext -SubscriptionId 00000000-0000-0000-0000-000000000000
Registrar provedores
Se você ainda não fez isso, registre os seguintes provedores de recursos a serem usados 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 armazená-las:
# 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 a ID da assinatura do Azure. Para confirmar que a variável subscriptionID
contém sua ID de 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 contêiner lógico no qual os recursos do Azure são implantados e gerenciados como um grupo.
O exemplo a seguir cria um grupo de recursos com base no nome existente na variável $imageResourceGroup
na região especificada na variável $location
. Esse grupo de recursos é usado para armazenar o artefato do 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 do 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. Esses valores devem ser exclusivos.
[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 as IDs de entidade em variáveis.
$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
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 da 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
Observação
Se você vir este 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 de 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 informar-se sobre valores de parâmetro 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 Construtor de Imagens de VM.
$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
Após o modelo ser criado, é retornada uma mensagem e um modelo de configuração do Construtor de Imagens de VM é criado em $imageResourceGroup
.
Para determinar se o processo de criação de modelo foi bem-sucedido, você pode usar o exemplo a seguir:
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 na sua assinatura. Esse grupo de recursos é usado para o build da imagem. O formato é IT_<DestinationResourceGroup>_<TemplateName>
.
Aviso
Não exclua o grupo de recursos de preparo diretamente. Para que o grupo de recursos de preparo seja excluído, exclua o artefato do modelo de imagem.
Se o serviço relatar falha quando o modelo de configuração de imagem for enviado, siga este procedimento:
Consulte Solucionar problemas do Construtor de Imagens de VM do Azure.
Antes de tentar reenviar o modelo, exclua-o seguindo este exemplo:
Remove-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup
Inicie o build da imagem
Envie a configuração de imagem ao serviço Construtor de Imagens de VM executando o seguinte comando:
Start-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName
Aguarde a conclusão do processo de construção da imagem, o que pode levar até uma hora.
Se você encontrar erros, consulte Solucionar problemas do Construtor de Imagens de VM do Azure.
Criar uma VM
Armazene as credenciais de logon 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 com a VM usando o nome de usuário e a senha que você definiu quando criou a VM.
Na VM, abra o PowerShell e execute
Get-Content
conforme mostrado no exemplo a seguir:Get-Content -Path C:\buildActions\buildActionsOutput.txt
A saída baseia-se no conteúdo do arquivo criado por você no 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 observando a presença do arquivo
c:\buildArtifacts\index.html
, conforme mostrado no exemplo a seguir:Get-ChildItem c:\buildArtifacts\
O resultado deve ser uma listagem de diretório mostrando o arquivo 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 criados nesse processo, poderá excluí-los seguindo este procedimento:
Exclua o modelo do Construtor de Imagens de VM.
Remove-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName
Exclua o grupo de recursos de imagem.
Cuidado
O exemplo a seguir exclui o grupo de recursos especificado e todos os recursos que ele contém. Se houver recursos fora do escopo deste artigo no grupo de recursos, eles também serão excluídos.
Remove-AzResourceGroup -Name $imageResourceGroup
Próximas etapas
Para saber mais sobre os componentes do arquivo JSON usado neste artigo, confira a referência de modelo do Construtor de Imagens de VM.