Compartilhar via


Usar o Construtor de Imagens de VM do Azure para VMs Linux para acessar uma rede virtual existente do Azure

Aplica-se a: ✔️ Linux VMs ✔️ Conjuntos de escala flexível

Este artigo mostra como usar o Construtor de Imagens de VM do Azure para criar uma imagem Linux básica e personalizada que tenha acesso aos recursos existentes em uma rede virtual. A máquina virtual (VM) de compilação que você cria é implantada em uma rede virtual nova ou existente que você especifica em sua assinatura. Quando você usa uma rede virtual existente do Azure, o Construtor de Imagens de VM não requer conectividade de rede pública.

Pré-requisitos

  • Use o ambiente Bash no Azure Cloud Shell. Para obter mais informações, consulte Guia de início rápido para Bash no Azure Cloud Shell.

  • Se preferir executar comandos de referência da CLI localmente, instale a CLI do Azure. Se estiver a utilizar o Windows ou macOS, considere executar a CLI do Azure num contentor Docker. Para obter mais informações, consulte Como executar a CLI do Azure em um contêiner do Docker.

    • Se estiver a utilizar uma instalação local, inicie sessão no CLI do Azure ao utilizar o comando az login. Para concluir o processo de autenticação, siga os passos apresentados no seu terminal. Para outras opções de entrada, consulte Entrar com a CLI do Azure.

    • Quando solicitado, instale a extensão da CLI do Azure na primeira utilização. Para obter mais informações sobre as extensões, veja Utilizar extensões com o CLI do Azure.

    • Execute o comando az version para localizar a versão e as bibliotecas dependentes instaladas. Para atualizar para a versão mais recente, execute o comando az upgrade.

Definir variáveis e permissões

Para esta tarefa, você usa algumas informações repetidamente. Crie algumas variáveis para armazenar essas informações.

# set your environment variables here!!!!

# destination image resource group
imageResourceGroup=aibImageRG01

# location (see possible locations in main docs)
location=WestUS2

# your subscription
# get the current subID : 'az account show | grep id'
subscriptionID=$(az account show --query id --output tsv)

# name of the image to be created
imageName=aibCustomLinuxImg01

# image distribution metadata reference name
runOutputName=aibCustLinManImg01ro


# VNET properties (update to match your existing VNET, or leave as-is for demo)
# VNET name
vnetName=myexistingvnet01
# subnet name
subnetName=subnet01
# VNET resource group name
# NOTE! The VNET must always be in the same region as the Azure Image Builder service region.
vnetRgName=existingVnetRG
# Existing Subnet NSG Name or the demo will create it
nsgName=aibdemoNsg

Crie o grupo de recursos.

az group create -n $imageResourceGroup -l $location

Configurar as redes

Se você não tiver uma rede virtual, sub-rede ou grupo de segurança de rede (NSG) existente, use o script a seguir para criar um.


# Create a resource group

az group create -n $vnetRgName -l $location

# Create VNET

az network vnet create \
    --resource-group $vnetRgName \
    --name $vnetName --address-prefix 10.0.0.0/16 \
    --subnet-name $subnetName --subnet-prefix 10.0.0.0/24

# Create base NSG to simulate an existing NSG

az network nsg create -g $vnetRgName -n $nsgName

az network vnet subnet update \
    --resource-group $vnetRgName \
    --vnet-name $vnetName \
    --name $subnetName \
    --network-security-group $nsgName
    
#  NOTE! The virtual network must always be in the same region as the Azure Image Builder service region.

Adicionar uma regra NSG

Esta regra permite a conectividade do balanceador de carga do VM Image Builder com a VM proxy. A porta 60001 é para Linux e a porta 60000 é para Windows. A VM proxy se conecta à VM de compilação usando a porta 22 para Linux ou a porta 5986 para Windows.

az network nsg rule create \
    --resource-group $vnetRgName \
    --nsg-name $nsgName \
    -n AzureImageBuilderNsgRule \
    --priority 400 \
    --source-address-prefixes AzureLoadBalancer \
    --destination-address-prefixes VirtualNetwork \
    --destination-port-ranges 60000-60001 --direction inbound \
    --access Allow --protocol Tcp \
    --description "Allow Image Builder Private Link Access to Proxy VM"

Desativar a política de serviço privado na sub-rede

Saiba como:

az network vnet subnet update \
  --name $subnetName \
  --resource-group $vnetRgName \
  --vnet-name $vnetName \
  --disable-private-link-service-network-policies true 

Para obter mais informações, consulte Opções de rede do Azure VM Image Builder.

Modificar o modelo de exemplo e criar função

Depois de configurar a rede, você pode modificar o modelo de exemplo e criar uma função. Saiba como:

# download the example and configure it with your vars

curl https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/1a_Creating_a_Custom_Linux_Image_on_Existing_VNET/existingVNETLinux.json -o existingVNETLinux.json
curl https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleNetworking.json -o aibRoleNetworking.json
curl https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json -o aibRoleImageCreation.json

sed -i -e "s/<subscriptionID>/$subscriptionID/g" existingVNETLinux.json
sed -i -e "s/<rgName>/$imageResourceGroup/g" existingVNETLinux.json
sed -i -e "s/<region>/$location/g" existingVNETLinux.json
sed -i -e "s/<imageName>/$imageName/g" existingVNETLinux.json
sed -i -e "s/<runOutputName>/$runOutputName/g" existingVNETLinux.json

