Extensions et fonctionnalités de machine virtuelle pour Linux

Les extensions de machine virtuelle Azure sont de petites applications permettant d’exécuter des tâches de configuration et d’automatisation post-déploiement sur des machines virtuelles Azure. Par exemple, si une machine virtuelle nécessite l’installation d’un logiciel, une protection antivirus ou la capacité d’exécuter un script en son sein, vous pouvez utiliser une extension de machine virtuelle.

Vous pouvez exécuter des extensions de machine virtuelle Azure à l’aide de l’interface de ligne de commande Azure, de PowerShell, de modèles Azure Resource Manager (modèles ARM) et du portail Azure. Vous pouvez regrouper les extensions avec un nouveau déploiement de machine virtuelle ou les exécuter sur tout système existant.

Cet article offre une vue d’ensemble des extensions de machine virtuelle Azure, des conditions préalables à leur utilisation et des conseils sur la manière de les détecter, de les gérer et de les supprimer. Cet article fournit des informations générales, car de nombreuses extensions de machine virtuelle sont disponibles. Chaque a une configuration potentiellement unique et sa propre documentation.

Cas d’utilisation et exemples

Chaque extension de machine virtuelle Azure a un cas d’usage spécifique. Voici quelques exemples :

En plus des extensions propres à des processus, une extension de script personnalisé est disponible pour les machines virtuelles Windows et Linux. L’extension de script personnalisé pour Linux permet d’exécuter n’importe quel script Bash sur une machine virtuelle. Les scripts personnalisés s’avèrent utile pour concevoir des déploiements Azure qui nécessitent une configuration plus avancée que celle fournie par les outils Azure natifs.

Prérequis

Agent Linux Azure

La gestion de l’extension sur la machine virtuelle nécessite l’installation préalable de l’agent Linux Azure. Certaines extensions spécifiques présentent des prérequis, tels que l’accès à des ressources ou dépendances.

L’agent Linux Azure gère les interactions entre une machine virtuelle Azure et le contrôleur de structure Microsoft Azure. L’agent est responsable de nombreux aspects fonctionnels liés au déploiement et à la gestion des machines virtuelles Azure, notamment l’exécution des extensions de machine virtuelle.

L’agent Linux Azure est préinstallé sur les images de Place de marché Azure. Il peut également être installé manuellement sur les systèmes d’exploitation pris en charge.

L’agent fonctionne sur plusieurs systèmes d’exploitation. Cependant, l’infrastructure des extensions a une limite concernant les systèmes d’exploitation que les extensions utilisent. Certaines extensions ne sont pas prises en charge sur tous les systèmes d’exploitation et peuvent générer le code d’erreur 51 (« Système d’exploitation non pris en charge »). Pour plus d’informations sur la capacité de prise en charge, consultez la documentation de l’extension concernée.

Accès réseau

Les packages d’extension sont téléchargés depuis le référentiel d’extensions de Stockage Azure. Les chargements d’état des extensions sont publiés dans Stockage Azure.

Si vous utilisez une version prise en charge de l’agent Linux Azure, vous n’avez pas besoin d’autoriser l’accès à Stockage Azure dans la région de la machine virtuelle. Vous pouvez utiliser l’agent pour rediriger la communication vers le contrôleur de structure Azure pour les communications de l’agent. Si vous utilisez une version non prise en charge de l’agent, vous devez autoriser l’accès sortant vers Stockage Azure dans cette région à partir de la machine virtuelle.

Important

Si vous avez bloqué l’accès à l’adresse IP privée 168.63.129.16 à l’aide du pare-feu invité, les extensions échouent même si vous utilisez une version prise en charge de l’agent ou si vous avez configuré l’accès sortant.

Les agents peuvent être utilisés uniquement pour télécharger les paquets d’extensions et signaler l’état. Par exemple, si l’installation d’une extension nécessite le téléchargement d’un script depuis GitHub (extension de script personnalisé) ou l’accès à Stockage Azure (Sauvegarde Azure), vous devez ouvrir des ports supplémentaires du pare-feu ou du groupe de sécurité réseau (NSG). Les exigences varient selon les extensions, car ces dernières sont des applications à part entière. Dans le cas des extensions qui exigent un accès à Stockage Azure, vous pouvez autoriser cet accès en utilisant des étiquettes de service de groupe de sécurité réseau Azure.

