Condividi tramite


Usare Image Builder di macchine virtuali linux di Azure per accedere a una rete virtuale di Azure esistente

Si applica a: ✔️ macchine virtuali di Linux ✔️ set di scalabilità flessibili

Questo articolo illustra come usare Image Builder di macchine virtuali di Azure per creare un'immagine Linux di base e personalizzata che abbia accesso alle risorse esistenti in una rete virtuale. La macchina virtuale di compilazione creata viene distribuita in una rete virtuale nuova o esistente specificata nella sottoscrizione. Quando si usa una rete virtuale di Azure esistente, Image Builder di macchine virtuali non richiede la connettività di rete pubblica.

Prerequisiti

Impostare variabili e autorizzazioni

Per questa attività si usano ripetutamente alcune informazioni. Creare alcune variabili per archiviare tali informazioni.

# 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

Creare il gruppo di risorse.

az group create -n $imageResourceGroup -l $location

Configurare la rete

Se non si dispone di una rete virtuale, una subnet o un gruppo di sicurezza di rete esistente, usare lo script seguente per crearne uno.


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

Aggiungere una regola del gruppo di sicurezza di rete

Questa regola consente la connettività dal servizio di bilanciamento del carico di Image Builder alla macchina virtuale proxy. La porta 60001 è per Linux e la porta 60000 è per Windows. La macchina virtuale proxy si connette alla macchina virtuale di compilazione usando la porta 22 per Linux o la porta 5986 per 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"

Disabilitare i criteri del servizio privato nella subnet

In tal caso, eseguire la procedura seguente:

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

Per altre informazioni, vedere Opzioni di rete di Image Builder per macchine virtuali di Azure.

Modificare il modello di esempio e creare il ruolo

Dopo aver configurato la rete, è possibile modificare il modello di esempio e creare un ruolo. In tal caso, eseguire la procedura seguente:

# 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

Impostare le autorizzazioni per il gruppo di risorse

Vm Image Builder usa l'identità utente fornita per inserire l'immagine nella raccolta di calcolo di Azure. In questo esempio si crea una definizione di ruolo di Azure in grado di distribuire l'immagine alla raccolta. La definizione del ruolo viene quindi assegnata all'identità utente.

# 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

Invece di concedere a Image Builder una granularità inferiore e a un maggior privilegio, è possibile creare due ruoli. Un ruolo concede al generatore le autorizzazioni per creare un'immagine e l'altra consente di connettere la macchina virtuale di compilazione e il servizio di bilanciamento del carico alla rete virtuale.

# 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

Per altre informazioni, vedere Configurare le autorizzazioni di Image Builder di macchine virtuali di Azure usando l'interfaccia della riga di comando di Azure o Configurare le autorizzazioni di Image Builder di macchine virtuali di Azure usando PowerShell.

Creare l'immagine

Inviare la configurazione dell'immagine a Image Builder della macchina virtuale.

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

Avviare la compilazione dell'immagine.

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

# Wait approximately 15 mins

La creazione dell'immagine e la replica in entrambe le aree può richiedere del tempo. Attendere il completamento di questa parte prima di procedere alla creazione di una macchina virtuale.

Creazione di una macchina virtuale

Creare una macchina virtuale dalla versione dell'immagine creata da Image Builder della macchina virtuale.

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

Usare Secure Shell (SSH) per accedere alla macchina virtuale.

ssh aibuser@<publicIpAddress>

Si noterà che l'immagine viene personalizzata con un messaggio del giorno non appena viene stabilita la connessione SSH.

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

Pulire le risorse

Se si vuole riconfigurare la versione dell'immagine per creare una nuova versione della stessa immagine, ignorare i passaggi successivi e passare a Usare Image Builder di macchine virtuali di Azure per creare un'altra versione dell'immagine.

Di seguito viene eliminata l'immagine creata, insieme a tutti gli altri file di risorse. Assicurarsi che la distribuzione sia stata completata prima di eliminare le risorse.

Quando si eliminano le risorse della raccolta, è necessario eliminare tutte le versioni dell'immagine prima di poter eliminare la definizione dell'immagine usata per crearle. Per eliminare una raccolta, è prima di tutto necessario eliminare tutte le definizioni immagine nella raccolta.

Eliminare il modello di Image Builder della macchina virtuale:

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

Eliminare assegnazioni di autorizzazioni, ruoli e identità:

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

Eliminare il gruppo di risorse:

az group delete -n $imageResourceGroup

Se è stata creata una rete virtuale per questa guida introduttiva, è possibile eliminare la rete virtuale se non viene più usata.

Passaggi successivi

Raccolte di calcolo di Azure