Partager via


Vue d’ensemble des applications de machine virtuelle

Les applications de machine virtuelle sont un type de ressource dans azure Compute Gallery qui fournit une approche moderne et flexible de la gestion et du déploiement d’applications sur vos machines virtuelles et groupes identiques. En découplant l’installation d’applications à partir de vos images de machine virtuelle de base, vous pouvez simplifier les mises à jour, réduire la surcharge de maintenance des images et accélérer les cycles de déploiement. Cette approche élimine la nécessité de reconstruire et de republier des images de machine virtuelle pour chaque modification d’application, ce qui permet une itération plus rapide et une plus grande agilité opérationnelle. Les applications de machine virtuelle conviennent mieux au déploiement de l’IA, d’une grande échelle, d’une faible latence, de microservices, de charges de travail sécurisées et conformes sur des machines virtuelles Azure.

Ressource Descriptif
Galerie de calcul Azure Une galerie est un référentiel pour la gestion et le partage de packages d’applications. Les utilisateurs peuvent partager la ressource de galerie et toutes les ressources enfants sont partagées automatiquement. Le nom de la galerie doit être unique par abonnement. Par exemple, vous pouvez avoir une galerie pour stocker toutes vos images de système d’exploitation et une autre galerie pour stocker toutes vos applications de machine virtuelle.
Application de machine virtuelle Définition de votre application de machine virtuelle. Il s’agit d’une ressource logique qui stocke les métadonnées communes pour toutes les versions qu’elle contient. Par exemple, vous pouvez avoir une définition d’application pour Apache Tomcat et y avoir plusieurs versions.
Version d’application de machine virtuelle Ressource déployable, qui contient votre package d’application et vos configurations spécifiques à la version. Vous pouvez répliquer globalement vos versions d’application de machine virtuelle vers des régions cibles plus proches de votre infrastructure de machine virtuelle. La version de l’application de machine virtuelle doit être répliquée dans une région avant de pouvoir être déployée sur une machine virtuelle de cette région.
Compte de stockage Les packages d’application sont d’abord chargés sur votre compte de stockage. Azure Compute Gallery télécharge ensuite le package d’application à partir de ce compte de stockage à l’aide d’URL SAP et les stocke dans la version de l’application de machine virtuelle. Azure Compute Gallery réplique également ce package entre les régions et les réplicas régionaux conformément à la définition de version de l’application de machine virtuelle. Le package d’application dans le compte de stockage peut être supprimé une fois la version de l’application de machine virtuelle créée dans la galerie de calcul Azure.

Diagramme montrant les étapes de création d’une application de machine virtuelle et son déploiement sur Azure

Principaux avantages :

  • Gestion centralisée et flexible des applications :
    • Empaqueter n’importe quoi une fois, Déployer n’importe où : applications de package (windows/linux), scripts ou fichiers en tant qu’applications de machine virtuelle. Déployez-la ensuite sur des machines virtuelles Azure ou des groupes de machines virtuelles identiques, puis gérez-les de manière centralisée dans la galerie de calcul Azure. Les applications ou les fichiers peuvent se trouver dans .zip, .msi, .exe, .tar.gz, .deb, .rpm, .sh ou tout autre format.
    • Contrôle de version : déployez la dernière ou une version spécifique en conservant plusieurs versions de chaque application.
  • Partage et contrôle d’accès transparents
    • Tenant-Wide Partage : partager des applications au sein d’équipes ou dans l’ensemble de votre organisation (locataire).
    • RBAC intégré : Contrôler l’accès à la publication et au déploiement à l’aide d’Azure Role-Based Access Control (RBAC).
  • Déploiements fiables et personnalisables
    • Contrôle d’application individuel : installez, mettez à jour ou supprimez des applications indépendamment, sans avoir besoin de reconstruire des images de machine virtuelle.
    • Opérations personnalisables : personnaliser les opérations d’installation, de mise à jour et de suppression pour les applications, notamment la gestion des redémarrages.
    • Built-In Gestion des défaillances : assurez-vous des déploiements résilients en connectant l’échec de l’application de machine virtuelle à une défaillance de machine virtuelle.
  • Distribution évolutive et Low-Latency
    • Réplication globale et Intra-Region : répliquez automatiquement des applications dans et au sein des régions pour réduire la latence et améliorer la résilience, sans avoir besoin de transferts manuels ou AzCopy.
    • Optimisé pour les scénarios High-Scale : obtenez une faible latence de création même pendant les déploiements à grande échelle.
  • Sécurisé et conforme par conception
    • Application pilotée par la stratégie : Utilisez Azure Policy pour appliquer la présence et la configuration de l’application dans votre flotte.
    • Déploiements sécurisés : évitez les téléchargements basés sur Internet et les configurations complexes de liaison privée, qui ne sont pas idéales pour les environnements verrouillés ou sécurisés.
  • Prise en charge étendue de la plateforme
    • Machines virtuelles et groupes identiques : déployer sur des machines virtuelles individuelles, des groupes identiques flexibles ou des groupes identiques uniformes avec une prise en charge complète.
    • Prise en charge des objets blob de blocs : gérez efficacement les packages d’applications volumineux (jusqu’à 2 Go) à l’aide d’objets blob de blocs Azure pour les chargements segmentés et la diffusion en continu en arrière-plan.

