Tarea de DevOps del servicio Azure VM Image Builder (versión preliminar)

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

En este artículo, aprenderá a usar una tarea de Azure DevOps para insertar artefactos de compilación en una imagen de máquina virtual, para que pueda instalar y configurar la aplicación y el sistema operativo.

Importante

La tarea de Azure DevOps para VM Image Builder se encuentra actualmente en versión preliminar. Consulte Términos de uso complementarios para las versiones preliminares de Microsoft Azure para conocer los términos legales que se aplican a las características de Azure que se encuentran en la versión beta, en versión preliminar o que todavía no se han publicado para que estén disponibles con carácter general.

Versiones de la tarea de DevOps

En este momento, hay dos tareas de DevOps de Azure VM Image Builder:

Requisitos previos

Nota:

La tarea de VM Image Builder no admite actualmente el reinicio de Windows ni la ejecución de comandos elevados como administrador. Es decir, la tarea no es adecuada para escenarios de Azure Virtual Desktop o personalizaciones de Windows que requieran esas características. Si desea usar DevOps con VM Image Builder, anide la plantilla en una tarea de Azure Resource Manager y use las tareas de la CLI de Azure o de PowerShell.

Antes de comenzar:

  • Instale la tarea de DevOps estable desde Visual Studio Marketplace.

  • Tenga una cuenta de Azure DevOps Services (anteriormente Visual Studio Team Services o VSTS) y cree una canalización de compilación.

  • Registre y habilite los requisitos de las características de VM Image Builder en la suscripción que usan las canalizaciones:

  • Cree una cuenta de almacenamiento de Azure estándar en el grupo de recursos de la imagen de origen. Puede usar otros grupos de recursos o cuentas de almacenamiento. La cuenta de almacenamiento se usa para transferir los artefactos de compilación de la tarea de DevOps a la imagen.

    # Azure PowerShell
    $timeInt=$(get-date -UFormat "%s")
    $storageAccName="aibstorage"+$timeInt
    $location=westus
    # Create a storage account and blob in the resource group
    New-AzStorageAccount -ResourceGroupName $strResourceGroup -Name $storageAccName -Location $location -SkuName Standard_LRS
    
    # The Azure CLI
    location=westus
    scriptStorageAcc=aibstordot$(date +'%s')
    # Create a storage account and blob in the resource group
    az storage account create -n $scriptStorageAcc -g $strResourceGroup -l $location --sku Standard_LRS
    

Adición de una tarea a la canalización de versión

  1. Seleccione Canalización de versión>Editar.

  2. En el agente de usuario, seleccione el signo más (+) para agregar y busque Image Builder.

  3. Seleccione Agregar.

En las secciones siguientes, establezca las propiedades de la tarea.

Suscripción de Azure

En la lista desplegable, seleccione la suscripción en la que quiere que se ejecute VM Image Builder. Use la suscripción en la que se almacenan las imágenes de origen y donde se van a distribuir las imágenes. Debe conceder el acceso de colaborador de VM Image Builder a la suscripción o al grupo de recursos.

Grupo de recursos

Use el grupo de recursos donde se almacenará el artefacto de plantilla de imagen temporal. Al crear un artefacto de plantilla, se crea otro grupo de recursos de VM Image Builder temporal: IT_<DestinationResourceGroup>_<TemplateName>_guid. El grupo de recursos temporal almacena los metadatos de la imagen, como scripts. Al final de la tarea, se eliminan el artefacto de la plantilla de imagen y el grupo de recursos de VM Image Builder temporal.

Location

La ubicación es la región en la que se ejecutará VM Image Builder. Solo se admite un número establecido de regiones. Las imágenes de origen deben estar presentes en esta ubicación. Por ejemplo, si va a usar Azure Compute Gallery (anteriormente denominado Shared Image Gallery), debe existir una réplica en esa región.

Identidad administrada (requerida)

VM Image Builder requiere una identidad administrada, que se usa para leer imágenes personalizadas de origen, conectarse a Azure Storage y crear imágenes personalizadas. Para más información, consulte Más información sobre VM Image Builder.

Compatibilidad con redes virtuales

Puede configurar la máquina virtual creada para que esté en una red virtual específica. Cuando configure la tarea, proporcione el identificador de recurso de una subred ya existente en el campo de entrada Configuración de VNet (opcional). Omita este identificador si no es necesario usar ninguna red virtual específica. Para más información, consulte Opciones de red de Azure VM Image Builder.

Origen

