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.