Introducción a las aplicaciones de máquina virtual (versión preliminar)

Las aplicaciones de máquina virtual son un tipo de recurso de Azure Compute Gallery (anteriormente denominada Shared Image Gallery) que simplifica la administración, el uso compartido y la distribución global de aplicaciones de las máquinas virtuales.

Aunque puede crear una imagen de una máquina virtual con aplicaciones preinstaladas, deberá actualizar la imagen cada vez que tenga cambios en la aplicación. Separar la instalación de la aplicación de las imágenes de máquina virtual significa que no es necesario publicar una nueva imagen con cada cambio de línea de código.

Los paquetes de aplicación proporcionan ventajas con respecto a otros métodos de implementación y empaquetado:

  • Las aplicaciones de máquina virtual tienen compatibilidad con las directivas de Azure

  • Agrupación y control de versiones de los paquetes

  • Las aplicaciones de máquina virtual se pueden replicar globalmente para estar más cerca de la infraestructura, por lo que no es necesario usar AzCopy u otros mecanismos de copia de almacenamiento para copiar los bits entre regiones de Azure.

  • Uso compartido con otros usuarios mediante el control de acceso basado en rol (RBAC) de Azure

  • Compatibilidad con máquinas virtuales y conjuntos de escalado flexibles y uniformes

  • Si tiene ha aplicado reglas de grupo de seguridad de red (NSG) a la máquina virtual o al conjunto de escalado, puede que no sea posible descargar los paquetes de un repositorio de Internet. Además, con las cuentas de almacenamiento, para descargar paquetes en máquinas virtuales bloqueadas sería necesario configurar vínculos privados.

  • Compatibilidad con blobs en bloques: esta característica permite controlar archivos grandes de forma eficaz, ya que los divide en bloques más pequeños y administrables. Es ideal para cargar grandes cantidades de datos, para hacer streaming y la carga en segundo plano.

¿Qué son los paquetes de aplicaciones de máquina virtual?

Los paquetes de aplicación de máquina virtual usan varios tipos de recursos:

Resource Descripción
Azure Compute Gallery Una galería es un repositorio para administrar y compartir paquetes de aplicaciones. Los usuarios pueden compartir el recurso de la galería y todos los recursos secundarios se comparten automáticamente. El nombre de la galería debe ser único en cada suscripción. Por ejemplo, puede tener una galería para almacenar todas las imágenes del sistema operativo y otra para almacenar todas las aplicaciones de máquina virtual.
Aplicación de máquina virtual Definición de la aplicación de máquina virtual. Se trata de un recurso lógico que almacena los metadatos comunes de todas las versiones que hay en él. Por ejemplo, puede tener una definición de aplicación para Apache Tomcat y tener varias versiones dentro de ella.
Versión de aplicación de máquina virtual Recurso que se puede implementar. Puede replicar globalmente las versiones de la aplicación de máquina virtual en regiones de destino próximas a la infraestructura de la máquina virtual. La versión de aplicación de máquina virtual se debe replicar en una región para que se pueda implementar en una máquina virtual de esa región.

Limitaciones

  • No más de tres réplicas por región: al crear una versión de aplicación de máquina virtual, el número máximo de réplicas por región es tres.

  • Almacenamiento con acceso público o URI de SAS con privilegios de lectura: la cuenta de almacenamiento debe tener acceso de nivel público o usar un URI de SAS con privilegios de lectura, ya que otros niveles de restricción no pueden realizar implementaciones.

  • Reintento de instalaciones con errores: actualmente, la única manera de reintentar una instalación con errores es quitar la aplicación del perfil y, luego, volver a agregarla.

  • Solo 25 aplicaciones por máquina virtual: no se pueden implementar más de 25 aplicaciones en una máquina virtual en cualquier momento.

  • Tamaño de aplicación de 2 GB: el tamaño máximo de archivo de una versión de aplicación es de 2 GB.

  • Sin garantías de reinicios en el script: si el script requiere un reinicio, se recomienda colocar la aplicación en último lugar durante la implementación. Aunque el código intenta controlar los reinicios, se puede producir un error.

  • Se requiere un agente de máquina virtual: el agente de máquina virtual debe existir en la máquina virtual y ser capaz de recibir los estados objetivo.

  • Varias versiones de la misma aplicación en la misma máquina virtual: no puede tener varias versiones de la misma aplicación en una máquina virtual.

  • Operaciones de migración no admitidas actualmente: no se admite la migración de máquinas virtuales con aplicaciones de máquina virtual a otros grupos de recursos en este momento.

