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:
Tarea de VM Image Builder estable: la compilación estable más reciente que se ha probado y que no presenta problemas con el Reglamento general de protección de datos (RGPD).
Tarea de VM Image Builderinestable: ofrecemos una tarea denominada inestable para que pueda probar las actualizaciones y características más recientes antes de publicar el código de la tarea como estable. Después de una semana, si el cliente no ha notificado ningún problema y no hay problemas de telemetría, promovemos el código de la tarea a estable.
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
Seleccione Canalización de versión>Editar.
En el agente de usuario, seleccione el signo más (+) para agregar y busque Image Builder.
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.
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:
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 directoriowebapp
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
Azure Compute Gallery
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:
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.