Pour rediriger les demandes de trafic de l’agent, l’agent Linux Azure prend en charge les serveurs proxy. Toutefois, cette prise en charge des serveurs proxy ne s’applique pas aux extensions. Vous devez configurer chaque extension individuelle pour qu’elle fonctionne avec un proxy.

Détecter les extensions de machine virtuelle

De nombreuses extensions de machine virtuelle peuvent être utilisées avec les machines virtuelles Azure. Pour en obtenir la liste complète, utilisez la commande az vm extension image list. L’exemple suivant liste toutes les extensions disponibles à l’emplacement westus :

az vm extension image list --location westus --output table

Exécuter les extensions de machine virtuelle

Les extensions de machine virtuelle Azure s’exécutent sur des machines virtuelles existantes. Cela s’avère utile lorsque vous devez apporter des modifications à la configuration ou récupérer la connectivité sur une machine virtuelle déjà déployée. Les extensions de machine virtuelle peuvent également être regroupées avec des déploiements de modèle ARM. En utilisant des extensions avec des modèles ARM, vous pouvez déployer et configurer des machines virtuelles Azure sans intervention post-déploiement.

Vous pouvez utiliser les méthodes suivantes pour exécuter une extension sur une machine virtuelle existante.

Azure CLI

Vous pouvez exécuter des extensions de machine virtuelle Azure sur une machine virtuelle existante en utilisant la commande az vm extension set. L’exemple suivant exécute l’extension de script personnalisé sur une machine virtuelle nommée myVM dans un groupe de ressources nommé myResourceGroup. Remplacez le nom du groupe de ressources, le nom de la machine virtuelle et le script à exécuter (https://raw.githubusercontent.com/me/project/hello.sh) par vos propres informations.

az vm extension set \
  --resource-group myResourceGroup \
  --vm-name myVM \
  --name customScript \
  --publisher Microsoft.Azure.Extensions \
  --settings '{"fileUris": ["https://raw.githubusercontent.com/me/project/hello.sh"],"commandToExecute": "./hello.sh"}'

Quand l’extension s’exécute correctement, la sortie ressemble à l’exemple suivant :

info:    Executing command vm extension set
+ Looking up the VM "myVM"
+ Installing extension "CustomScript", VM: "mvVM"
info:    vm extension set command OK

Azure PowerShell

Vous pouvez exécuter des extensions de machine virtuelle Azure sur une machine virtuelle existante en utilisant la commande Set-AzVMExtension. L’exemple suivant exécute l’extension de script personnalisé sur une machine virtuelle nommée myVM dans un groupe de ressources nommé myResourceGroup. Remplacez le nom du groupe de ressources, le nom de la machine virtuelle et le script à exécuter (https://raw.githubusercontent.com/me/project/hello.sh) par vos propres informations.

$Params = @{
    ResourceGroupName  = 'myResourceGroup'
    VMName             = 'myVM'
    Name               = 'CustomScript'
    Publisher          = 'Microsoft.Azure.Extensions'
    ExtensionType      = 'CustomScript'
    TypeHandlerVersion = '2.1'
    Settings          = @{fileUris = @('https://raw.githubusercontent.com/me/project/hello.sh'); commandToExecute = './hello.sh'}
}
Set-AzVMExtension @Params

Quand l’extension s’exécute correctement, la sortie ressemble à l’exemple suivant :

RequestId IsSuccessStatusCode StatusCode ReasonPhrase
--------- ------------------- ---------- ------------
                         True         OK OK

Portail Azure

Vous pouvez appliquer des extensions de machine virtuelle à une machine virtuelle existante par le biais du portail Azure. Sélectionnez la machine virtuelle dans le portail, sélectionnez Extensions, puis Ajouter. Choisissez l’extension souhaitée dans la liste des extensions disponibles, puis suivez les instructions de l’Assistant.

L’image suivante illustre l’installation de l’extension de script personnalisé pour Linux à partir du portail Azure :

Screenshot of the dialog for installing the Custom Script extension for Linux.

Modèles Microsoft Azure Resource Manager

Vous pouvez ajouter des extensions de machine virtuelle à un modèle ARM et les exécuter avec le déploiement du modèle. Lorsque vous déployez une extension avec un modèle, vous pouvez créer des déploiements Azure entièrement configurés.

Par exemple, le code JSON suivant est tiré d’un modèle ARM complet qui déploie un ensemble de machines virtuelles à charge équilibrée et une base de données Azure SQL, puis installe une application .NET Core sur chaque machine virtuelle. L’extension de machine virtuelle se charge de l’installation du logiciel.

{
    "apiVersion": "2015-06-15",
    "type": "extensions",
    "name": "config-app",
    "location": "[resourceGroup().location]",
    "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', concat(variables('vmName'),copyindex()))]"
    ],
    "tags": {
    "displayName": "config-app"
    },
    "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
        "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
        ]
    },
    "protectedSettings": {
        "commandToExecute": "[concat('sudo sh config-music.sh ',variables('musicStoreSqlName'), ' ', parameters('adminUsername'), ' ', parameters('sqlAdminPassword'))]"
    }
    }
}

