Compartir vía


Introducción a las aplicaciones de máquina virtual

Las aplicaciones de máquina virtual son un tipo de recurso en Azure Compute Gallery que proporciona un enfoque moderno y flexible para administrar e implementar aplicaciones en las máquinas virtuales y los conjuntos de escalado. Al desacoplar la instalación de aplicaciones de las imágenes de máquina virtual base, puede simplificar las actualizaciones, reducir la sobrecarga de mantenimiento de imágenes y acelerar los ciclos de implementación. Este enfoque elimina la necesidad de volver a compilar y volver a publicar imágenes de máquina virtual para cada cambio de aplicación, lo que permite una iteración más rápida y una mayor agilidad operativa. Las aplicaciones de máquina virtual son más adecuadas para implementar inteligencia artificial, alta escala, baja latencia, microservicios, cargas de trabajo seguras y compatibles en máquinas virtuales de Azure.

Recurso Descripción
Galería de Proceso de Azure 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 El recurso que se puede implementar, que contiene las configuraciones específicas del paquete de aplicación y de la versión. 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 la aplicación de máquina virtual debe replicarse en una región para poder implementarla en una máquina virtual de esa región.
Cuenta de almacenamiento Los paquetes de aplicación se cargan primero en la cuenta de almacenamiento. A continuación, Azure Compute Gallery descarga el paquete de aplicación de esta cuenta de almacenamiento mediante direcciones URL de SAS y los almacena en la versión de la aplicación de máquina virtual. Azure Compute Gallery también replica este paquete entre regiones y réplicas regionales según la definición de la versión de la aplicación de máquina virtual. El paquete de aplicación de la cuenta de almacenamiento se puede eliminar después de crear la versión de la aplicación de máquina virtual en Azure Compute Gallery.

Diagrama que muestra los pasos para crear una aplicación de máquina virtual e implementarla en Azure

Ventajas principales:

  • Administración centralizada y flexible de aplicaciones:
    • Empaquetar cualquier cosa una vez, implementar en cualquier lugar: empaquetar aplicaciones (windows/linux), scripts o archivos como aplicaciones de máquina virtual. A continuación, impleméntela en máquinas virtuales de Azure o conjuntos de escalado de máquinas virtuales y administrelas de forma centralizada en Azure Compute Gallery. Las aplicaciones o archivos pueden estar en .zip, .msi, .exe, .tar.gz, .deb, .rpm, .sh o cualquier otro formato.
    • Control de versiones: implemente la versión más reciente o específica manteniendo varias versiones de cada aplicación.
  • Uso compartido y control de acceso sin problemas
    • Tenant-Wide uso compartido: comparta aplicaciones dentro de equipos o en toda la organización (inquilino).
    • RBAC integrado: controle el acceso de publicación e implementación mediante Azure Role-Based Access Control (RBAC).
  • Implementaciones confiables y personalizables
    • Control de aplicaciones individual: instalar, actualizar o eliminar aplicaciones de forma independiente, no es necesario recompilar imágenes de máquina virtual.
    • Operaciones personalizables: personalice las operaciones de instalación, actualización y eliminación de aplicaciones, incluido el control de reinicio.
    • Built-In control de errores: asegúrese de que las implementaciones resistentes se conecten al error de la aplicación de máquina virtual.
  • Distribución escalable y Low-Latency
    • Replicación global y Intra-Region: replica automáticamente las aplicaciones entre regiones y dentro de las regiones para reducir la latencia y mejorar la resistencia, sin necesidad de AzCopy ni transferencias manuales.
    • Optimizado para escenarios de High-Scale: lograr una latencia de creación baja incluso durante las implementaciones a gran escala.
  • Seguro y compatible por diseño
    • Cumplimiento controlado por directivas: use Azure Policy para aplicar la presencia y configuración de la aplicación en toda la flota.
    • Implementaciones seguras: evite descargas basadas en Internet y configuraciones complejas de private link, que no son ideales para entornos bloqueados o seguros.
  • Amplia compatibilidad con la plataforma
    • Máquinas virtuales y conjuntos de escalado: implemente en máquinas virtuales individuales, conjuntos de escalado flexibles o conjuntos de escalado uniformes con compatibilidad completa.
    • Compatibilidad con blobs en bloques: controle eficazmente paquetes de aplicaciones grandes (hasta 2 GB) mediante Blobs en bloques de Azure para cargas fragmentadas y streaming en segundo plano.

