Usar o Construtor de Imagens de VM do Azure para VMs do Linux a fim de acessar a uma rede virtual do Azure existente
Aplica-se a: ✔️ VMs do Linux ✔️ Conjuntos de dimensionamento flexíveis
Este artigo mostra como usar o Construtor de Imagens de VM do Azure para criar uma imagem básica e personalizada do Linux com acesso a recursos existentes em uma rede virtual. A VM (máquina virtual) de build que você cria é implantada em uma rede virtual nova ou existente que você especifica na sua assinatura. Quando você usa uma rede virtual do Azure existente, o Construtor de Imagens de VM não exige conectividade de rede pública.
Pré-requisitos
Use o ambiente Bash no Azure Cloud Shell. Para obter mais informações, confira Início Rápido para Bash no Azure Cloud Shell.
Se preferir executar os comandos de referência da CLI localmente, instale a CLI do Azure. Para execuções no Windows ou no macOS, considere executar a CLI do Azure em um contêiner do Docker. Para obter mais informações, confira Como executar a CLI do Azure em um contêiner do Docker.
Se estiver usando uma instalação local, entre com a CLI do Azure usando o comando az login. Para concluir o processo de autenticação, siga as etapas exibidas no terminal. Para ver outras opções de entrada, confira Conectar-se com a CLI do Azure.
Quando solicitado, instale a extensão da CLI do Azure no primeiro uso. Para obter mais informações sobre extensões, confira Usar extensões com a CLI do Azure.
Execute az version para localizar a versão e as bibliotecas dependentes que estão instaladas. Para fazer a atualização para a versão mais recente, execute az upgrade.
Definir variáveis e permissões
Para essa 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 a rede
Se você ainda não tiver uma rede virtual, uma sub-rede ou um NSG (grupo de segurança de rede), use o script a seguir para criar esse item.
# 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.
Criar uma regra de NSG
Essa regra permite a conectividade do balanceador de carga do Construtor de Imagens de VM com a VM do proxy. A porta 60001 é para sistemas operacionais Linux e a porta 60000, para sistemas operacionais Windows. A VM do proxy conecta-se à VM da compilação usando a porta 22 (para sistemas operacionais Linux) ou a porta 5986 (para sistemas operacionais 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"
Desabilitar a política de serviço privado na sub-rede
Aqui está 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 Construtor de Imagens de VM do Azure.
Modificar o modelo de exemplo e criar função
Após configurar a rede, você pode modificar o modelo de exemplo e criar uma função. Aqui está 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 do usuário fornecida para injetar a imagem em uma 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 será 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 fornece ao construtor permissões para criar uma imagem e a outra permite conectar a VM de build 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 mais informações, confira 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 ao Construtor de Imagens de VM.
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 o build da imagem.
az resource invoke-action \
--resource-group $imageResourceGroup \
--resource-type Microsoft.VirtualMachineImages/imageTemplates \
-n existingVNETLinuxTemplate01 \
--action Run
# Wait approximately 15 mins
Pode levar algum tempo para criar e replicar a imagem para ambas as regiões. Aguarde até que essa parte seja concluída antes de passar para a criação de uma VM.
Criar uma VM
Crie uma VM com base na versão da imagem criada pelo Construtor de Imagens de VM.
az vm create \
--resource-group $imageResourceGroup \
--name aibImgVm0001 \
--admin-username aibuser \
--image $imageName \
--location $location \
--generate-ssh-keys
Use o SSH (Secure Shell) para entrar na VM.
ssh aibuser@<publicIpAddress>
Você deve ver que a imagem foi personalizada com uma Mensagem do Dia assim que a conexão SSH é estabelecida.
*******************************************************
** This VM was built from the: **
** !! AZURE VM IMAGE BUILDER Custom Image !! **
** You have just been Customized :-) **
*******************************************************
Limpar os recursos
Caso deseje personalizar novamente a versão da imagem para criar uma versão da mesma imagem, ignore as próximas etapas e acesse Usar o Construtor de Imagens de VM do Azure para criar outra versão da imagem.
Isso excluirá a imagem que foi criada, junto com todos os outros arquivos de recurso. Verifique se você concluiu essa implantação antes de excluir os recursos.
Quando exclui recursos da galeria, você precisa excluir todas as versões da imagem para poder excluir a definição de imagem usada para criá-las. Para excluir uma galeria, primeiro você precisará excluir todas as definições de imagem na galeria.
Exclua o modelo do Construtor de Imagens de VM:
az resource delete \
--resource-group $imageResourceGroup \
--resource-type Microsoft.VirtualMachineImages/imageTemplates \
-n existingVNETLinuxTemplate01
Exclua as atribuições de permissões, as funções e a 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 este início rápido, poderá excluir a rede virtual se ela não estiver mais sendo usada.