Créer une ressource de version des applications de machine virtuelle et des applications de machine virtuelle

L’application de machine virtuelle est stockée dans la galerie de calcul Azure. La ressource d’application de machine virtuelle définit les éléments suivants sur votre application de machine virtuelle :

Propriété Descriptif Limites
nom Nom de l’application Longueur maximale de 117 caractères. Les caractères autorisés sont des lettres majuscules ou minuscules, des chiffres, des traits d’union(-), un point (.), un trait de soulignement (_). Noms non autorisés à se terminer par period(.).
supportedOSType Définir le type de système d’exploitation pris en charge « Linux » ou « Windows »
endOfLifeDate Date de fin de vie future de l’application. La date est uniquement pour référence et n’est pas appliquée.
descriptif Optional. Description de l’application de machine virtuelle
Cluf Optional. Référence au contrat de licence utilisateur final (CLUF)
privacyStatementUri Optional. Référence à la déclaration de confidentialité de l’application.
releaseNoteUri Optional. Référence aux notes de publication de l’application.

Les versions d’application de machine virtuelle sont les ressources déployables dans la ressource application de machine virtuelle. Les versions sont définies avec les propriétés suivantes :

Propriété Descriptif Limites
location Emplacement source de la version de l’application de machine virtuelle. Région Azure valide
source/mediaLink Lien vers le fichier de package d’application dans un compte de stockage URL de stockage valide et existante
source/defaultConfigurationLink Optional. Lien vers le fichier de configuration de l’application de machine virtuelle. Il peut être substitué au moment du déploiement. URL de stockage valide et existante
manageActions/install Installer le script en tant que chaîne pour installer correctement l’application Commande valide pour le système d’exploitation donné au format de chaîne.
manageActions/remove Supprimer le script en tant que chaîne pour supprimer correctement l’application Commande valide pour le système d’exploitation donné au format de chaîne
manageActions/update Optional. Mettez à jour le script en tant que chaîne pour mettre à jour correctement l’application de machine virtuelle vers une version plus récente. Commande valide pour le système d’exploitation donné au format de chaîne
targetRegions/name Nom des régions cibles vers lesquelles répliquer. Améliore la résilience à l’échec de la région et crée une latence. Région Azure valide
targetRegions/regionalReplicaCount Optional. Nombre de réplicas à créer dans la région. Améliore la gestion de la charge et crée la latence. La valeur par défaut est 1. Entier compris entre 1 et 3 inclus
replicaCount Optional. Définit le nombre de réplicas dans chaque région. Prend effet si regionalReplicaCount n’est pas défini. Améliore la résilience à la région ou à l’échec du cluster et crée une latence pendant une mise à l’échelle élevée. Entier compris entre 1 et 3 inclus.
endOfLifeDate Optional. Date de fin de vie future pour la version de l’application. Cette propriété est destinée uniquement aux clients et n’est pas appliquée. Date future valide
excludeFromLatest Excluez la version d’être utilisée comme dernière version de l’application lorsque le mot clé « latest » est utilisé dans applicationProfile.
storageAccountType Optional. Type de compte de stockage à utiliser dans chaque région pour stocker le package d’application. La valeur par défaut est Standard_LRS. Cette propriété n’est pas modifiable.
safetyProfile/allowDeletionOfReplicatedLocations Optional. Indique si la suppression ou non de cette version d’image de galerie des régions répliquées est autorisée.
settings/packageFileName Nom du fichier de package à utiliser lorsque le package est téléchargé sur la machine virtuelle. Cela est limité à 4 096 caractères.
settings/configFileName Nom du fichier de configuration à utiliser lorsque la configuration est téléchargée sur la machine virtuelle. Cela est limité à 4 096 caractères.
settings/scriptBehaviorAfterReboot Optional. Action à entreprendre pour l’installation, la mise à jour ou la suppression de l’application de galerie après le redémarrage de la machine virtuelle.