Creación de un recurso de versión de aplicaciones de máquina virtual y aplicaciones de MÁQUINA virtual

La aplicación de máquina virtual se almacena en Azure Compute Gallery. El recurso de aplicación de máquina virtual define lo siguiente sobre la aplicación de máquina virtual:

Propiedad Descripción Limitaciones
nombre Nombre de la aplicación Longitud máxima de 117 caracteres. Los caracteres permitidos son letras mayúsculas o minúsculas, dígitos, guiones(-), punto (.), carácter de subrayado (_). Los nombres no pueden terminar con period(.).
supportedOSType Definición del tipo de sistema operativo admitido "Linux" o "Windows"
endOfLifeDate Fecha futura de finalización del ciclo de vida de la aplicación. La fecha es solo para referencia y no se aplica.
descripción Optional. Descripción de la aplicación de máquina virtual
Cluf Optional. Referencia al Contrato de licencia de usuario final (CLUF)
privacyStatementUri Optional. Referencia a la declaración de privacidad de la aplicación.
releaseNoteUri Optional. Referencia a las notas de la versión de la aplicación.

Las versiones de la aplicación de máquina virtual son los recursos que se pueden implementar dentro del recurso aplicación de máquina virtual. Las versiones se definen con las siguientes propiedades:

Propiedad Descripción Limitaciones
location Ubicación de origen de la versión de la aplicación de máquina virtual. Región válida de Azure
source/mediaLink Vínculo al archivo de paquete de aplicación en una cuenta de almacenamiento Dirección URL de almacenamiento válida y existente
source/defaultConfigurationLink Optional. Vínculo al archivo de configuración de la aplicación de máquina virtual. Se puede invalidar en el momento de la implementación. Dirección URL de almacenamiento válida y existente
manageActions/install Instalación del script como cadena para instalar correctamente la aplicación Comando válido para el sistema operativo especificado en formato de cadena.
manageActions/remove Quitar script como cadena para quitar correctamente la aplicación Comando válido para el sistema operativo especificado en formato de cadena
manageActions/update Optional. Actualice el script como cadena para actualizar correctamente la aplicación de máquina virtual a una versión más reciente. Comando válido para el sistema operativo especificado en formato de cadena
targetRegions/name Nombre de las regiones de destino a las que se va a replicar. Mejora la resistencia a los errores de región y crea latencia. Región válida de Azure
targetRegions/regionalReplicaCount Optional. Número de réplicas que se van a crear en la región. Mejora el control de carga y crea latencia. El valor predeterminado es 1. Entero entre 1 y 3 inclusive
replicaCount Optional. Define el número de réplicas en cada región. Surte efecto si regionalReplicaCount no está definido. Mejora la resistencia a los errores de región o clúster y crea latencia durante la escala alta. Entero entre 1 y 3 inclusive.
endOfLifeDate Optional. Fecha de finalización futura del ciclo de vida de la versión de la aplicación. Esta propiedad es solo para referencia de cliente y no se aplica. Fecha futura válida
excludeFromLatest Excluya la versión de que se usa como la versión más reciente de la aplicación cuando se usa la palabra clave "latest" en applicationProfile.
storageAccountType Optional. Tipo de cuenta de almacenamiento que se va a usar en cada región para almacenar el paquete de aplicación. El valor predeterminado es Standard_LRS. Esta propiedad no es actualizable.
safetyProfile/allowDeletionOfReplicatedLocations Optional. Indica si se permite quitar o no esta versión de imagen de la galería de regiones replicadas.
settings/packageFileName Nombre de archivo de paquete que se usará cuando se descargue el paquete en la máquina virtual. Se limita a 4096 caracteres.
settings/configFileName Nombre del archivo de configuración que se va a usar cuando se descarga la configuración en la máquina virtual. Se limita a 4096 caracteres.
settings/scriptBehaviorAfterReboot Optional. Acción que se realizará para instalar, actualizar o quitar la aplicación de la galería después de reiniciar la máquina virtual.

