Criar uma VM do Windows usando o Construtor de Imagens de VM do Azure

Aplica-se a: ✔️ VMs do Windows

Neste artigo, você aprenderá a criar uma imagem personalizada do Windows usando o Azure VM Image Builder. O exemplo neste artigo usa personalizadores para personalizar a imagem:

  • PowerShell (ScriptUri): Baixe e execute um script do PowerShell.
  • Reinicialização do Windows: reinicia a VM.
  • PowerShell (inline): executa um comando específico. Neste exemplo, ele cria um diretório na VM usando mkdir c:\\buildActions.
  • Arquivo: copia um arquivo do GitHub para a VM. Este exemplo copia index.md para c:\buildArtifacts\index.html na VM.
  • buildTimeoutInMinutes: Especifica um tempo de compilação, em minutos. O padrão é 240 minutos, que você pode aumentar para permitir compilações de execução mais longa. O valor mínimo permitido é de 6 minutos. Valores inferiores a 6 minutos causarão erros.
  • vmProfile: Especifica as propriedades a vmSize e network.
  • osDiskSizeGB: Pode ser usado para aumentar o tamanho de uma imagem.
  • identity. Fornece uma identidade para o Construtor de Imagens de VM usar durante a compilação.

Use o seguinte modelo JSON de exemplo para configurar a imagem: helloImageTemplateWin.json.

Nota

Os usuários do Windows podem executar os seguintes exemplos de CLI do Azure no Azure Cloud Shell usando Bash.

Registar os fornecedores

Para usar o VM Image Builder, você precisa registrar o recurso. Verifique o seu registo executando os seguintes comandos:

az provider show -n Microsoft.VirtualMachineImages | grep registrationState
az provider show -n Microsoft.KeyVault | grep registrationState
az provider show -n Microsoft.Compute | grep registrationState
az provider show -n Microsoft.Storage | grep registrationState
az provider show -n Microsoft.Network | grep registrationState
az provider show -n Microsoft.ContainerInstance -o json | grep registrationState

Se a saída não disser registrado, execute os seguintes comandos:

az provider register -n Microsoft.VirtualMachineImages
az provider register -n Microsoft.Compute
az provider register -n Microsoft.KeyVault
az provider register -n Microsoft.Storage
az provider register -n Microsoft.Network
az provider register -n Microsoft.ContainerInstance

Definir variáveis

Como você usará algumas informações repetidamente, crie algumas variáveis para armazenar essas informações:

# Resource group name - we're using myImageBuilderRG in this example
imageResourceGroup='myWinImgBuilderRG'
# Region location
location='WestUS2'
# Run output name
runOutputName='aibWindows'
# The name of the image to be created
imageName='aibWinImage'

Crie uma variável para o ID da sua subscrição:

subscriptionID=$(az account show --query id --output tsv)

Criar o grupo de recursos

Para armazenar o artefato do modelo de configuração de imagem e a imagem, use o seguinte grupo de recursos:

az group create -n $imageResourceGroup -l $location

Criar uma identidade atribuída pelo usuário e definir permissões no grupo de recursos

O Construtor de Imagens de VM usa a identidade de usuário fornecida para injetar a imagem no grupo de recursos. Neste exemplo, você cria uma definição de função do Azure com permissões específicas para distribuir a imagem. A definição de função é então atribuída à identidade do usuário.

Criar uma identidade gerenciada atribuída pelo usuário e conceder permissões

Crie uma identidade atribuída pelo usuário para que o VM Image Builder possa acessar a conta de armazenamento onde o script está armazenado.

identityName=aibBuiUserId$(date +'%s')
az identity create -g $imageResourceGroup -n $identityName

# Get the identity ID
imgBuilderCliId=$(az identity show -g $imageResourceGroup -n $identityName --query clientId -o tsv)

# Get the user identity URI that's needed for the template
imgBuilderId=/subscriptions/$subscriptionID/resourcegroups/$imageResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$identityName

# Download the preconfigured role definition example
curl https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json -o aibRoleImageCreation.json

imageRoleDefName="Azure Image Builder Image Def"$(date +'%s')

# Update the definition
sed -i -e "s%<subscriptionID>%$subscriptionID%g" aibRoleImageCreation.json
sed -i -e "s%<rgName>%$imageResourceGroup%g" aibRoleImageCreation.json
sed -i -e "s%Azure Image Builder Service Image Creation Role%$imageRoleDefName%g" aibRoleImageCreation.json