sed -i -e "s/<vnetName>/$vnetName/g" existingVNETLinux.json
sed -i -e "s/<subnetName>/$subnetName/g" existingVNETLinux.json
sed -i -e "s/<vnetRgName>/$vnetRgName/g" existingVNETLinux.json

sed -i -e "s/<subscriptionID>/$subscriptionID/g" aibRoleImageCreation.json
sed -i -e "s/<rgName>/$imageResourceGroup/g" aibRoleImageCreation.json

sed -i -e "s/<subscriptionID>/$subscriptionID/g" aibRoleNetworking.json
sed -i -e "s/<vnetRgName>/$vnetRgName/g" aibRoleNetworking.json

Definir permissões no grupo de recursos

O Construtor de Imagens de VM usa a identidade de usuário fornecida para injetar a imagem na Galeria de Computação do Azure. Neste exemplo, você cria uma definição de função do Azure que pode distribuir a imagem para a galeria. A definição de função é então atribuída à identidade do usuário.

# create user assigned identity for image builder
identityName=aibBuiUserId$(date +'%s')
az identity create -g $imageResourceGroup -n $identityName

# get identity id
imgBuilderCliId=$(az identity show -g $imageResourceGroup -n $identityName --query clientId -o tsv)

# get the user identity URI, needed for the template
imgBuilderId=/subscriptions/$subscriptionID/resourcegroups/$imageResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$identityName

# update the template
sed -i -e "s%<imgBuilderId>%$imgBuilderId%g" existingVNETLinux.json

# make role name unique, to avoid clashes in the same Azure Active Directory domain
imageRoleDefName="Azure Image Builder Image Def"$(date +'%s')
netRoleDefName="Azure Image Builder Network Def"$(date +'%s')

# update the definitions
sed -i -e "s/Azure Image Builder Service Image Creation Role/$imageRoleDefName/g" aibRoleImageCreation.json
sed -i -e "s/Azure Image Builder Service Networking Role/$netRoleDefName/g" aibRoleNetworking.json

Em vez de conceder ao Construtor de Imagens de VM menor granularidade e maior privilégio, você pode criar duas funções. Uma função dá ao construtor permissões para criar uma imagem e a outra permite que ele conecte a VM de compilação e o balanceador de carga à sua rede virtual.

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

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

az role assignment create \
    --assignee $imgBuilderCliId \
    --role "$netRoleDefName" \
    --scope /subscriptions/$subscriptionID/resourceGroups/$vnetRgName

Para obter mais informações, consulte Configurar permissões do Construtor de Imagens de VM do Azure usando a CLI do Azure ou Configurar permissões do Construtor de Imagens de VM do Azure usando o PowerShell.

Criar a imagem

Envie a configuração da imagem para o VM Image Builder.

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

# Wait approximately 1-3 mins (validation, permissions etc.)

Inicie a construção da imagem.

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

# Wait approximately 15 mins

Pode demorar um pouco para criar a imagem e replicá-la para ambas as regiões. Aguarde até que esta parte esteja concluída antes de passar para a criação de uma VM.

Criar uma VM

Crie uma VM a partir da versão da imagem que foi criada pelo VM Image Builder.

az vm create \
  --resource-group $imageResourceGroup \
  --name aibImgVm0001 \
  --admin-username aibuser \
  --image $imageName \
  --location $location \
  --generate-ssh-keys

Use o Secure Shell (SSH) para entrar na VM.

ssh aibuser@<publicIpAddress>

Você deve ver que a imagem foi personalizada com uma Mensagem do Dia assim que sua conexão SSH for estabelecida!

*******************************************************
**            This VM was built from the:            **
**      !! AZURE VM IMAGE BUILDER Custom Image !!    **
**         You have just been Customized :-)         **
*******************************************************

Clean up resources (Limpar recursos)

Se você quiser repersonalizar a versão da imagem para criar uma nova versão da mesma imagem, ignore as próximas etapas e vá para Usar o Construtor de Imagens da VM do Azure para criar outra versão da imagem.

O seguinte exclui a imagem que foi criada, juntamente com todos os outros arquivos de recurso. Certifique-se de que concluiu esta implementação antes de eliminar os recursos.

Ao excluir recursos da galeria, você precisa excluir todas as versões de imagem antes de excluir a definição de imagem usada para criá-las. Para excluir uma galeria, primeiro você precisa ter excluído todas as definições de imagem na galeria.

Exclua o modelo do VM Image Builder:

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

Excluir atribuições de permissões, funções e identidade:

az role assignment delete \
    --assignee $imgBuilderCliId \
    --role $imageRoleDefName \
    --scope /subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup

az role assignment delete \
    --assignee $imgBuilderCliId \
    --role $netRoleDefName \
    --scope /subscriptions/$subscriptionID/resourceGroups/$vnetRgName


az role definition delete --name "$imageRoleDefName"
az role definition delete --name "$netRoleDefName"

az identity delete --ids $imgBuilderId

Exclua o grupo de recursos:

az group delete -n $imageResourceGroup

Se você criou uma rede virtual para esse início rápido, poderá excluir a rede virtual se ela não estiver mais sendo usada.

Próximos passos

Galerias de computação do Azure