Pour plus d’informations sur la création de modèles ARM, consultez Machines virtuelles dans un modèle Azure Resource Manager.

Aider à sécuriser les données des extensions de machine virtuelle

Quand vous exécutez une extension de machine virtuelle, vous pouvez avoir besoin d’inclure des informations sensibles telles que des informations d’identification, des noms de compte de stockage et des clés d’accès. De nombreuses extensions de machine virtuelle comprennent une configuration protégée qui chiffre les données et les déchiffre uniquement à l’intérieur de la machine virtuelle cible. Chaque extension possède un schéma spécifique de configuration protégée, présenté en détail dans la documentation consacrée à l’extension.

L’exemple suivant illustre une instance de l’extension de script personnalisé pour Linux. La commande à exécuter inclut un ensemble d’informations d’identification. Dans cet exemple, la commande à exécuter n’est pas chiffrée.

{
  "apiVersion": "2015-06-15",
  "type": "extensions",
  "name": "config-app",
  "location": "[resourceGroup().location]",
  "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', concat(variables('vmName'),copyindex()))]"
  ],
  "tags": {
    "displayName": "config-app"
  },
  "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
      "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
      ],
      "commandToExecute": "[concat('sudo sh config-music.sh ',variables('musicStoreSqlName'), ' ', parameters('adminUsername'), ' ', parameters('sqlAdminPassword'))]"
    }
  }
}

Pour sécuriser la chaîne d’exécution, déplacez la propriété commandToExecute vers la configuration protected, comme indiqué dans l’exemple suivant :

{
  "apiVersion": "2015-06-15",
  "type": "extensions",
  "name": "config-app",
  "location": "[resourceGroup().location]",
  "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', concat(variables('vmName'),copyindex()))]"
  ],
  "tags": {
    "displayName": "config-app"
  },
  "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
      "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
      ]
    },
    "protectedSettings": {
      "commandToExecute": "[concat('sudo sh config-music.sh ',variables('musicStoreSqlName'), ' ', parameters('adminUsername'), ' ', parameters('sqlAdminPassword'))]"
    }
  }
}

Mise à jour des agents et des extensions

Les agents et les extensions partagent le même mécanisme de mise à jour automatique.

Quand une mise à jour est disponible et que les mises à jour automatiques sont activées, la mise à jour est installée sur la machine virtuelle seulement si un changement a été apporté à une extension ou après d’autres modifications du modèle de machine virtuelle, par exemple :

  • Disques de données
  • Extensions
  • Étiquettes d’extension
  • Conteneur de diagnostics de démarrage
  • Secrets de système d’exploitation invité
  • Taille de la machine virtuelle
  • Profil réseau

Les dates de publication de mises à jour par les éditeurs varient selon les régions. Vous pouvez donc disposer de machines virtuelles équipées de versions distinctes dans différentes régions.

Notes

Certaines mises à jour peuvent nécessiter des règles de pare-feu supplémentaires. Consultez Accès réseau.

Mises à jour d’agent

L’agent de machine virtuelle Linux contient dans un seul et même package le code de l’agent d’approvisionnement et le code de gestion des extensions. Ces derniers ne peuvent pas être séparés.

Vous pouvez désactiver l’agent d’approvisionnement quand vous voulez effectuer un approvisionnement sur Azure à l’aide de cloud-init.

Les versions prises en charge des agents peuvent utiliser des mises à jour automatiques. Le seul code pouvant être mis à jour est le code de gestion des extensions, pas le code d’approvisionnement. Le code de l’agent de provisionnement est un code à exécution unique.

Le code de gestion des extensions est chargé des opérations suivantes :

  • Communiquer avec la structure Azure.
  • Gérer les opérations d’extension de machine virtuelle, telles que les installations, les rapports d’état, la mise à jour des extensions individuelles et la suppression des extensions. Les mises à jour comprennent les correctifs de sécurité, les correctifs de bogues et les améliorations du code de gestion des extensions.