{
  "$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')]"
      }
    }
  ]
}

Déployer des applications de machine virtuelle Azure

Une fois la version de l’application de machine virtuelle publiée dans azure Compute Gallery, vous pouvez déployer la version sur les machines virtuelles Azure et les groupes de machines virtuelles identiques Azure.

La applicationProfile machine virtuelle Azure et les groupes de machines virtuelles identiques définissent les éléments suivants :

Propriété Descriptif Limites
galleryApplications Applications de galerie à déployer
packageReferenceId Référence à la version de l’application à déployer Référence de version d’application valide
configurationRéférence Optional. URL complète d’un objet blob de stockage contenant la configuration de ce déploiement. Cela remplace toute valeur fournie pour defaultConfiguration précédemment. Informations de référence sur les objets blob de stockage valides
order Optional. Ordre dans lequel déployer des applications Entier valide
treatFailureAsDeploymentFailure Optional. Marquer l’échec de l’application en tant qu’échec de déploiement de machine virtuelle pour la gestion des défaillances Vrai ou Faux

Le champ de commande peut être utilisé pour spécifier des dépendances entre les applications. Les règles de commande sont les suivantes :

Incident Signification de l’installation Signification de l’échec
Aucune commande spécifiée Les applications non ordonnées sont installées après les applications ordonnées. Il n’existe aucune garantie d’ordre d’installation parmi les applications non ordonnées. Les échecs d’installation d’autres applications, qu’il soit ordonné ou non ordonné n’affectent pas l’installation d’applications non ordonnées.
Valeurs d’ordre dupliquées L’application est installée dans n’importe quel ordre par rapport à d’autres applications avec la même commande. Toutes les applications de la même commande sont installées après celles avec des commandes inférieures et avant celles avec des commandes supérieures. Si une application précédente avec un ordre inférieur n’a pas pu être installée, aucune application avec cette commande n’est installée. Si une application avec cet ordre ne parvient pas à s’installer, aucune application avec une installation de commande plus élevée.
Augmentation des commandes L’application est installée après celles avec des commandes inférieures et avant celles avec des commandes supérieures. Si une application précédente avec un ordre inférieur n’a pas pu être installée, cette application n’est pas installée. Si cette application ne parvient pas à s’installer, aucune application avec une commande supérieure n’est installée.

{
  "$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
              }
            ]
          }
        }
      }
    }
  ]
}

Coûts

Il n’y a pas de frais supplémentaires pour l’utilisation de packages d’application de machine virtuelle, mais vous serez facturé pour les ressources suivantes :

  • Coûts de stockage du stockage de chaque package et de tous les réplicas.
  • Coûts de sortie de réseau pour la réplication de la première version d’image de la région source vers les régions répliquées. Les réplicas suivants sont gérés au sein de la région, donc aucun frais supplémentaires ne sont prévus.

Pour plus d’informations sur la sortie du réseau, consultez Détails de la tarification de la bande passante.

Détails techniques