Las imágenes de origen deben ser de los sistemas operativos compatibles con VM Image Builder. Puede elegir imágenes personalizadas existentes en la misma región desde la que se ejecuta VM Image Builder:

  • Imagen administrada: pase el identificador de recurso. Por ejemplo:

    /subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/images/<imageName>
    
  • Compute Gallery: pase el identificador de recurso de la versión de la imagen. Por ejemplo:

    /subscriptions/$subscriptionID/resourceGroups/$sigResourceGroup/providers/Microsoft.Compute/galleries/$sigName/images/$imageDefName/versions/<versionNumber>
    

    Si necesita obtener la versión más reciente de Compute Gallery, use una tarea de Azure PowerShell o la CLI de Azure para obtenerla y establecer una variable de DevOps. Use la variable en la tarea de DevOps de VM Image Builder. Para más información, consulte los ejemplos de Obtención del identificador de recurso de la versión de imagen más reciente.

  • (Marketplace) Imagen base: use la lista desplegable de imágenes populares ya que esta siempre usa la versión más reciente de los sistemas operativos compatibles.

    Si la imagen base no está en la lista, puede especificar la imagen exacta mediante Publisher:Offer:Sku.

    Versión de la imagen base (opcional): puede proporcionar la versión de la imagen que desea usar. La versión predeterminada es latest.

Personalizar

En las secciones siguientes se describen varias maneras de personalizar las tareas.

Aprovisionador

Inicialmente, se admiten dos personalizadores: Shell y PowerShell. Solo se admite la inserción. Si desea descargar scripts, puede pasar comandos insertados para hacerlo.

Para el sistema operativo, seleccione PowerShell o Shell.

Tarea de Windows Update

Solo para Windows, la tarea ejecuta Windows Update al final de las personalizaciones. También controla los reinicios necesarios.

