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. Screenshot that shows an example of Try It for Azure Cloud Shell.
Aceda a https://shell.azure.com ou selecione o botão Iniciar Cloud Shell para abrir o Cloud Shell no browser. Button to launch Azure Cloud Shell.
Selecione o botão Cloud Shell na barra de menus, na parte direita 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 comando.

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

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

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

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

  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 de 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
    

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

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

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

  1. Armazene as credenciais de login 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 para a VM usando o nome de usuário e a senha que você definiu quando criou a VM.

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

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

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