Considérations et limites actuelles

  • Jusqu’à 10 réplicas par région : lorsque vous créez une version d’application de machine virtuelle, le nombre maximal de réplicas par région est de 10 pour les objets blob de pages et les objets blob de blocs.

  • Jusqu’à 300 versions par région : lors de la création d’une version d’application de machine virtuelle, vous pouvez avoir jusqu’à 300 versions d’application par région.

  • Stockage avec accès public et URI SAP avec privilège de lecture : Le compte de stockage doit disposer d’un accès au niveau public et utiliser un URI SAP avec des privilèges de lecture, car d’autres niveaux de restriction échouent aux déploiements. Les jetons SAP peuvent être contournés en publiant l’artefact sur le compte de stockage en autorisant l’accès anonyme.

  • Nouvelle tentative manuelle pour les installations ayant échoué : actuellement, la seule façon de réessayer une installation ayant échoué consiste à supprimer l’application du profil, puis à la rajouter.

  • Jusqu’à 25 applications par machine virtuelle : un maximum de 25 applications peuvent être déployées sur une seule machine virtuelle.

  • Taille de l’application de 2 Go : la taille maximale de fichier d’une version mediaLink d’application est de 2 Go. La taille maximale du fichier est defaultConfigurationLink de 1 Go.

  • Nécessite un agent de machine virtuelle : L’agent de machine virtuelle doit exister sur la machine virtuelle et être en mesure de recevoir des états d’objectif.

  • Version unique de l’application par machine virtuelle : une seule version d’une application donnée peut être déployée sur une machine virtuelle.

  • Opérations de déplacement actuellement non prises en charge : le déplacement de machines virtuelles avec des applications de machine virtuelle associées entre les groupes de ressources n’est actuellement pas pris en charge.

Notes

Pour Azure Compute Gallery et les applications de machines virtuelles, les SAP du stockage peuvent être supprimés après la réplication. Toutefois, toute opération de mise à jour ultérieure nécessite une SAP valide.

Télécharger le répertoire dans la machine virtuelle

Les emplacements de téléchargement du package d’application et des fichiers de configuration sont les suivants :

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

Les commandes d’installation/mise à jour/suppression doivent être écrites en supposant que le package d’application et le fichier de configuration se trouvent dans le répertoire actuel.

Dénomination du fichier

Lorsque le fichier d’application est téléchargé sur la machine virtuelle, le fichier est renommé « MyVmApp » et n’a aucune extension de fichier (par exemple, .exe, .msi). La machine virtuelle ignore le nom et l’extension d’origine du fichier.

Voici quelques alternatives pour contourner ce problème :

Vous pouvez modifier votre script de manière à inclure une commande pour renommer le fichier avant l’exécution :

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

Vous pouvez également utiliser la propriété packageFileName(et la propriété correspondante configFileName) pour nous indiquer ce qu’il faut renommer votre fichier. Par exemple, la définition de la valeur «MyApp.exe» rend votre script d’installation comme suit.

MyAppe.exe /S

Conseil

Si votre objet blob est initialement nommé «myApp.exe» au lieu de « myapp », le script fonctionne sans définir la packageFileName propriété.

Interpréteur de commande

Les interpréteurs de commandes par défaut sont les suivants :

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

Il est possible d’utiliser un interpréteur différent, comme Chocolatey ou PowerShell, à condition qu’il soit installé sur la machine, en appelant l’exécutable et en lui passant la commande. Par exemple, pour que votre commande s’exécute dans PowerShell sur Windows au lieu de cmd, vous pouvez passer powershell.exe -Command '<powershell commmand>'

Manière dont les mises à jour sont gérées

Lorsque vous mettez à jour une version de l’application sur une machine virtuelle ou un groupe de machines virtuelles identiques (Virtual Machine Scale Sets), la commande de mise à jour que vous avez fournie pendant le déploiement est utilisée. Si la version mise à jour n’a pas de commande de mise à jour, la version actuelle est supprimée et la nouvelle version est installée.

Les commandes de mise à jour doivent être écrites dans l’attente qu’elles puissent être mises à jour à partir d’une version antérieure de l’application de machine virtuelle.

Traiter l’échec en tant qu’échec de déploiement

L’extension d’application de machine virtuelle retourne toujours une réussite , que l’application de machine virtuelle ait échoué lors de l’installation/mise à jour/suppression. L’extension d’application de machine virtuelle signalera uniquement l’état de l’extension comme un échec en cas de problème avec l’extension ou l’infrastructure sous-jacente. Ce comportement est déclenché par l’indicateur « Traiter l’échec en tant qu’échec de déploiement », qui est défini sur $false par défaut et peut être changé en $true. L’indicateur d’échec peut être configuré dans PowerShell ou l’interface CLI.

Empaqueter et installer des applications de machine virtuelle sur Linux