# Create role definitions
az role definition create --role-definition ./aibRoleImageCreation.json

# Grant a role definition to the user-assigned identity
az role assignment create \
    --assignee $imgBuilderCliId \
    --role "$imageRoleDefName" \
    --scope /subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup

Faça o download do modelo de configuração de imagem

Criamos um modelo de configuração de imagem parametrizada para você experimentar. Baixe o arquivo JSON de exemplo e configure-o com as variáveis definidas anteriormente.

curl https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/0_Creating_a_Custom_Windows_Managed_Image/helloImageTemplateWin.json -o helloImageTemplateWin.json

sed -i -e "s%<subscriptionID>%$subscriptionID%g" helloImageTemplateWin.json
sed -i -e "s%<rgName>%$imageResourceGroup%g" helloImageTemplateWin.json
sed -i -e "s%<region>%$location%g" helloImageTemplateWin.json
sed -i -e "s%<imageName>%$imageName%g" helloImageTemplateWin.json
sed -i -e "s%<runOutputName>%$runOutputName%g" helloImageTemplateWin.json
sed -i -e "s%<imgBuilderId>%$imgBuilderId%g" helloImageTemplateWin.json

Você pode modificar este exemplo no terminal usando um editor de texto como vi.

vi helloImageTemplateWin.json

Nota

Para a imagem de origem, especifique sempre uma versão. Não é possível especificar latest como a versão.

Se você adicionar ou alterar o grupo de recursos para o qual a imagem é distribuída, verifique se as permissões estão definidas no grupo de recursos.

Criar a imagem

Envie a configuração da imagem para o serviço VM Image Builder executando os seguintes comandos:

az resource create \
    --resource-group $imageResourceGroup \
    --properties @helloImageTemplateWin.json \
    --is-full-object \
    --resource-type Microsoft.VirtualMachineImages/imageTemplates \
    -n helloImageTemplateWin01

Quando terminar, uma mensagem de êxito será retornada ao console e um modelo de configuração do Construtor de Imagens de VM será criado no $imageResourceGroup. Para exibir esse recurso no grupo de recursos, vá para o portal do Azure e habilite Mostrar tipos ocultos.

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 criar a imagem no seguinte formato: IT_<DestinationResourceGroup>_<TemplateName>.

Nota

Não exclua o grupo de recursos de preparo diretamente. Primeiro, exclua o artefato de modelo de imagem, que faz com que o grupo de recursos de preparo seja excluído.

Se o serviço relatar uma falha ao enviar o modelo de configuração de imagem, faça o seguinte:

az resource delete \
    --resource-group $imageResourceGroup \
    --resource-type Microsoft.VirtualMachineImages/imageTemplates \
    -n helloImageTemplateWin01

Iniciar a construção da imagem

Inicie o processo de criação de imagens usando az resource invoke-action.

az resource invoke-action \
     --resource-group $imageResourceGroup \
     --resource-type  Microsoft.VirtualMachineImages/imageTemplates \
     -n helloImageTemplateWin01 \
     --action Run

Aguarde até que a compilação seja concluída.

Se você encontrar erros, consulte Solucionar problemas do serviço Construtor de Imagens de VM do Azure.

Criar a VM

Crie a VM usando a imagem que você criou. No código a seguir, substitua <a senha por sua própria senha> para o aibuser na VM.

az vm create \
  --resource-group $imageResourceGroup \
  --name aibImgWinVm00 \
  --admin-username aibuser \
  --admin-password <password> \
  --image $imageName \
  --location $location

Verificar a personalização

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. Na VM, abra uma janela do Prompt de Comando e digite:

dir c:\

Os dois diretórios a seguir são criados durante a personalização da imagem:

  • buildActions
  • construirArtefatos

Limpar os recursos

Quando terminar, exclua os recursos que criou.

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

    az resource delete \
        --resource-group $imageResourceGroup \
        --resource-type Microsoft.VirtualMachineImages/imageTemplates \
        -n helloImageTemplateWin01
    
  2. Exclua a atribuição de função, a definição de função e a identidade do usuário.

    az role assignment delete \
        --assignee $imgBuilderCliId \
        --role "$imageRoleDefName" \
        --scope /subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup
    
    az role definition delete --name "$imageRoleDefName"
    
    az identity delete --ids $imgBuilderId
    
  3. Exclua o grupo de recursos de imagem.

    az group delete -n $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.