Nota:

En el caso de Azure Compute Gallery y las aplicaciones de máquina virtual, la SAS de almacenamiento se puede eliminar después de la replicación. Sin embargo, cualquier operación de actualización posterior requerirá una SAS válida.

Costos

No hay ningún cargo adicional por el uso de paquetes de aplicación de máquina virtual, pero se le cobra por los siguientes recursos:

  • Costos de almacenamiento de cada paquete y de las réplicas.
  • Cargos de salida de red para la replicación de la primera versión de la imagen desde la región de origen a las regiones replicadas. Las réplicas subsiguientes se tratan dentro de la región, por lo que no habrá ningún cargo adicional.

Para más información sobre la salida de la red, consulte Detalles de precios de ancho de banda.

Aplicaciones de máquina virtual

El recurso de aplicación de máquina virtual define lo siguiente sobre la aplicación de máquina virtual:

  • La instancia de Azure Compute Gallery donde se almacena la aplicación de máquina virtual
  • Nombre de la aplicación
  • Tipo de sistema operativo compatible, como Linux o Windows
  • Descripción de la aplicación de máquina virtual

Versiones de aplicación de máquina virtual

Las versiones de la aplicación de máquina virtual son el recurso que se puede implementar. Las versiones se definen con las siguientes propiedades:

  • Número de la versión
  • Vínculo al archivo de paquete de aplicación en una cuenta de almacenamiento
  • Cadena de instalación de la aplicación
  • Cadena de eliminación para mostrar cómo quitar correctamente la aplicación
  • Nombre de archivo del paquete que se usará cuando se descargue en la máquina virtual
  • Nombre del archivo de configuración que se usará para configurar la aplicación en la máquina virtual
  • Vínculo al archivo de configuración de la aplicación de máquina virtual, que puede incluir archivos de licencia
  • Cadena de actualización para saber cómo actualizar la aplicación de máquina virtual a una versión más reciente
  • Fecha final del ciclo de vida. Las fechas de fin de ciclo de vida son informativas; puede seguir implementando versiones de aplicación de máquina virtual pasada la fecha de fin de ciclo de vida.
  • Excluir de la versión más reciente. Puede evitar que se use una versión como la versión más reciente de la aplicación.
  • Regiones de destino de la replicación
  • Recuento de réplicas por región

Directorio de descarga

La ubicación de descarga del paquete de aplicación y los archivos de configuración son:

  • Linux: /var/lib/waagent/Microsoft.CPlat.Core.VMApplicationManagerLinux/<appname>/<app version>
  • Windows: C:\Packages\Plugins\Microsoft.CPlat.Core.VMApplicationManagerWindows\1.0.9\Downloads\<appname>\<app version>

Los comandos de instalación, actualización y eliminación deben escribirse suponiendo que el paquete de aplicación y el archivo de configuración se encuentran en el directorio actual.

Nomenclatura de los archivos

Cuando el archivo de aplicación se descarga en la máquina virtual, se cambia el nombre de "MyVmApp" (sin extensión). Esto se debe a que la máquina virtual no es consciente del nombre o la extensión originales del paquete. Esta utiliza el único nombre que tiene, que es el propio nombre de la aplicación: "MyVmApp".

Estas son algunas alternativas para navegar por este problema:

Puede modificar el script para incluir un comando que cambie el nombre del archivo antes de la ejecución:

move .\\MyVmApp .\\MyApp.exe & MyApp.exe /S

También puede usar la propiedad packageFileName (y la correspondiente configFileName) para indicarnos qué nombre colocarle al archivo. Por ejemplo, si se establece en "MyApp.exe", el script de instalación solo debe ser:

MyAppe.exe /S

Sugerencia

Si el blob se llamaba originalmente "myApp.exe" en lugar de "myapp", el script anterior habría funcionado sin necesidad de establecer la propiedad packageFileName.

Intérprete de comandos