Pour créer une application de machine virtuelle, vous avez besoin d’un package d’application et de scripts pour installer, mettre à jour et supprimer correctement l’application.
Les applications tierces pour Linux peuvent être empaquetées de plusieurs façons. Étudions comment gérer la création de commandes d’installation pour les raisons les plus courantes.

fichiers .tar et.gz

Ces fichiers sont des d’archives compressées qui peuvent être extraites à un emplacement souhaité. Vérifiez les instructions d’installation du package d’origine au cas où elles doivent être extraites dans un emplacement spécifique. Si le fichier. tar.gz contient du code source, reportez-vous aux instructions relatives au package pour savoir comment procéder à l’installation à partir de la source.

Exemple de commande d’installation pour installer golang sur une machine Linux :

sudo tar -C /usr/local -xzf go_linux

Exemple de commande de suppression :

sudo rm -rf /usr/local/go

Création de packages d’application à l’aide de .deb, .rpm, et d’autres packages spécifiques à la plateforme pour les machines virtuelles avec accès Internet restreint

Vous pouvez télécharger des packages individuels pour des gestionnaires de packages spécifiques à la plateforme, mais ils ne contiennent généralement pas toutes les dépendances. Pour ces fichiers, vous devez également inclure toutes les dépendances dans le package d’application, ou faire en sorte que le gestionnaire de package système télécharge les dépendances via les référentiels disponibles pour la machine virtuelle. Si vous utilisez une machine virtuelle avec accès limité à Internet, vous devez empaqueter toutes les dépendances vous-même.

La mesure des dépendances peut être un peu délicate. Il existe des outils tiers qui peuvent vous montrer l’ensemble de l’arborescence des dépendances.

Sur Ubuntu, vous pouvez exécuter sudo apt show <package_name> | grep Depends pour afficher tous les packages qui seront installés pour la commande sudo apt-get install <packge_name>. Vous pouvez ensuite utiliser cette sortie pour télécharger tous les fichiers .deb afin de créer une archive utilisable en tant que package d’application.

Pour créer un package d’application de machine virtuelle pour installer PowerShell sur Ubuntu, procédez comme suit :

  1. Exécutez les commandes suivantes pour permettre au référentiel de télécharger PowerShell et d’identifier les dépendances de package sur une nouvelle machine virtuelle 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. Vérifiez la sortie de la ligne Depends qui liste les paquets suivants :
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. Téléchargez chacun de ces fichiers à l’aide de sudo apt-get download <package_name> et créez une archive compressée tar avec tous les fichiers.
  • 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. Cette archive tar est le fichier de package d’application.
  • Dans ce cas, la commande d’installation est :
sudo tar -xvzf powershell.tar.gz && sudo dpkg -i *.deb
  • Et la commande de suppression est :
sudo apt remove powershell

Utilisez sudo apt autoremove plutôt que de tenter explicitement de supprimer toutes les dépendances. Vous avez peut-être installé d’autres applications avec des dépendances qui se chevauchent, et dans ce cas, une commande de suppression explicite échouerait.

Si vous ne souhaitez pas résoudre les dépendances vous-même et que apt est en mesure de se connecter aux référentiels, vous pouvez installer une application avec un seul fichier .deb et laisser apt gérer les dépendances.

Exemple de commande d’installation :

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

Création d’applications de machine virtuelle sur Windows

La plupart des applications tierces dans Windows sont disponibles en tant que programmes d’installation .exe ou .msi. Certaines sont également disponibles sous forme d’extraction et d’exécution de fichiers zip. Examinons les meilleures pratiques pour chacune d’entre elles.

Programme d'installation .exe

Les exécutables du programme d’installation lancent généralement une interface utilisateur (IU) et requièrent que quelqu’un sélectionne dans l’interface utilisateur. Si le programme d’installation prend en charge un paramètre de mode silencieux, il doit être inclus dans votre chaîne d’installation.

Cmd.exe s’attend également à ce que les fichiers exécutables aient l’extension .exe. Vous devez donc renommer le fichier pour lui attribuer l’extension .exe.

Si je souhaite créer un package d’application de machine virtuelle pour myApp.exe, qui est fourni en tant qu’exécutable, mon application de machine virtuelle est appelée « myApp », donc j’écris la commande en supposant que le package d’application se trouve dans le répertoire actif :

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