{
  "$schema": "https://schema.management.azure.com/schemas/2020-06-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "galleryName": {
      "type": "string"
    },
    "applicationName": {
      "type": "string"
    },
    "versionName": {
      "type": "string",
      "metadata": {
        "description": "Must follow the format: major.minor.patch (Example: 1.0.0)"
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "West US"
    },
    "supportedOSType": {
      "type": "string",
      "allowedValues": ["Windows", "Linux"]
    },
    "endOfLifeDate": {
      "type": "string",
      "metadata": {
        "description": "Optional. This property is for information only and doesn't block app deployment."
      }
    },
    "description": {
      "type": "string",
      "defaultValue": "Description of the application"
    },
    "eula": {
      "type": "string",
      "defaultValue": ""
    },
    "privacyStatementUri": {
      "type": "string",
      "defaultValue": ""
    },
    "releaseNoteUri": {
      "type": "string",
      "defaultValue": ""
    },
    "mediaLink": {
      "type": "string"
    },
    "configLink": {
      "type": "string"
    },
    "appConfigFileName": {
      "type": "string"
    },
    "appPackageFileName": {
      "type": "string"
    },
    "replicaRegion1": {
      "type": "string",
      "defaultValue": "East US"
    },
    "replicaRegion2": {
      "type": "string",
      "defaultValue": "South Central US"
    },
    "installScript": {
      "type": "string",
      "metadata": {
        "description": "Optional. Script to run to install the application. Example: echo 'Installing application...'"
      }
    },
    "updateScript": {
      "type": "string",
      "metadata": {
        "description": "Optional. Script to run to update the application. Example: echo 'Updating application...'"
      }
    },
    "removeScript": {
      "type": "string",
      "metadata": {
        "description": "Optional. Script to run to delete the application. Example: echo 'Deleting application...'"
      }
    },
    "storageAccountType": {
      "type": "string",
      "allowedValues": ["PremiumV2_LRS", "Premium_LRS", "Standard_LRS", "Standard_ZRS"],
      "defaultValue": "Standard_LRS"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Compute/galleries",
      "apiVersion": "2024-03-03",
      "name": "[parameters('galleryName')]",
      "location": "[parameters('location')]",
      "properties": {
        "identifier": {}
      }
    },
    {
      "type": "Microsoft.Compute/galleries/applications",
      "apiVersion": "2024-03-03",
      "name": "[format('{0}/{1}', parameters('galleryName'), parameters('applicationName'))]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[resourceId('Microsoft.Compute/galleries', parameters('galleryName'))]"
      ],
      "properties": {
        "supportedOSType": "[parameters('supportedOSType')]",
        "endOfLifeDate": "[parameters('endOfLifeDate')]",
        "description": "[parameters('description')]",
        "eula": "[if(equals(parameters('eula'), ''), json('null'), parameters('eula'))]",
        "privacyStatementUri": "[if(equals(parameters('privacyStatementUri'), ''), json('null'), parameters('privacyStatementUri'))]",
        "releaseNoteUri": "[if(equals(parameters('releaseNoteUri'), ''), json('null'), parameters('releaseNoteUri'))]"
      }
    },
    {
      "type": "Microsoft.Compute/galleries/applications/versions",
      "apiVersion": "2024-03-03",
      "name": "[format('{0}/{1}/{2}', parameters('galleryName'), parameters('applicationName'), parameters('versionName'))]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[resourceId('Microsoft.Compute/galleries/applications', parameters('galleryName'), parameters('applicationName'))]"
      ],
      "properties": {
        "publishingProfile": {
          "source": {
            "mediaLink": "[parameters('mediaLink')]",
            "defaultConfigurationLink": "[parameters('configLink')]"
          },
          "manageActions": {
            "install": "[parameters('installScript')]",
            "remove": "[parameters('removeScript')]",
            "update": "[parameters('updateScript')]"
          },
          "settings": {
            "scriptBehaviorAfterReboot": "Rerun",
            "configFileName": "[parameters('appConfigFileName')]",
            "packageFileName": "[parameters('appPackageFileName')]"
          },
          "targetRegions": [
            {
              "name": "[parameters('location')]",
              "regionalReplicaCount": 3,
              "storageAccountType": "[parameters('storageAccountType')]"
            },
            {
              "name": "[parameters('replicaRegion1')]",
              "regionalReplicaCount": 1,
              "storageAccountType": "[parameters('storageAccountType')]"
            },
            {
              "name": "[parameters('replicaRegion2')]"
            },
          ],
          "excludeFromLatest": false,
          "replicaCount": 2,
          "storageAccountType": "[parameters('storageAccountType')]"
        },
        "safetyProfile": {
          "allowDeletionOfReplicatedLocations": true
        },
        "endOfLifeDate": "[parameters('endOfLifeDate')]"
      }
    }
  ]
}