Los intérpretes de comandos predeterminados son:

  • Linux: /bin/bash
  • Windows: cmd.exe

Es posible usar un intérprete diferente como Chocolatey o PowerShell, siempre y cuando esté instalado en el equipo, llamando al ejecutable y pasándole el comando. Por ejemplo, para que el comando se ejecute en PowerShell en Windows en lugar de en el símbolo del sistema, puede pasar powershell.exe -Command '<powershell commmand>'.

Control de las actualizaciones

Al actualizar una versión de la aplicación on VM o Virtual Machine Scale Sets, se usa el comando de actualización que proporcionó durante la implementación. Si la versión actualizada no tiene un comando de actualización, se quita la versión actual y se instala la nueva versión.

Los comandos de actualización deben escribirse con la expectativa de que se podrían estar actualizando desde cualquier versión anterior de la aplicación de máquina virtual.

Sugerencias para crear aplicaciones de máquina virtual en Linux

Las aplicaciones de terceros para Linux se pueden empaquetar de varias maneras. Vamos a examinar cómo controlar la creación de algunos de los comandos de instalación más comunes.

Archivos .tar y .gz

Estos archivos son archivos comprimidos y se pueden extraer en la ubicación deseada. Compruebe las instrucciones de instalación del paquete original en caso de que deban extraerse en una ubicación específica. Si el archivo .tar. o .gz contiene código fuente, consulte las instrucciones del paquete para ver cómo realizar la instalación desde dicho código.

Ejemplo de comando de instalación para instalar golang en una máquina Linux:

sudo tar -C /usr/local -xzf go_linux

Comando de eliminación de ejemplo:

sudo rm -rf /usr/local/go

Creación de paquetes de aplicación mediante .deb, .rpm y otros paquetes específicos de la plataforma para máquinas virtuales con acceso restringido a Internet

Puede descargar paquetes individuales de administradores de paquetes específicos de la plataforma, pero normalmente no contienen todas las dependencias. Con estos archivos, también debe incluir todas las dependencias del paquete de aplicación o indicar al administrador de paquetes del sistema que descargue las dependencias a través de los repositorios que están disponibles para la máquina virtual. Si trabaja con una máquina virtual con acceso restringido a Internet, debe empaquetar todas las dependencias por su cuenta.

Solucionar las dependencias puede ser un poco complicado. Existen herramientas de terceros que pueden mostrar todo el árbol de dependencias.

En Ubuntu, puede ejecutar sudo apt show <package_name> | grep Depends para mostrar todos los paquetes que se instalan al ejecutar el comando sudo apt-get install <packge_name>. Luego, puede usar esa salida para descargar todos los archivos .deb y crear un archivo que se pueda usar como paquete de aplicación.

  1. Por ejemplo, para crear un paquete de aplicación de máquina virtual para instalar PowerShell para Ubuntu, ejecute primero los siguientes comandos para habilitar el repositorio desde el que se puede descargar PowerShell y también para identificar las dependencias del paquete en una nueva máquina virtual Ubuntu.
# Download the Microsoft repository GPG keys
wget -q "https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb"
# Register the Microsoft repository GPG keys
sudo dpkg -i packages-microsoft-prod.deb
sudo rm -rf packages-microsoft-prod.deb
sudo apt update
sudo apt show powershell | grep Depends
  1. Compruebe la salida de la línea Depends que está formada por los siguientes paquetes:
Depends: libc6, lib32gcc-s1, libgssapi-krb5-2, libstdc++6, zlib1g, libicu72|libicu71|libicu70|libicu69|libicu68|libicu67|libicu66|libicu65|libicu63|libicu60|libicu57|libicu55|libicu52, libssl3|libssl1.1|libssl1.0.2|libssl1.
  1. Descargue cada uno de estos archivos mediante sudo apt-get download <package_name> y cree un archivo comprimido tar con todos los archivos.
  • Ubuntu 18.04:
mkdir /tmp/powershell
cd /tmp/powershell
sudo apt-get download libc6
sudo apt-get download lib32gcc-s1
sudo apt-get download libgssapi-krb5-2
sudo apt-get download libstdc++6
sudo apt-get download zlib1g
sudo apt-get download libssl1.1
sudo apt-get download libicu60
sudo apt-get download powershell
sudo tar -cvzf powershell.tar.gz *.deb
  • Ubuntu 20.04:
mkdir /tmp/powershell
cd /tmp/powershell
sudo apt-get download libc6
sudo apt-get download lib32gcc-s1
sudo apt-get download libgssapi-krb5-2
sudo apt-get download libstdc++6
sudo apt-get download zlib1g
sudo apt-get download libssl1.1
sudo apt-get download libicu66
sudo apt-get download powershell
sudo tar -cvzf powershell.tar.gz *.deb
  • Ubuntu 22.04:
mkdir /tmp/powershell
cd /tmp/powershell
sudo apt-get download libc6
sudo apt-get download lib32gcc-s1
sudo apt-get download libgssapi-krb5-2
sudo apt-get download libstdc++6
sudo apt-get download zlib1g
sudo apt-get download libssl3
sudo apt-get download libicu70
sudo apt-get download powershell
sudo tar -cvzf powershell.tar.gz *.deb
  1. Este archivo .tar es el archivo de paquete de aplicación.
  • En este caso, el comando de instalación es:
sudo tar -xvzf powershell.tar.gz && sudo dpkg -i *.deb
  • Y el comando de eliminación es:
sudo apt remove powershell

Use sudo apt autoremove en lugar de intentar quitar explícitamente todas las dependencias. Es posible que haya instalado otras aplicaciones con dependencias superpuestas y, en ese caso, se producirá un error en un comando de eliminación explícito.

Si no quiere resolver las dependencias por su cuenta y apt puede conectarse a los repositorios, puede instalar una aplicación con un solo archivo .deb y dejar que apt controle las dependencias.

Comando de instalación de ejemplo:

dpkg -i <package_name> || apt --fix-broken install -y

Sugerencias para crear aplicaciones de máquina virtual en Windows

La mayoría de las aplicaciones de terceros en Windows están disponibles como instaladores .exe o .msi. Algunas también están disponibles como archivos ZIP de extracción y ejecución. Echemos un vistazo a los procedimientos recomendados para cada uno de ellos.

Instalador .exe

Normalmente, los ejecutables del instalador inician una interfaz de usuario (UI) en la que alguien debe realizar una selección. Si el instalador admite un parámetro de modo silencioso, debe incluirse en la cadena de instalación.

Cmd.exe también espera que los archivos ejecutables tengan la extensión .exe, por lo que debe cambiar el nombre del archivo para que tenga esta extensión .exe.

Si quisiera crear un paquete de aplicación de máquina virtual para myApp.exe, que se distribuye como ejecutable, como mi aplicación de máquina virtual se denomina "myApp", escribo el comando suponiendo que el paquete de aplicación está en el directorio actual:

"move .\\myApp .\\myApp.exe & myApp.exe /S -config myApp_config"

Si el archivo ejecutable del instalador no admite un parámetro de desinstalación, a veces se puede buscar en el Registro de una máquina de prueba para saber dónde se encuentra el desinstalador.

En el Registro, la cadena de desinstalación se almacena en Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\<installed application name>\UninstallString, por lo que usaría el contenido como mi comando de eliminación:

'\"C:\\Program Files\\myApp\\uninstall\\helper.exe\" /S'

Instalador MSI

Para la ejecución de la línea de comandos de los instaladores .msi, los comandos para instalar o quitar una aplicación deben usar msiexec. Normalmente, msiexec se ejecuta como su propio proceso independiente y cmd no espera a que se complete, lo que puede provocar problemas al instalar más de una aplicación de máquina virtual. El comando start se puede usar con msiexec para asegurarse de que la instalación se completa antes de que el comando devuelva resultados. Por ejemplo:

start /wait %windir%\\system32\\msiexec.exe /i myapp /quiet /forcerestart /log myapp_install.log

Comando de eliminación de ejemplo:

start /wait %windir%\\system32\\msiexec.exe /x $appname /quiet /forcerestart /log ${appname}_uninstall.log

Por lo general, se llamaría al comando start dentro de un script por lotes. Si se usa con el parámetro /wait, el script de llamada se pausará hasta que finalice el proceso llamado. Una vez completado, el script por lotes comprobaría la variable errorlevel establecida por el comando start y salir de la siguiente manera:

