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

Aplica-se a: ✔️ VMs do Windows

Neste artigo, você saberá como criar uma imagem personalizada do Windows usando o Construtor de Imagens de VM do Azure. O exemplo neste artigo usa os seguintes personalizadores para personalizar a imagem:

  • O PowerShell (ScriptUri): faz o download e executa um script do PowerShell.
  • A reinicialização do Windows: reinicia a VM.
  • O PowerShell (embutido): executa um comando específico. Neste exemplo, ele cria um diretório na máquina virtual usando mkdir c:\\buildActions.
  • Arquivo: copia um arquivo do GitHub para a VM. Este exemplo copia index.md para c:\buildArtifacts\index.html na máquina virtual.
  • buildTimeoutInMinutes: especifica um tempo de compilação, em minutos. O padrão é de 240 minutos, que você pode aumentar para permitir compilações de execução prolongada. O valor mínimo permitido é 6 minutos. Valores menores que 6 minutos causarão erros.
  • vmProfile: especifica uma vmSize e propriedades de rede.
  • osDiskSizeGB: pode ser usado para aumentar o tamanho de uma imagem.
  • identity. Fornece uma identidade para uso do Construtor de Imagens de VM do Azure durante a compilação.

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

Observação

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

Registrar os provedores

Para usar o Construtor de Imagens de VM, é preciso registrar o recurso. Verifique seu registro 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

Caso a saída não apresente como registrado, execute o seguinte comando:

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 armazená-las:

# 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'

Criar uma variável para a ID da assinatura:

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 própria imagem, use o grupo de recursos a seguir:

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 do Azure usa a identidade do usuário fornecida para injetar a imagem em um grupo de recursos. Neste exemplo, você cria uma definição de regra do Azure com permissões específicas para distribuir a imagem. A definição de função será 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 Construtor de Imagens de VM do Azure possa acessar a conta de armazenamento em que 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

Baixe o modelo de configuração de imagem

Nós criamos um modelo de configuração de imagem parametrizado para você experimentar. Faça o download do arquivo JSON de exemplo e configure-o com as variáveis que você criou 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

Observação

Para a imagem de origem, sempre especifique uma versão. Você não pode 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 de imagem ao serviço Construtor de Imagens de VM executando os seguintes comandos:

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

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

Em segundo plano, o Construtor de Imagens de VM do Azure também cria um grupo de recursos de preparo na sua assinatura. Esse grupo de recursos é usado para criar a imagem no seguinte formato: IT_<DestinationResourceGroup>_<TemplateName>.

Observação

Não exclua o grupo de recursos de preparo diretamente. Exclua primeiro o artefato do modelo de imagem, que fará com que o grupo de recursos de preparo seja excluído.

Se o serviço relatar uma falha quando você enviar o modelo de configuração de imagem, siga este procedimento:

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

Inicie o build da imagem

Inicie o processo de compilação de imagem 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 esteja concluída.

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

Criar a VM

Crie a VM usando a imagem que você compilou. 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 com 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
  • buildArtifacts

Limpar os recursos

Quando terminar, exclua os recursos criados.

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

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