Si le fichier exécutable du programme d’installation ne prend pas en charge un paramètre de désinstallation, vous pouvez parfois rechercher dans le registre sur une machine de test pour savoir où se trouve le programme de désinstallation.

Dans le registre, la chaîne de désinstallation est stockée dans Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\<installed application name>\UninstallString. J’utilise donc le contenu comme commande de suppression :

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

Programme d’installation .msi

Pour l’exécution de la ligne de commande des programmes d’installation .msi, les commandes permettant d’installer ou de supprimer une application doivent utiliser msiexec. En général, msiexec s’exécute en tant que processus distinct et cmd n’attend pas qu’il se termine, ce qui peut entraîner des problèmes lors de l’installation de plusieurs applications de machine virtuelle. La commande start peut être utilisée avec msiexec pour s’assurer que l’installation se termine avant que la commande ne retourne. Par exemple :

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

Exemple de commande de suppression :

start /wait %windir%\\system32\\msiexec.exe /x myapp /quiet /forcerestart /log myapp_uninstall.log

En règle générale, la commande start est appelée dans un script de commandes par lot. Si elle est utilisée avec le /wait paramètre, le script appelant est suspendu jusqu’à ce que le processus appelé se termine. Une fois terminé, le script de commandes par lot recherche la variable errorlevel définie par la commande start et quitte comme suit :

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

Fichiers compressés

Pour les fichiers .zip ou d’autres fichiers compressés, renommez et décompressez le contenu du package d’application vers la destination souhaitée.

Exemple de commande d’installation :

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

Exemple de commande de suppression :

rmdir /S /Q C:\\myapp

Résolution des problèmes liés aux applications de machine virtuelle

Pour savoir si une application de machine virtuelle particulière a été correctement ajoutée à l’instance de machine virtuelle, vérifiez le message de l’extension d’application de machine virtuelle.

Pour en savoir plus sur l’obtention de l’état des extensions de machine virtuelle, consultez Extensions et fonctionnalités de machine virtuelle pour Linux et Extensions et fonctionnalités de machine virtuelle pour Windows.

Pour connaître l’état des extensions de machine virtuelle, utilisez Get-AzVM :

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

Pour connaître l’état des extensions de groupe de machines virtuelles identiques, utilisez 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

Messages d’erreur