Quand l’agent est installé, un démon parent est créé. Ce parent génère ensuite un processus enfant qui est utilisé pour gérer les extensions. Si une mise à jour est disponible pour l’agent, elle est téléchargée. Le parent arrête le processus enfant, le met à jour, puis le redémarre. En cas de problème avec la mise à jour, le processus parent restaure la version enfant précédente.

Le processus parent ne peut pas être mis à jour automatiquement. Le parent ne peut être mis à jour que par une mise à jour du package de distribution.

Pour vérifier quelle version vous exécutez, vérifiez waagent comme suit :

waagent --version

Le résultat ressemble à l’exemple suivant :

WALinuxAgent-2.2.45 running on <Linux Distro>
Python: 3.6.9
Goal state agent: 2.7.1.0

Dans la sortie de l’exemple précédent, le parent (ou la version déployée du package) est WALinuxAgent-2.2.45. La valeur de Goal state agent est la version de mise à jour automatique.

Nous vous recommandons vivement de toujours activer la mise à jour automatique pour l’agent : AutoUpdate.Enabled=y. Si vous n’activez pas la mise à jour automatique, vous devrez continuer à mettre à jour manuellement l’agent, et vous n’obtiendrez pas les correctifs de bogues et de sécurité.

Mises à jour des extensions

Quand une mise à jour d’extension est disponible et que les mises à jour automatiques sont activées, une fois qu’une modification du modèle de machine virtuelle se produit, l’agent Linux Azure télécharge l’extension et la met à jour.

Les mises à jour automatiques des extensions sont soit une version mineure, soit un correctif logiciel. Vous pouvez accepter ou refuser les mises à jour d’extension de version mineure quand vous approvisionnez l’extension. L’exemple suivant montre comment mettre automatiquement à niveau les versions mineures dans un modèle ARM en utilisant "autoUpgradeMinorVersion": true, :

    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
        "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
        ]
    },

Si vous souhaitez obtenir les dernières correctifs de bogues des versions mineures, nous vous recommandons vivement de toujours sélectionner l’option de mise à jour automatique dans vos déploiements d’extensions. Vous ne pouvez pas refuser les mises à jour de type correctif logiciel qui apportent des correctifs de sécurité ou de bogues importants.

Si vous désactivez les mises à jour automatiques ou si vous devez mettre à niveau une version majeure, utilisez az vm extension set ou Set-AzVMExtension et spécifiez la version cible.

Comment identifier les mises à jour d’extension

Identifier si l’extension est définie avec la propriété autoUpgradeMinorVersion sur une machine virtuelle

Le modèle de machine virtuelle vous permet de déterminer si l’extension a été approvisionnée avec la propriété autoUpgradeMinorVersion. Pour vérifier ce point, utilisez la commande az vm show, et indiquez le groupe de ressources et le nom de machine virtuelle comme suit :

az vm show --resource-group myResourceGroup --name myVM

L’exemple de sortie suivant montre que autoUpgradeMinorVersion est définie sur true :

  "resources": [
    {
      "autoUpgradeMinorVersion": true,
      "forceUpdateTag": null,
      "id": "/subscriptions/guid/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM/extensions/customScript",

Identifier quand un événement autoUpgradeMinorVersion s’est produit

Pour déterminer le moment où une extension a fait l’objet d’une mise à jour, consultez les journaux d’activité de l’agent sur la machine virtuelle à l’emplacement /var/log/waagent.log.

Dans l’exemple suivant, Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9025 était installé sur la machine virtuelle. Un correctif était disponible pour Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027.

INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Expected handler state: enabled
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Decide which version to use
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Use version: 2.3.9027
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Current handler state is: NotInstalled
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Download extension package
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Unpack extension package
INFO Event: name=Microsoft.OSTCExtensions.LinuxDiagnostic, op=Download, message=Download succeeded
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Initialize extension directory
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Update settings file: 0.settings
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9025] Disable extension.
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9025] Launch command:diagnostic.py -disable
...
INFO Event: name=Microsoft.OSTCExtensions.LinuxDiagnostic, op=Disable, message=Launch command succeeded: diagnostic.py -disable
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Update extension.
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Launch command:diagnostic.py -update
2017/08/14 20:21:57 LinuxAzureDiagnostic started to handle.

Autorisations d’agent

Pour exécuter ses tâches, l’agent doit s’exécuter comme racine.

Résoudre les problèmes liés aux extensions de machine virtuelle