start /wait %windir%\\system32\\msiexec.exe /i myapp /quiet /forcerestart /log myapp_install.log
if %errorlevel% neq 0 exit /b %errorlevel%
...

Archivos comprimidos

En el caso de archivos ZIP u otros archivos comprimidos, cambie el nombre y descomprima el contenido del paquete de aplicación en el destino deseado.

Comando de instalación de ejemplo:

rename myapp myapp.zip && mkdir C:\myapp && powershell.exe -Command "Expand-Archive -path myapp.zip -destinationpath C:\myapp"

Comando de eliminación de ejemplo:

rmdir /S /Q C:\\myapp

Tratar el error como error de implementación

La extensión de aplicación de máquina virtual siempre devuelve un resultado correcto, independientemente de si alguna aplicación de máquina virtual no se pudo instalar, actualizar o quitar. La extensión de aplicación de máquina virtual solo informa del estado de la extensión como error cuando hay un problema con la extensión o con la infraestructura subyacente. Este comportamiento se desencadena mediante la marca "Tratar el error como error de implementación", que se establece en $false de forma predeterminada y se puede cambiar a $true. La marca de error se puede configurar en PowerShell o la CLI.

Solución de problemas de aplicaciones de máquina virtual

Para saber si una aplicación de máquina virtual determinada se agregó correctamente a la instancia de máquina virtual, compruebe el mensaje de la extensión de la aplicación de máquina virtual.

Para más información sobre cómo obtener el estado de las extensiones de máquina virtual, consulte Características y extensiones de las máquinas virtuales para Linux y Características y extensiones de las máquinas virtuales para Windows.

Para obtener el estado de las extensiones de máquina virtual, use Get-AzVM:

Get-AzVM -name <VM name> -ResourceGroupName <resource group name> -Status | convertto-json -Depth 10

Para obtener el estado de las extensiones de conjunto de escalado, use Get-AzVMSS:

$result = Get-AzVmssVM -ResourceGroupName $rgName -VMScaleSetName $vmssName -InstanceView
$resultSummary  = New-Object System.Collections.ArrayList
$result | ForEach-Object {
    $res = @{ instanceId = $_.InstanceId; vmappStatus = $_.InstanceView.Extensions | Where-Object {$_.Name -eq "VMAppExtension"}}
    $resultSummary.Add($res) | Out-Null
}
$resultSummary | convertto-json -depth 5

Mensajes de error

