Creación de una VM Windows mediante Azure VM Image Builder

Se aplica a: ✔️ Máquinas virtuales Windows

En este artículo, obtendrá información sobre cómo crear una imagen personalizada de Windows mediante Azure VM Image Builder. En el ejemplo de este artículo se usan personalizadores para personalizar la imagen:

  • PowerShell (ScriptUri): descarga y ejecuta un script de PowerShell.
  • Reinicio de Windows: reinicia la VM.
  • PowerShell (insertado): ejecuta un comando específico. En este ejemplo, se crea un directorio en la VM mediante mkdir c:\\buildActions.
  • Archivo: copia un archivo de GitHub en la VM. En este ejemplo se copia index.md en c:\buildArtifacts\index.html en la máquina virtual.
  • buildTimeoutInMinutes: especifica un tiempo de compilación, en minutos. El valor predeterminado es de 240 minutos, que puede aumentar para permitir compilaciones de larga duración. El valor mínimo permitido es 6 minutos. Los valores inferiores a 6 minutos provocarán errores.
  • vmProfile: especifica un valor vmSize y las propiedades de red.
  • osDiskSizeGB: se puede usar para aumentar el tamaño de una imagen.
  • identity. Proporciona una identidad para que VM Image Builder la use durante la compilación.

Use la siguiente plantilla JSON de ejemplo para configurar la imagen: helloImageTemplateWin.json.

Nota

Los usuarios de Windows pueden ejecutar los ejemplos siguientes de la CLI de Azure en Azure Cloud Shell mediante Bash.

Registro de los proveedores

Para usar VM Image Builder, debe registrar la característica. Ejecute los siguientes comandos para comprobar el registro:

az provider show -n Microsoft.VirtualMachineImages | grep registrationState
az provider show -n Microsoft.KeyVault | grep registrationState
az provider show -n Microsoft.Compute | grep registrationState
az provider show -n Microsoft.Storage | grep registrationState
az provider show -n Microsoft.Network | 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

Configuración de variables

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

# Resource group name - we're using myImageBuilderRG in this example
imageResourceGroup='myWinImgBuilderRG'
# Region location
location='WestUS2'
# Run output name
runOutputName='aibWindows'
# The name of the image to be created
imageName='aibWinImage'

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

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

Creación del grupo de recursos

Para almacenar el artefacto de la plantilla de configuración de la imagen y la imagen misma, use el grupo de recursos siguiente:

az group create -n $imageResourceGroup -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 el grupo de recursos. En este ejemplo, creará una definición de roles de Azure con permisos específicos para distribuir la imagen. La definición de roles se asigna a la identidad del usuario.

Creación de una identidad administrada asignada por el usuario y concesión de permisos

Cree una identidad asignada por el usuario para que VM Image Builder pueda acceder a la cuenta de almacenamiento donde se almacena el script.

identityName=aibBuiUserId$(date +'%s')
az identity create -g $imageResourceGroup -n $identityName

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

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

# Download the preconfigured role definition example
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>%$imageResourceGroup%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/$imageResourceGroup

Descarga de la plantilla de configuración de la imagen

Hemos creado una plantilla de configuración de imagen con parámetros para que pueda probarla. Descargue el archivo JSON de ejemplo y, luego, configúrelo con las variables que estableció anteriormente.

curl https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/0_Creating_a_Custom_Windows_Managed_Image/helloImageTemplateWin.json -o helloImageTemplateWin.json

sed -i -e "s%<subscriptionID>%$subscriptionID%g" helloImageTemplateWin.json
sed -i -e "s%<rgName>%$imageResourceGroup%g" helloImageTemplateWin.json
sed -i -e "s%<region>%$location%g" helloImageTemplateWin.json
sed -i -e "s%<imageName>%$imageName%g" helloImageTemplateWin.json
sed -i -e "s%<runOutputName>%$runOutputName%g" helloImageTemplateWin.json
sed -i -e "s%<imgBuilderId>%$imgBuilderId%g" helloImageTemplateWin.json

Puede modificar este ejemplo en el terminal con un editor de texto, como vi.

vi helloImageTemplateWin.json

Nota

En el caso de la imagen de origen, siempre especifique una versión. No especifique latest como la versión.

Si agrega o cambia el grupo de recursos al que se distribuye la imagen, asegúrese de que los permisos estén establecidos en el grupo de recursos.

Crear la imagen

Para enviar la configuración de la imagen al servicio VM Image Builder, ejecute los siguientes comandos:

az resource create \
    --resource-group $imageResourceGroup \
    --properties @helloImageTemplateWin.json \
    --is-full-object \
    --resource-type Microsoft.VirtualMachineImages/imageTemplates \
    -n helloImageTemplateWin01

Cuando haya terminado, se devuelve un mensaje de operación correcta a la consola y se crea una plantilla de configuración de VM Image Builder en $imageResourceGroup. Para ver este recurso en el grupo de recursos, vaya a Azure Portal y, luego, habilite Mostrar tipos ocultos.

Asimismo, VM Image Builder crea en segundo plano un grupo de recursos de almacenamiento provisional en la suscripción. Este grupo de recursos se usa para compilar la imagen con el siguiente formato: IT_<DestinationResourceGroup>_<TemplateName>.

Nota

No elimine el grupo de recursos de almacenamiento provisional directamente. En primer lugar, elimine el artefacto de la plantilla de imagen, esto provoca que se elimine el grupo de recursos de almacenamiento provisional.

Si el servicio notifica un error al enviar la plantilla de la configuración de la imagen, haga lo siguiente:

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

Iniciar la generación de imágenes

Inicie el proceso de compilación de la imagen con az resource invoke-action.

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

Espere hasta que se complete la compilación.

Si se producen errores, consulte Solución de problemas del servicio Azure VM Image Builder.

Creación de la máquina virtual

Cree la VM con la imagen que ha compilado. En el código siguiente, reemplace <password> por su propia contraseña para aibuser en la VM.

az vm create \
  --resource-group $imageResourceGroup \
  --name aibImgWinVm00 \
  --admin-username aibuser \
  --admin-password <password> \
  --image $imageName \
  --location $location

Comprobación de la personalización

Cree una conexión de Escritorio remoto a la VM con el nombre de usuario y la contraseña que ha establecido al crear la VM. En la VM, abra una ventana del símbolo del sistema y escriba:

dir c:\

Los dos directorios siguientes se crean durante la personalización de la imagen:

  • buildActions
  • buildArtifacts

Limpieza de los recursos

Cuando haya terminado, elimine los recursos que ha creado.

  1. Elimine la plantilla de VM Image Builder.

    az resource delete \
        --resource-group $imageResourceGroup \
        --resource-type Microsoft.VirtualMachineImages/imageTemplates \
        -n helloImageTemplateWin01
    
  2. Elimine la asignación de roles, la definición de roles y la identidad de usuario.

    az role assignment delete \
        --assignee $imgBuilderCliId \
        --role "$imageRoleDefName" \
        --scope /subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup
    
    az role definition delete --name "$imageRoleDefName"
    
    az identity delete --ids $imgBuilderId
    
  3. Elimine el grupo de recursos de la imagen.

    az group delete -n $imageResourceGroup
    

Pasos siguientes

Para más información sobre los componentes del archivo JSON que se usan en este artículo, consulte la referencia de la plantilla de VM Image Builder.