Chaque extension de machine virtuelle peut présenter une procédure spécifique de résolution des problèmes. Par exemple, lorsque vous utilisez l’extension de script personnalisé, vous pouvez trouver les détails d’exécution du script localement sur la machine virtuelle où l’extension a été exécutée.

Les actions de résolution des problèmes ci-après s’applique à toutes les extensions de machine virtuelle :

  • Pour consulter le journal de l’agent Linux Azure, examinez l’activité au moment où votre extension a été approvisionnée dans /var/log/waagent.log.

  • Pour plus de détails, consultez les journaux de l’extension à l’emplacement /var/log/azure/<extensionName>.

  • Consultez les sections de résolution des problèmes dans la documentation spécifique aux extensions pour connaître les codes d’erreur, les problèmes connus et d’autres informations spécifiques aux extensions.

  • Examinez les journaux d’activité système. Vérifiez si d’autres opérations sont susceptibles d’avoir interféré avec l’extension, par exemple l’installation prolongée d’une autre application qui a nécessité un accès exclusif au gestionnaire de package.

Motifs courants des échecs d’extension

  • Les extensions ont 20 minutes pour s’exécuter. (Les exceptions sont le script personnalisé et Chef, qui disposent de 90 minutes.) Si votre déploiement excède cette durée, il est signalé comme expiration du délai d’attente. Cela peut être dû à des machines virtuelles à faibles ressources, à d’autres configurations de machines virtuelles ou à des tâches de démarrage qui consomment de grandes quantités de ressources pendant que l’extension tente de s’approvisionner.

  • La configuration minimale requise n’est pas respectée. Certaines extensions présentent des dépendances vis-à-vis des références SKU de machine virtuelle, telles que les images HPC. Les extensions peuvent avoir certaines exigences d’accès réseau, comme la communication avec Stockage Azure ou des services publics. D’autres exemples peuvent être l’accès aux référentiels de packages, le manque d’espace disque ou les restrictions de sécurité.

  • L’accès au gestionnaire de package est exclusif. Dans certains cas, la configuration d’une machine virtuelle et l’installation d’une extension de longue durée peuvent entrer en conflit, car ces deux tâches exigent un accès exclusif au gestionnaire de package.

Afficher l’état de l’extension

Une fois qu’une extension de machine virtuelle a été exécutée sur une machine virtuelle, utilisez la commande az vm get-instance-view pour retourner l’état de l’extension comme suit :

az vm get-instance-view \
    --resource-group myResourceGroup \
    --name myVM \
    --query "instanceView.extensions"

Le résultat ressemble à l’exemple suivant :

  {
    "name": "customScript",
    "statuses": [
      {
        "code": "ProvisioningState/failed/0",
        "displayStatus": "Provisioning failed",
        "level": "Error",
        "message": "Enable failed: failed to execute command: command terminated with exit status=127\n[stdout]\n\n[stderr]\n/bin/sh: 1: ech: not found\n",
        "time": null
      }
    ],
    "substatuses": null,
    "type": "Microsoft.Azure.Extensions.CustomScript",
    "typeHandlerVersion": "2.1.6"
  }

Vous pouvez également trouver l’état d’exécution des extensions dans le portail Azure. Sélectionnez la machine virtuelle, sélectionnez Extensions, puis sélectionnez l’extension souhaitée.

Réexécuter une extension de machine virtuelle

Dans certains cas, vous pouvez avoir besoin de réexécuter une extension de machine virtuelle. Pour ce faire, supprimez-la, puis réexécutez-la avec la méthode d’exécution de votre choix.

Pour supprimer une extension, utilisez az vm extension delete comme suit :

az vm extension delete \
    --resource-group myResourceGroup \
    --vm-name myVM \
    --name customScript

Vous pouvez également supprimer une extension dans le portail Azure :

  1. Sélectionnez une machine virtuelle.
  2. Sélectionnez Extensions.
  3. Sélectionnez l’extension.
  4. Sélectionner Désinstaller.

Informations de référence sur les extensions de machine virtuelle courantes

Nom de l’extension Description
Extension de script personnalisé pour Linux Exécuter des scripts sur une machine virtuelle Azure.
Extension VMAccess Récupérer l’accès à une machine virtuelle Azure. Vous pouvez également l’utiliser pour gérer les utilisateurs et les informations d’identification.
Extension Diagnostics Azure Gérer Diagnostics Azure.

Étapes suivantes

Pour plus d’informations sur les extensions de machine virtuelle, consultez Extensions et fonctionnalités des machines virtuelles Azure.