Creación de una imagen de Linux y distribución a Azure Compute Gallery mediante la CLI de Azure

Se aplica a: ✔️ máquinas virtuales Linux ✔️ conjuntos de escalado flexibles

En este artículo, aprenderá a usar Azure VM Image Builder y la CLI de Azure para crear una versión de la imagen en una instancia de Azure Compute Gallery (anteriormente denominada Shared Image Gallery) y después distribuirla globalmente. También puede crear una versión de la imagen mediante Azure PowerShell.

En este artículo se usa una plantilla JSON de ejemplo para configurar la imagen. El archivo JSON se encuentra en helloImageTemplateforSIG.json.

Para distribuir la imagen en una instancia de Azure Compute Gallery, en la plantilla se usa sharedImage como valor de la sección distribute de la plantilla.

Registro de los proveedores

Para usar VM Image Builder, debe registrar los proveedores. Ejecute los siguientes comandos para comprobar el registro:

az provider show -n Microsoft.VirtualMachineImages -o json | grep registrationState
az provider show -n Microsoft.KeyVault -o json | grep registrationState
az provider show -n Microsoft.Compute -o json | grep registrationState
az provider show -n Microsoft.Storage -o json | grep registrationState
az provider show -n Microsoft.Network -o json | grep registrationState
az provider show -n Microsoft.ContainerInstance -o json | grep registrationState

Si la salida no dice registrada, ejecute los siguientes comandos:

az provider register -n Microsoft.VirtualMachineImages
az provider register -n Microsoft.Compute
az provider register -n Microsoft.KeyVault
az provider register -n Microsoft.Storage
az provider register -n Microsoft.Network
az provider register -n Microsoft.ContainerInstance

Establecimiento de variables y permisos

Ya que usará algunos datos de forma repetida, cree diversas variables para almacenar esa información.

VM Image Builder admite la creación de imágenes personalizadas solo en el mismo grupo de recursos que la imagen administrada de origen. En el siguiente ejemplo, actualice el nombre del grupo de recursos para que coincida con el de la imagen administrada de origen.

# Resource group name - ibLinuxGalleryRG in this example
sigResourceGroup=ibLinuxGalleryRG
# Datacenter location - West US 2 in this example
location=westus2
# Additional region to replicate the image to - East US in this example
additionalregion=eastus
# Name of the Azure Compute Gallery - myGallery in this example
sigName=myIbGallery
# Name of the image definition to be created - myImageDef in this example
imageDefName=myIbImageDef
# Reference name in the image distribution metadata
runOutputName=aibLinuxSIG

Cree una variable para el id. de suscripción:

subscriptionID=$(az account show --query id --output tsv)

Creación del grupo de recursos:

az group create -n $sigResourceGroup -l $location

Creación de una identidad asignada por el usuario y establecimiento de los permisos en el grupo de recursos

VM Image Builder usa la identidad de usuario proporcionada para insertar la imagen en Azure Compute Gallery. En este ejemplo, creará una definición de roles de Azure con acciones específicas para distribuir la imagen. La definición de roles se asigna a la identidad del usuario.

# Create user-assigned identity for VM Image Builder to access the storage account where the script is stored
identityName=aibBuiUserId$(date +'%s')
az identity create -g $sigResourceGroup -n $identityName

# Get the identity ID
imgBuilderCliId=$(az identity show -g $sigResourceGroup -n $identityName --query clientId -o tsv)

# Get the user identity URI that's needed for the template
imgBuilderId=/subscriptions/$subscriptionID/resourcegroups/$sigResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$identityName

# Download an Azure role-definition template, and update the template with the parameters that were specified earlier
curl https://raw.githubusercontent.com/Azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json -o aibRoleImageCreation.json

imageRoleDefName="Azure Image Builder Image Def"$(date +'%s')

# Update the definition
sed -i -e "s/<subscriptionID>/$subscriptionID/g" aibRoleImageCreation.json
sed -i -e "s/<rgName>/$sigResourceGroup/g" aibRoleImageCreation.json
sed -i -e "s/Azure Image Builder Service Image Creation Role/$imageRoleDefName/g" aibRoleImageCreation.json

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

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

Para usar VM Image Builder con una instancia de Azure Compute Gallery, debe tener una galería y una definición de imagen existentes. VM Image Builder no crea la galería ni la definición de imagen automáticamente.

Si aún no tiene una galería y una definición de imagen para usar, empiece por crearlas.

En primer lugar, cree una galería:

az sig create \
    -g $sigResourceGroup \
    --gallery-name $sigName

Luego, cree una definición de imagen:

az sig image-definition create \
   -g $sigResourceGroup \
   --gallery-name $sigName \
   --gallery-image-definition $imageDefName \
   --publisher myIbPublisher \
   --offer myOffer \
   --sku 20_04-lts-gen2 \
   --os-type Linux \
   --hyper-v-generation V2 \
   --features SecurityType=TrustedLaunchSupported

Descarga y configuración del archivo JSON