Message Descripción
La versión actual de la aplicación de máquina virtual {name} se dejó de usar el {date}. Ha intentado implementar una versión de aplicación de máquina virtual que ya está en desuso. Pruebe a usar latest en lugar de especificar una versión concreta.
La versión actual de la aplicación de máquina virtual {name} admite el sistema operativo OS {OS}, pero el sistema operativo actual de OSDisk es {OS}. Ha intentado implementar una aplicación de Linux en una instancia de Windows o viceversa.
Se ha superado el número máximo de aplicaciones de máquina virtual (max=5, current={count}). Use menos aplicaciones y vuelva a intentar la solicitud. Actualmente solo se admiten cinco aplicaciones de máquina virtual por máquina virtual o conjunto de escalado.
Se especificó más de una aplicación de máquina virtual con el mismo valor de packageReferenceId. Se especificó la misma aplicación más de una vez.
Suscripción no autorizada para acceder a esta imagen. La suscripción no tiene acceso a esta versión de la aplicación.
Storage account in the arguments doesn't exist (La cuenta de almacenamiento de los argumentos no existe). No hay aplicaciones para esta suscripción.
La imagen de plataforma {image} no está disponible. Compruebe que todos los campos del perfil de almacenamiento son correctos. Para más detalles sobre la información del perfil de almacenamiento, consulte https://aka.ms/storageprofile. The application doesn't exist (La aplicación no existe).
La imagen de la galería {image} no está disponible en la región {region}. Póngase en contacto con el propietario de la imagen para replicarla en esta región o cambie la región solicitada. La versión de la aplicación de la galería existe, pero no se replicó en esta región.
La SAS no es válida para el URI de origen {uri}. Se recibió un error Forbidden del almacenamiento al intentar recuperar información sobre la dirección URL (mediaLink o defaultConfigurationLink).
The blob referenced by source uri {uri} doesn't exist (El blob al que hace referencia el URI de origen {uri} no existe). El blob proporcionado para las propiedades mediaLink o defaultConfigurationLink no existe.
No se puede acceder a la dirección URL de la versión de la aplicación de la galería {url} debido al siguiente error: no se encontró el nombre remoto. Asegúrese de que el blob existe y que es accesible públicamente o es una dirección URL de SAS con privilegios de lectura. El caso más probable es que no se haya proporcionado un URI de SAS con privilegios de lectura.
No se puede acceder a la dirección URL de la versión de la aplicación de la galería {url} debido al siguiente error: {error description}. Asegúrese de que el blob existe y que es accesible públicamente o es una dirección URL de SAS con privilegios de lectura. Hubo un problema con el blob de almacenamiento proporcionado. En la descripción del error proporciona más información.
No se permite la operación {operationName} en {application}, ya que está marcada para su eliminación. Solo puede volver a intentar realizar la operación de eliminación (o esperar hasta que se complete una en curso). Intente actualizar una aplicación que se está eliminando actualmente.
El valor {value} del parámetro "galleryApplicationVersion.properties.publishingProfile.replicaCount" está fuera del intervalo. El valor debe estar entre uno y tres, ambos inclusive. Solo se permiten entre uno y tres réplicas para las versiones de la aplicación de máquina virtual.
No se permite cambiar la propiedad "galleryApplicationVersion.properties.publishingProfile.manageActions.install". (puede actualizarla o eliminarla) No es posible cambiar ninguna de las acciones de administración en una instancia de VmApplication existente. Se debe crear otra versión de VmApplication.
No se permite cambiar la propiedad "galleryApplicationVersion.properties.publishingProfile.settings.packageFileName". (o configFileName) No es posible cambiar ninguna de las opciones, como el nombre del archivo de paquete o el nombre del archivo de configuración. Se debe crear otra versión de VmApplication.
El blob al que hace referencia el URI de origen {uri} es demasiado grande: size = {size}. El tamaño máximo de blob permitido es "1 GB". El tamaño máximo de un blob al que hace referencia mediaLink o defaultConfigurationLink es actualmente de 1 GB.
El blob al que hace referencia el URI de origen {uri} está vacío. Se hizo referencia a un blob vacío.
El tipo de blob {type} no se admite para la operación {operation}. Solo se admiten blobs en páginas y blobs en bloques. VmApplications solo admite blobs en páginas y blobs en bloques.
La SAS no es válida para el URI de origen {uri}. El URI de SAS proporcionado para mediaLink o defaultConfigurationLink no es un URI de SAS válido.
No se puede especificar {region} en las regiones de destino porque falta la característica necesaria {featureName}. Registre la suscripción con la característica necesaria o quite la región de la lista de regiones de destino. Para usar VmApplications en determinadas regiones restringidas, es necesario tener registrada la marca de características para esa suscripción.
Las regiones del perfil de publicación de la versión de imagen de la galería {regions} deben contener la ubicación de la versión de imagen {location}. La lista de regiones para la replicación debe contener la ubicación donde se encuentra la versión de la aplicación.
No se permiten regiones duplicadas en las regiones de publicación de destino. Es posible que las regiones de publicación no tengan duplicados.
Actualmente, los recursos de la versión de la aplicación de la galería no admiten el cifrado. La propiedad de cifrado para las regiones de destino no se admite en las aplicaciones de máquina virtual
Entity name doesn't match the name in the request URL (El nombre de entidad no coincide con el nombre de la dirección URL de la solicitud). La versión de la aplicación de la galería especificada en la dirección URL de la solicitud no coincide con la especificada en el cuerpo de la solicitud.
El nombre de la versión de la aplicación de la galería no es válido. El nombre de la versión de la aplicación debe seguir Major(int32). Minor(int32). Formato Revisión(int32), donde int está entre 0 y 2 147 483 647, ambos inclusive. por ejemplo, 1.0.0, 2018.12.1, etc. La versión de la aplicación de la galería debe seguir el formato especificado.

Pasos siguientes