Message Descriptif
La version actuelle {name} de l'application de machine virtuelle a été dépréciée le {date}. Vous avez essayé de déployer une version de l’application de machine virtuelle qui a déjà été dépréciée. Essayez d’utiliser latest au lieu de spécifier une version spécifique.
La version actuelle {name} de l'application de machine virtuelle prend en charge le système d'exploitation {OS}, alors que le système d'exploitation de OSDisk actuel est {OS}. Vous avez essayé de déployer une application Linux sur une instance Windows, ou vice versa.
Le nombre maximal d’applications de machine virtuelle (max=5, current={count}) a été dépassé. Utilisez moins d’applications et relancez la requête. Actuellement, nous ne prenons en charge que cinq applications de machine virtuelle par machine virtuelle ou groupe identique.
Plus d'une application de machine virtuelle a été spécifiée avec le même packageReferenceId. La même application a été spécifiée plusieurs fois.
L’abonnement n’est pas autorisé à accéder à cette image. L’abonnement n’a pas accès à cette version de l’application.
Le compte de stockage n’existe pas dans les arguments. Il n'existe aucune application pour cet abonnement.
L’image de plateforme {image} n’est pas disponible. Vérifiez que tous les champs du profil de stockage sont corrects. Pour plus d’informations sur le profil de stockage, consultez https://aka.ms/storageprofile. L’application n’existe pas.
L’image de galerie {image} n’est pas disponible dans la région {region}. Contactez le propriétaire de l’image à répliquer dans cette région, ou modifiez la région demandée. La version de l’application de la galerie existe, mais elle n’a pas été répliquée dans cette région.
La signature d’accès partagé n’est pas valide pour l’URI source {uri}. Une erreur Forbidden a été reçue à partir du stockage lors de la tentative de récupération d’informations sur l’URL (mediaLink ou defaultConfigurationLink).
L’objet blob référencé par l’URI source {uri} n’existe pas. L’objet blob fourni pour les propriétés mediaLink ou defaultConfigurationLink n’existe pas.
Impossible d’accéder à l’URL de la version de l’application de la galerie {url} en raison de l’erreur suivante : nom distant introuvable. Assurez-vous que l’objet blob existe et qu’il est accessible publiquement ou qu’il s’agit d’une URL SAS avec des privilèges de lecture. Le cas le plus probable est qu’un URI SAS avec des privilèges de lecture n’a pas été fourni.
Impossible d’accéder à l’URL de la version de l’application de la galerie {url} en raison de l’erreur suivante : {error description}. Assurez-vous que l’objet blob existe et qu’il est accessible publiquement ou qu’il s’agit d’une URL SAS avec des privilèges de lecture. Un problème est survenu au niveau de l’objet blob de stockage fourni. La description de l’erreur fournit plus d’informations.
L’opération {operationName} n’est pas autorisée sur {application}, car elle est marquée pour suppression. Vous ne pouvez réessayer que l’opération de suppression (ou attendre la fin d’une opération en cours). Tentative de mise à jour d’une application en cours de suppression.
La valeur {value} du paramètre « galleryApplicationVersion.properties.publishingProfile.replicaCount » est hors limites. La valeur doit être comprise entre 1 et 3 inclus. Seulement entre 1 et 3 réplicas sont autorisés pour les versions de l’application de machine virtuelle.
La modification de la propriété « galleryApplicationVersion.properties.publishingProfile.manageActions.install » n’est pas autorisée. (Ou mettre à jour, supprimer) Il n’est pas possible de modifier les actions de gestion sur un VmApplication existant. Une nouvelle version de VmApplication doit être créée.
La modification de la propriété « galleryApplicationVersion.properties.publishingProfile.settings.packageFileNamel » n’est pas autorisée. (Ou configFileName) Il n’est pas possible de modifier les paramètres, tels que le nom du fichier de package ou le nom du fichier de configuration. Une nouvelle version de VmApplication doit être créée.
L’objet blob référencé par l’URI source {uri} est trop grand : taille = {size}. La taille maximale d’objet blob autorisée est de 1 Go. La taille maximale d’un objet blob référencé par mediaLink ou defaultConfigurationLink est actuellement de 1 Go.
L’objet blob référencé par l’URI source {uri} est vide. Un objet blob vide a été référencé.
Le type d’objet blob {type} n’est pas pris en charge pour l’opération {operation}. Seuls les objets blob de pages et les objets blob de blocs sont pris en charge. VmApplications prend uniquement en charge les objets blob de pages et les objets blob de blocs.
La signature d’accès partagé n’est pas valide pour l’URI source {uri}. L’URI SAS fourni pour mediaLink ou defaultConfigurationLink n’est pas un URI SAS valide.
Impossible de spécifier {region} dans les régions cibles, car la fonctionnalité requise {featureName} est manquante dans l’abonnement. Inscrivez votre abonnement avec la fonctionnalité requise ou supprimez la région de la liste des régions cibles. Pour utiliser VmApplications dans certaines régions restreintes, l’indicateur de fonctionnalité doit être inscrit pour cet abonnement.
Les régions {regions} de profil de publication de version d’image de galerie doivent contenir l’emplacement {location} de version d’image. La liste des régions pour la réplication doit contenir l’emplacement de la version de l’application.
Les régions en double ne sont pas autorisées dans les régions de publication cibles. Les régions de publication peuvent ne pas avoir de doublons.
Les ressources de la version de l’application de la galerie ne prennent actuellement pas en charge le chiffrement. La propriété de chiffrement pour les régions cibles n’est pas prise en charge pour les applications de machine virtuelle
Le nom de l’entité ne correspond pas au nom figurant dans l’URL de la demande. La version d’application de la galerie spécifiée dans l’URL de la demande ne correspond pas à celle spécifiée dans le corps de la demande.
Le nom de la version de l’application de la galerie n’est pas valide. Le nom de la version de l’application doit suivre Major(int32). Minor(int32). Format Patch(int32), où int est compris entre 0 et 2 147 483 647 (inclus). Par exemple, 1.0.0, 2018.12.1, etc. La version de l’application de la galerie doit respecter le format spécifié.

Étapes suivantes