Descargue la plantilla JSON y configúrela con las variables:

curl https://raw.githubusercontent.com/Azure/azvmimagebuilder/master/quickquickstarts/1_Creating_a_Custom_Linux_Shared_Image_Gallery_Image/helloImageTemplateforSIG.json -o helloImageTemplateforSIG.json
sed -i -e "s/<subscriptionID>/$subscriptionID/g" helloImageTemplateforSIG.json
sed -i -e "s/<rgName>/$sigResourceGroup/g" helloImageTemplateforSIG.json
sed -i -e "s/<imageDefName>/$imageDefName/g" helloImageTemplateforSIG.json
sed -i -e "s/<sharedImageGalName>/$sigName/g" helloImageTemplateforSIG.json
sed -i -e "s/<region1>/$location/g" helloImageTemplateforSIG.json
sed -i -e "s/<region2>/$additionalregion/g" helloImageTemplateforSIG.json
sed -i -e "s/<runOutputName>/$runOutputName/g" helloImageTemplateforSIG.json
sed -i -e "s%<imgBuilderId>%$imgBuilderId%g" helloImageTemplateforSIG.json

Creación de la versión de la imagen

En esta sección, creará la versión de la imagen en la galería.

Envíe la configuración de la imagen al servicio Azure VM Image Builder:

az resource create \
    --resource-group $sigResourceGroup \
    --properties @helloImageTemplateforSIG.json \
    --is-full-object \
    --resource-type Microsoft.VirtualMachineImages/imageTemplates \
    -n helloImageTemplateforSIG01

Inicie la generación de la imagen:

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

La creación y replicación de la imagen en ambas regiones puede tardar unos minutos. Espere a que termine esta parte antes de pasar a la creación de una máquina virtual.

Creación de la máquina virtual

Cree la máquina virtual a partir de la versión de la imagen que se creó mediante VM Image Builder.

az vm create \
  --resource-group $sigResourceGroup \
  --name myAibGalleryVM \
  --admin-username aibuser \
  --location $location \
  --image "/subscriptions/$subscriptionID/resourceGroups/$sigResourceGroup/providers/Microsoft.Compute/galleries/$sigName/images/$imageDefName/versions/latest" \
  --security-type TrustedLaunch \
  --generate-ssh-keys

Conéctese a la máquina virtual mediante Secure Shell (SSH):

ssh aibuser@<publicIpAddress>

Verá que la imagen se ha personalizado con un mensaje del día en cuanto se ha establecido la conexión SSH:

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

Limpieza de los recursos

Nota

Si ahora quiere volver a personalizar la versión de la imagen para crear una nueva de la misma, omita el paso que se indica aquí y vaya a Uso de VM Image Builder para crear otra versión de la imagen.

Si ya no necesita los recursos que se crearon mientras seguía el proceso de este artículo, puede eliminarlos haciendo lo siguiente.

Este proceso elimina la imagen que ha creado y todos los demás archivos de recursos. Asegúrese de que ha terminado esta implementación antes de eliminar los recursos.

Al eliminar los recursos de la galería, tendrá que eliminar todas las versiones de la imagen antes de poder eliminar la definición de la imagen que se ha usado para crearlas. Para eliminar una galería, primero tiene que haber eliminado todas las definiciones de imagen de la galería.

  1. Elimine la plantilla de VM Image Builder.

    az resource delete \
        --resource-group $sigResourceGroup \
        --resource-type Microsoft.VirtualMachineImages/imageTemplates \
        -n helloImageTemplateforSIG01
    
  2. Elimine las asignaciones de permisos, los roles y la identidad.

    az role assignment delete \
        --assignee $imgBuilderCliId \
        --role "$imageRoleDefName" \
        --scope /subscriptions/$subscriptionID/resourceGroups/$sigResourceGroup
    
    az role definition delete --name "$imageRoleDefName"
    
    az identity delete --ids $imgBuilderId
    
  3. Obtenga la versión de la imagen que se creó mediante VM Image Builder (siempre comienza por 0.) y, a continuación, elimínela.

    sigDefImgVersion=$(az sig image-version list \
    -g $sigResourceGroup \
    --gallery-name $sigName \
    --gallery-image-definition $imageDefName \
    --subscription $subscriptionID --query [].'name' -o json | grep 0. | tr -d '"')
    az sig image-version delete \
    -g $sigResourceGroup \
    --gallery-image-version $sigDefImgVersion \
    --gallery-name $sigName \
    --gallery-image-definition $imageDefName \
    --subscription $subscriptionID
    
  4. Elimine la definición de la imagen.

    az sig image-definition delete \
    -g $sigResourceGroup \
    --gallery-name $sigName \
    --gallery-image-definition $imageDefName \
    --subscription $subscriptionID
    
  5. Elimine la galería.

    az sig delete -r $sigName -g $sigResourceGroup
    
  6. Elimine el grupo de recursos.

    az group delete -n $sigResourceGroup -y
    

Pasos siguientes

Más información sobre Azure Compute Gallery.