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. Screenshot that shows an example of Try It for Azure Cloud Shell.
Acesse https://shell.azure.com ou selecione o botão Iniciar o Cloud Shell para abri-lo no navegador. Button to launch Azure Cloud Shell.
Selecione o botão Cloud Shell na barra de menus no canto superior direito do portal do Azure. Screenshot that shows the Cloud Shell button in the Azure portal

Para usar o Azure Cloud Shell:

  1. Inicie o Cloud Shell.

  2. Selecione o botão Copiar em um bloco de código (ou bloco de comando) para copiar o código ou o comando.

  3. 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.

  4. 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.

  1. 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"
    
  2. Crie uma identidade de usuário.

    New-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Location $location
    
  3. 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

  1. 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
    
  2. Crie a definição da função.

    New-AzRoleDefinition -InputFile $myRoleImageCreationPath
    
  3. 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).

  1. Crie a galeria.

    $myGalleryName = 'myImageGallery'
    $imageDefName = 'winSvrImages'
    
    New-AzGallery -GalleryName $myGalleryName -ResourceGroupName $imageResourceGroup -Location $location
    
  2. 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

  1. 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
    
  2. 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
    
  3. 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
    
  4. 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
    
  5. 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:

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

  1. Armazene as credenciais de logon da VM em uma variável. A senha deve ser complexa.

    $Cred = Get-Credential
    
  2. 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

  1. 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.

  2. 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
    
  3. 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:

  1. Exclua o modelo do Construtor de Imagens de VM.

    Remove-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName
    
  2. 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.