La tarea ejecuta la siguiente configuración de Windows Update:

    "type": "WindowsUpdate",
    "searchCriteria": "IsInstalled=0",
    "filters": [
        "exclude:$_.Title -like '*Preview*'",
        "include:$true"

La tarea instala las actualizaciones de Windows importantes y recomendadas que no están en versión preliminar.

Control de los reinicios

La tarea de DevOps no admite actualmente el reinicio de las compilaciones de Windows. Si intenta reiniciar con código de PowerShell, se produce un error en la compilación. Sin embargo, puede usar código para reiniciar las compilaciones de Linux.

Ruta de acceso de compilación

La tarea está diseñada para poder insertar artefactos de versión de compilación de DevOps en la imagen. Para realizar este trabajo, debe configurar una canalización de compilación. En la configuración de la canalización de versión, agregue el repositorio de los artefactos de compilación.

Screenshot showing how to add an artifact in the release pipeline.

Seleccione el botón Ruta de acceso de compilación para elegir la carpeta de compilación que desea colocar en la imagen. La tarea de VM Image Builder copia todos los archivos y directorios que contiene. Cuando se crea la imagen, VM Image Builder implementa los archivos y directorios en diferentes rutas de acceso, en función del sistema operativo.

Importante

Al agregar un artefacto de repositorio, es posible que el nombre del directorio venga precedido por un carácter de subrayado (_). El guion bajo puede producir problemas con los comandos insertados. Asegúrese de que usa las comillas adecuadas en los comandos.

En los ejemplos siguientes se explica cómo funciona:

Screenshot of a directory structure showing hierarchy.

  • En Windows: los archivos existen en la unidad C:. Se crea un directorio denominado buildArtifacts que incluye el directorio webapp.

  • En Linux: los archivos existen en el directorio /tmp. Se crea el directorio webapp que incluye todos los archivos y directorios. Dado que se trata de un directorio temporal, debe mover los archivos fuera de él. De lo contrario, se eliminarán.

Script de personalización insertado

  • En Windows: puede escribir comandos insertados de PowerShell separados por comas. Si desea ejecutar un script en el directorio de compilación, puede usar:

    & 'c:\buildArtifacts\webapp\webconfig.ps1'
    

    Puede hacer referencia a varios scripts o agregar más comandos. Por ejemplo:

    & 'c:\buildArtifacts\webapp\webconfig.ps1'
    & 'c:\buildArtifacts\webapp\installAgent.ps1'
    
  • En Linux: los artefactos de compilación se colocan en el directorio /tmp. Sin embargo, en muchos sistemas operativos Linux, al reiniciar, se elimina el contenido del directorio /tmp. Si desea que los artefactos existan en la imagen, debe crear otro directorio y copiarlos. Por ejemplo:

    sudo mkdir /lib/buildArtifacts
    sudo cp -r "/tmp/_ImageBuilding/webapp" /lib/buildArtifacts/.
    

    Si está de acuerdo con el uso del directorio /tmp, puede ejecutar el script mediante el código siguiente:

    # Grant execute permissions to run scripts
    sudo chmod +x "/tmp/_ImageBuilding/webapp/coreConfig.sh"
    echo "running script"
    sudo . "/tmp/AppsAndImageBuilderLinux/_WebApp/coreConfig.sh"
    

¿Qué ocurre con los artefactos de compilación después de la compilación de la imagen?

Nota

VM Image Builder no elimina automáticamente los artefactos de compilación. Se recomienda encarecidamente usar siempre código para eliminar los artefactos de compilación.

  • En Windows: VM Image Builder implementa archivos en el directorio C:\buildArtifacts. Dado que el directorio se conserva, debe eliminarlo mediante la ejecución de un script. Por ejemplo:

    # Clean up buildArtifacts directory
    Remove-Item -Path "C:\buildArtifacts\*" -Force -Recurse
    
    # Delete the buildArtifacts directory
    Remove-Item -Path "C:\buildArtifacts" -Force
    
  • En Linux: los artefactos de compilación se colocan en el directorio /tmp. Sin embargo, en muchos sistemas operativos Linux, al reiniciar, se elimina el contenido del directorio /tmp. Se sugiere que use código para eliminar el contenido y no basarse para ello en el sistema operativo. Por ejemplo:

    sudo rm -R "/tmp/AppsAndImageBuilderLinux"
    

Longitud total de la compilación de la imagen

La longitud total no se puede cambiar todavía en la tarea de canalización de DevOps. Utiliza el valor predeterminado de 240 minutos. Si desea aumentar el valor de buildTimeoutInMinutes, puede usar una tarea de la CLI de Azure en la canalización de versión. Configure la tarea para copiar una plantilla y enviarla. Para obtener una solución de ejemplo, consulte Uso de variables de entorno y parámetros con VM Image Builder o uso de Azure PowerShell.

Cuenta de almacenamiento

Seleccione la cuenta de almacenamiento que creó en los requisitos previos. Si no la ve en la lista, VM Image Builder no tiene permisos para ello.

Cuando se inicia la compilación, VM Image Builder crea un contenedor denominado imagebuilder-vststask, donde se almacenan los artefactos de compilación del repositorio.

Nota

Debe eliminar manualmente la cuenta de almacenamiento o el contenedor después de cada compilación.

Distribución

Se admiten los tres tipos de distribución siguientes.

Imagen administrada

  • Identificador de recurso:

    /subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/images/<imageName>
    
  • Ubicaciones

Compute Gallery ya debe existir.

  • Identificador de recurso:

    /subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<galleryName>/images/<imageDefName>
    
  • Regiones: una lista de regiones, separadas por comas. Por ejemplo: westus, eastus, centralus.

Disco duro virtual

No se pueden pasar valores a este. VM Image Builder emite el disco duro virtual al grupo de recursos temporal de VM Image Builder, IT_<DestinationResourceGroup>_<TemplateName>, en el contenedor vhds. Cuando se inicia la compilación de versión, VM Image Builder emite registros. Cuando haya finalizado VM Image Builder, este emite la dirección URL del disco duro virtual.

Configuración opcional

Puede reemplazar el valor del tamaño de la máquina virtual, a partir del valor predeterminado Standard_D1_v2. Es posible que quiera hacerlo para reducir el tiempo total de personalización. También puede crear imágenes que dependan de determinados tamaños de máquina virtual, como GPU (unidad de procesamiento gráfico), HPC (informática de alto rendimiento), etc.

Funcionamiento de la tarea

Al crear la versión, la tarea crea un contenedor en la cuenta de almacenamiento, denominado imagebuilder-vststask. Comprime y carga los artefactos de compilación, y crea un token de firma de acceso compartido para el archivo ZIP.

La tarea utiliza las propiedades que se pasan a la tarea para crear el artefacto de plantilla de VM Image Builder. La tarea realiza lo siguiente:

  • Descarga el archivo ZIP del artefacto de compilación y cualquier otro script asociado. Los archivos se guardan en una cuenta de almacenamiento en el grupo de recursos IT_<DestinationResourceGroup>_<TemplateName> de VM Image Builder temporal.

  • Crea una plantilla con el prefijo t_ y un entero de 10 dígitos monotónico. La plantilla se guarda en el grupo de recursos que seleccionó y existe mientras dure la compilación en el grupo de recursos.

Salida de ejemplo:

start reading task parameters...
found build at:  /home/vsts/work/r1/a/_ImageBuilding/webapp
end reading parameters
getting storage account details for aibstordot1556933914
created archive /home/vsts/work/_temp/temp_web_package_21475337782320203.zip
Source for image:  { type: 'SharedImageVersion',
  imageVersionId: '/subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<galleryName>/images/<imageDefName>/versions/<imgVersionNumber>' }
template name:  t_1556938436xxx
starting put template...

Cuando se inicia la compilación de la imagen, el estado de ejecución se muestra en los registros de versión:

starting run template...

Cuando se complete la compilación de la imagen, verá un texto similar al siguiente:

2019-05-06T12:49:52.0558229Z starting run template...
2019-05-06T13:36:33.8863094Z run template:  Succeeded
2019-05-06T13:36:33.8867768Z getting runOutput for  SharedImage_distribute
2019-05-06T13:36:34.6652541Z ==============================================================================
2019-05-06T13:36:34.6652925Z ## task output variables ##
2019-05-06T13:36:34.6658728Z $(imageUri) =  /subscriptions/<subscriptionID>/resourceGroups/aibwinsig/providers/Microsoft.Compute/galleries/my22stSIG/images/winWAppimages/versions/0.23760.13763
2019-05-06T13:36:34.6659989Z ==============================================================================
2019-05-06T13:36:34.6663500Z deleting template t_1557146959485...
2019-05-06T13:36:34.6673713Z deleting storage blob imagebuilder-vststask\webapp/18-1/webapp_1557146958741.zip
2019-05-06T13:36:34.9786039Z blob imagebuilder-vststask\webapp/18-1/webapp_1557146958741.zip is deleted
2019-05-06T13:38:37.4884068Z delete template:  Succeeded

La plantilla de imagen y IT_<DestinationResourceGroup>_<TemplateName> se eliminan.

Puede tomar la variable $(imageUri) de Azure DevOps Services (anteriormente Visual Studio Team Services o VSTS) y usarla en la siguiente tarea o simplemente usar el valor y crear una máquina virtual.

Variables de DevOps de salida

Aquí están el publicador, la oferta, la SKU y la versión de la imagen de Marketplace de origen:

  • $(pirPublisher)
  • $(pirOffer)
  • $(pirSku)
  • $(pirVersion)

Este es el URI de la imagen, que es el identificador de recurso de la imagen distribuida:

  • $(imageUri)

Preguntas más frecuentes

¿Puedo usar una plantilla de imagen existente que ya he creado, fuera de DevOps?

De momento, no.

¿Se puede especificar el nombre de la plantilla de imagen?

No. Se usa un nombre de plantilla único y luego se elimina.

Error en la tarea de VM Image Builder. ¿Cómo puedo solucionar el problema?

Si se produce un error de compilación, la tarea de DevOps no elimina el grupo de recursos de almacenamiento provisional. Puede acceder al grupo de recursos de almacenamiento provisional que contiene el registro de personalización de compilación.

Verá un error en el registro de DevOps de la tarea de VM Image Builder y el mensaje incluirá la ubicación del archivo customization.log. Por ejemplo:

Screenshot of an example DevOps task error that describes the failure and provides the location of the customization.log file.

Para más información, consulte Solución de problemas del servicio VM Image Builder.

Después de investigar el error, puede eliminar el grupo de recursos de almacenamiento provisional. En primer lugar, elimine el artefacto de recursos de la plantilla de VM Image Builder. El artefacto viene precedido por t_ y se puede encontrar en el registro de compilación de la tarea de DevOps:

...
Source for image:  { type: 'SharedImageVersion',
  imageVersionId: '/subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<galleryName>/images/<imageDefName>/versions/<imgVersionNumber>' }
...
template name:  t_1556938436xxx
...

El artefacto de recurso de la plantilla de VM Image Builder está en el grupo de recursos que se especificó inicialmente en la tarea. Cuando haya terminado de solucionar problemas, elimine el artefacto. Si va a realizar la eliminación mediante Azure Portal, dentro del grupo de recursos, seleccione Mostrar tipos ocultos para ver el artefacto.

Pasos siguientes

Para más información, consulte Introducción a VM Image Builder.