Utiliser Azure VM Image Builder pour les machines virtuelles Linux pour accéder à un réseau virtuel Azure existant

S’applique à : ✔️ Machines virtuelles Linux ✔️ Groupes identiques flexibles

Cet article vous montre comment utiliser Azure VM Image Builder pour créer une image Linux personnalisée de base qui a accès aux ressources existantes sur un réseau virtuel. La machine virtuelle de build créée est déployée sur un réseau virtuel nouveau ou existant que vous spécifiez dans votre abonnement. Lorsque vous utilisez un réseau virtuel Azure existant, VM Image Builder ne nécessite pas de connectivité au réseau public.

Prérequis

Définir des variables et des autorisations

Pour cette tâche, vous utilisez certaines informations à plusieurs reprises. Créez des variables pour stocker ces informations.

# 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

Créez le groupe de ressources.

az group create -n $imageResourceGroup -l $location

Configurer la mise en réseau

Si vous ne disposez pas encore d’un réseau virtuel, d’un sous-réseau ou d’un groupe de sécurité réseau (NSG), utilisez le script suivant pour en créer un.


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

Ajouter une règle NSG

Cette règle autorise la connectivité de l’équilibreur de charge VM Image Builder à la machine virtuelle proxy. Le port 60001 est utilisé pour Linux et le port 60000 pour Windows. La machine virtuelle proxy se connecte à la machine virtuelle de build en utilisant le port 22 pour Linux ou le port 5986 pour 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"

Désactiver la stratégie de service privé sur le sous-réseau

Voici comment faire :

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

Pour plus d’informations, consultez Options de réseau d’Azure VM Image Builder.

Modifier l’exemple de modèle et créer un rôle

Après avoir configuré le réseau, vous pouvez modifier l’exemple de modèle et créer un rôle. Voici comment faire :

# 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

Définir des autorisations sur le groupe de ressources

VM Image Builder utilise l’identité de l’utilisateur fournie pour injecter l’image dans une galerie Azure Compute Gallery. Dans cet exemple, vous créez une définition de rôle Azure qui peut distribuer l’image dans la galerie. La définition de rôle est alors attribuée à l’identité de l’utilisateur.

# 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

Plutôt que d’octroyer à VM Image Builder un niveau de granularité inférieur et des privilèges accrus, vous pouvez créer deux rôles. Un rôle donne au générateur des autorisations pour créer une image, et l’autre l’autorise à connecter la machine virtuelle de build et l’équilibreur de charge à votre réseau virtuel.

# 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

Pour plus d’informations, consultez Configurer les autorisations d’Azure VM Image Builder à l’aide d’Azure CLI ou Configurer les autorisations d’Azure VM Image Builder à l’aide de PowerShell.

Création de l’image

Envoyez la configuration de l’image à 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.)

Lancez la génération de l’image.

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

# Wait approximately 15 mins

La création de l’image et sa réplication dans les deux régions peuvent prendre un certain temps. Attendez la fin de cette partie pour passer à la création d’une machine virtuelle.

Créer une machine virtuelle

Créez une machine virtuelle à partir de la version de l’image créée par VM Image Builder.

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

Utilisez Secure Shell (SSH) pour accéder à la machine virtuelle.

ssh aibuser@<publicIpAddress>

L’image est personnalisée avec un Message du jour dès que la connexion SSH est établie.

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

Nettoyer les ressources

Si vous souhaitez personnaliser à nouveau la version de l’image pour créer une nouvelle version de la même image, ignorez les étapes suivantes et passez à Utiliser VM Azure Image Builder pour créer une autre version de l’image.

La procédure suivante permet de supprimer l’image créée ainsi que tous les autres fichiers de ressources. Terminez ce déploiement avant de supprimer les ressources.

Lorsque vous supprimez des ressources de la galerie, vous devez supprimer toutes les versions de l’image pour pouvoir supprimer la définition de l’image utilisée pour les créer. Supprimer une galerie implique de supprimer au préalable toutes les définitions de l’image qu’elle comporte.

Supprimer le modèle VM Image Builder :

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

Supprimer des affectations d’autorisations, des rôles et des identités :

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

Supprimer le groupe de ressources :

az group delete -n $imageResourceGroup

Si vous avez créé un réseau virtuel pour ce démarrage rapide, vous pouvez supprimer le réseau virtuel s’il n’est plus utilisé.

Étapes suivantes

Galeries Azure Compute Gallery