Implementación de aplicaciones de máquina virtual de Azure

Una vez publicada la versión de la aplicación de máquina virtual en Azure Compute Gallery, puede implementar la versión en Azure Virtual Machines (VM) y Azure Virtual Machine Scale Sets.

En applicationProfile vm de Azure y conjuntos de escalado de máquinas virtuales se define lo siguiente:

Propiedad Descripción Limitaciones
galleryApplications Aplicaciones de la galería que se van a implementar
packageReferenceId Referencia a la versión de la aplicación que se va a implementar Referencia válida de la versión de la aplicación
configurationReference (Referencia de configuración) Optional. Dirección URL completa de un blob de almacenamiento que contiene la configuración de esta implementación. Esto invalida cualquier valor proporcionado anteriormente para defaultConfiguration. Referencia de blob de almacenamiento válida
order Optional. Orden en el que se van a implementar aplicaciones Entero válido
treatFailureAsDeploymentFailure Optional. Marcar el error de la aplicación como error de implementación de la máquina virtual para el control de errores Verdadero o Falso

El campo de orden se puede usar para especificar dependencias entre aplicaciones. Las reglas para el orden son las siguientes:

Caso Significado de instalación Significado del error
No se ha especificado ningún orden Las aplicaciones desordenadas se instalan después de las aplicaciones ordenadas. No hay ninguna garantía de orden de instalación entre las aplicaciones no ordenadas. Los errores de instalación de otras aplicaciones, ya sea ordenados o no ordenados, no afectan a la instalación de aplicaciones desordenadas.
Valores de orden duplicados La aplicación se instala en cualquier orden en comparación con otras aplicaciones con el mismo orden. Todas las aplicaciones del mismo pedido se instalan después de las que tienen pedidos inferiores y antes de las que tienen pedidos superiores. Si no se pudo instalar una aplicación anterior con un orden inferior, no se pudo instalar ninguna aplicación con este pedido. Si alguna aplicación con este pedido no se puede instalar, no hay ninguna aplicación con una instalación de pedido superior.
Aumento de pedidos La aplicación se instalará después de las que tienen pedidos inferiores y antes de las que tienen pedidos superiores. Si no se pudo instalar una aplicación anterior con un orden inferior, esta aplicación no se instala. Si no se puede instalar esta aplicación, no hay ninguna aplicación con una instalación de pedido superior.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "vmssName": {
      "type": "string"
    },
    "location": {
      "type": "string"
    },
    "subscriptionId": {
      "type": "string"
    },
    "resourceGroupName": {
      "type": "string"
    },
    "galleryName": {
      "type": "string"
    },
    "applicationName1": {
      "type": "string"
    },
    "applicationVersion1": {
      "type": "string",
      "defaultValue": "latest"
    },
    "configurationReference1": {
      "type": "string",
      "metadata": {
        "description": "Optional path to configuration file from Storage Account. Overrides default configuration file."
      }
    },
    "applicationName2": {
      "type": "string"
    },
    "applicationVersion2": {
      "type": "string",
      "defaultValue": "latest"
    }
  },
  "variables": {
    "packageReferenceId1": "[format('/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Compute/galleries/{2}/applications/{3}/versions/{4}', parameters('subscriptionId'), parameters('resourceGroupName'), parameters('galleryName'), parameters('applicationName1'), parameters('applicationVersion1'))]",
    "packageReferenceId2": "[format('/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Compute/galleries/{2}/applications/{3}/versions/{4}', parameters('subscriptionId'), parameters('resourceGroupName'), parameters('galleryName'), parameters('applicationName2'), parameters('applicationVersion2'))]"
  },
  "resources": [
    {
      "type": "Microsoft.Compute/virtualMachineScaleSets",
      "apiVersion": "2024-03-03",
      "name": "[parameters('vmssName')]",
      "location": "[parameters('location')]",
      "properties": {
        "virtualMachineProfile": {
          "applicationProfile": {
            "galleryApplications": [
              {
                "order": 1,
                "packageReferenceId": "[variables('packageReferenceId1')]",
                "configurationReference": "[parameters('configurationReference1')]",
                "treatFailureAsDeploymentFailure": true
              },
              {
                "order": 2,
                "packageReferenceId": "[variables('packageReferenceId2')]",
                "treatFailureAsDeploymentFailure": false
              }
            ]
          }
        }
      }
    }
  ]
}

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.

Detalles técnicos

Consideraciones y límites actuales

  • Hasta 10 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 10 para blobs en páginas y blobs en bloques.

  • Hasta 300 versiones por región: al crear una versión de aplicación de máquina virtual, puede tener hasta 300 versiones de aplicación por región.

  • Almacenamiento con acceso público y URI de SAS con privilegios de lectura: La cuenta de almacenamiento debe tener acceso de nivel público y usar un URI de SAS con privilegios de lectura, ya que otros niveles de restricción producen errores en las implementaciones. Al permitir el acceso anónimo, se pueden eludir los tokens de SAS publicando el artefacto en la cuenta de almacenamiento.

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

  • Hasta 25 aplicaciones por máquina virtual: se puede implementar un máximo de 25 aplicaciones en una sola máquina virtual.

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

  • 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.

  • Versión única de la aplicación por máquina virtual: solo se puede implementar una versión de una aplicación determinada en una máquina virtual.

  • Actualmente no se admiten operaciones de movimiento: actualmente no se admite el traslado de máquinas virtuales con aplicaciones de máquina virtual asociadas entre grupos de recursos.

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 requiere una SAS válida.

Descarga del directorio dentro de la máquina virtual

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/<application name>/<application version>
  • Windows: C:\Packages\Plugins\Microsoft.CPlat.Core.VMApplicationManagerWindows\1.0.9\Downloads\<application name>\<application 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 del archivo como "MyVmApp" y no tiene ninguna extensión de archivo (por ejemplo, .exe, .msi). La máquina virtual no es consciente del nombre y la extensión originales del archivo.

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" se convierte el script de instalación como se indica a continuación.

MyAppe.exe /S

Sugerencia

Si el blob se denomina originalmente como "myApp.exe" en lugar de "myapp", el script funciona sin establecer la packageFileName propiedad .

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 podría actualizarse desde cualquier versión anterior de la aplicación de máquina virtual.

Tratar el error como error de implementación

La extensión aplicación de máquina virtual siempre devuelve un éxito independientemente de si se produjo un error en alguna aplicación de máquina virtual mientras se instala, actualiza o quita. 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.

Empaquetar e instalar aplicaciones de máquina virtual en Linux

Para crear una aplicación de máquina virtual, necesita scripts y paquetes de aplicación para instalar, actualizar y eliminar correctamente la aplicación.
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.

Para crear un paquete de aplicación de máquina virtual para instalar PowerShell en Ubuntu, siga estos pasos:

  1. Ejecute los siguientes comandos para permitir que el repositorio descargue PowerShell e identifique 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

Creación de 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 quiero crear un paquete de aplicación de máquina virtual para myApp.exe, que se distribuye como ejecutable, mi aplicación de máquina virtual se denomina "myApp", por lo que escribo el comando suponiendo que el paquete de aplicación se encuentra 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 myapp /quiet /forcerestart /log myapp_uninstall.log

Por lo general, se llamaría al comando start dentro de un script por lotes. Si se usa con el /wait parámetro , el script de llamada se pausa hasta que finaliza 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

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 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

Mensaje 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 obtener más información sobre el 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 la operación de eliminación (o esperar a 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". (O actualizar, eliminar) 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