Utiliser l’extension de script personnalisé Azure version 2 avec des machines virtuelles Linux

Attention

Cet article fait référence à CentOS, une distribution Linux proche de l’état EOL (End Of Life). Faites le point sur votre utilisation et organisez-vous en conséquence. Pour plus d’informations, consultez les conseils d’aide relatifs à la fin de vie de CentOS.

L’extension de script personnalisé Version 2 télécharge et exécute des scripts sur des machines virtuelles Azure. Utilisez cette extension pour la configuration post-déploiement, l’installation de logiciels ou toute autre tâche de configuration ou de gestion. Il est possible de télécharger des scripts à partir du Stockage Azure ou de tout autre emplacement Internet accessible, ou de les fournir au runtime de l’extension.

L’extension de script personnalisé est compatible avec les modèles Azure Resource Manager. Elle peut aussi être exécutée à l’aide d’Azure CLI, PowerShell ou de l’API REST des machines virtuelles Azure.

Cet article explique comment utiliser l’extension de script personnalisé avec Azure CLI et l’exécuter à l’aide d’un modèle Azure Resource Manager. Il indique également la procédure de résolution des problèmes pour les systèmes Linux.

Il existe deux versions de l’extension de script personnalisé :

  • Version 1 : Microsoft.OSTCExtensions.CustomScriptForLinux
  • Version 2 : Microsoft.Azure.Extensions.CustomScript

Utiliser la Version 2 pour les déploiements nouveaux et existants. La nouvelle version est un remplacement. La migration est aussi simple que de changer le nom et la version. Vous n’avez pas besoin de changer la configuration de votre extension.

Prérequis

Distributions de Linux prises en charge

Distribution x64 ARM64
Alma Linux 9.x + 9.x +
CentOS 7.x+, 8.x+ 7.x+
Debian > 10 11.x+
Flatcar Linux 3374.2.x+ 3374.2.x+
Linux Azure 2.x 2.x
OpenSUSE 12.3+ Non pris en charge
Oracle Linux 6.4+, 7.x+, 8.x+ Non pris en charge
Red Hat Enterprise Linux 6.7+, 7.x+, 8.x+, 9.x+ 8.6+, 9.x+
Rocky Linux 9.x + 9.x +
SLES 12.x+, 15.x+ 15.x SP4+
Ubuntu 18.04+, 20.04+, 22.04+ 20.04+, 22.04+

Emplacement du script

Vous pouvez définir l’extension pour utiliser vos informations d’identification de Stockage Blob Azure afin d’accéder au Stockage Blob Azure. Le script peut être placé n’importe où, tant que la machine virtuelle peut router le trafic vers ce point de terminaison, par exemple, GitHub ou un serveur de fichiers interne.

Connectivité Internet

Pour télécharger un script en externe, par exemple, à partir de GitHub ou du Stockage Azure, vous devez ouvrir d’autres ports de pare-feu ou de groupe de sécurité réseau (NSG). Par exemple, si votre script se trouve dans le Stockage Azure, vous pouvez autoriser l’accès en utilisant des étiquettes de service de NSG Azure pour le stockage.

Si votre script se trouve sur un serveur local, vous devez peut-être encore ouvrir d’autres ports NSG ou de pare-feu.

Conseils

  • Le taux d’échec le plus élevé pour cette extension est dû à des erreurs de syntaxe dans le script. Vérifiez que le script s’exécute sans erreur. Ajoutez de la journalisation supplémentaire dans le script pour faciliter la recherche des échecs.
  • Écrivez des scripts idempotents, pour que même si vous les exécutez plusieurs fois par inadvertance, aucun changement ne se produise sur le système.
  • Vérifiez que l’exécution des scripts ne nécessite pas d’entrée utilisateur.
  • La durée d’exécution autorisée du script est 90 minutes. Toute opération dépassant cette durée entraîne l’échec du provisionnement de l’extension.
  • Ne placez pas de redémarrages à l’intérieur du script. Un redémarrage entraîne des problèmes avec d’autres extensions en cours d’installation, et l’extension ne continue pas après le redémarrage.
  • Si l’un de vos scripts déclenche un redémarrage avant l’installation des applications et l’exécution des scripts, planifiez le redémarrage à l’aide d’une tâche cron ou d’outils tels que les extensions DSC, Chef ou Puppet.
  • N’exécutez pas de script pouvant provoquer un arrêt ou une mise à jour de l’agent Azure Linux. Ce type de script peut laisser l’extension dans un état de transition et entraîner l’expiration du délai d’attente.
  • L’extension exécute une seule fois un script. Si vous voulez exécuter un script à chaque démarrage, vous pouvez utiliser une image cloud-init et utiliser un module Scripts par démarrage. Vous pouvez également utiliser le script pour créer une unité de service systemd.
  • Vous pouvez appliquer seulement une version d’une extension à la machine virtuelle. Pour exécuter un deuxième script personnalisé, mettez à jour l’extension existante avec une nouvelle configuration. Sinon, vous pouvez supprimer l’extension de script personnalisé et la réappliquer avec le script mis à jour.
  • Si vous voulez planifier l’exécution d’un script, utilisez l’extension pour créer une tâche cron.
  • Pendant l’exécution du script, vous voyez seulement un état d’extension en cours de transition dans le portail Azure ou Azure CLI. Si vous voulez des mises à jour plus fréquentes de l’état d’un script en cours d’exécution, créez votre propre solution.
  • L’extension de script personnalisé ne prend pas en charge en mode natif les serveurs proxy. Toutefois, vous pouvez utiliser un outil de transfert de fichiers, tel que Curl, qui prend en charge les serveurs proxy au sein de votre script.
  • Tenez compte du fait que vos scripts ou commandes sont susceptibles d’utiliser des emplacements de répertoire autres que ceux par défaut. Gérez cette situation en suivant une logique.

Schéma d’extensions

La configuration de l’extension de script personnalisé spécifie des éléments tels que l’emplacement du script et la commande à exécuter. Vous pouvez stocker cette configuration dans des fichiers de configuration, ou la spécifier dans la ligne de commande ou dans un modèle Azure Resource Manager.

Vous pouvez stocker des données sensibles dans une configuration protégée, qui est chiffrée et uniquement déchiffrée sur une VM cible. La configuration protégée est utile lorsque la commande d’exécution comprend des secrets tels qu’un mot de passe. Voici un exemple :

{
  "name": "config-app",
  "type": "Extensions",
  "location": "[resourceGroup().location]",
  "apiVersion": "2019-03-01",
  "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": {
      "skipDos2Unix":false,
      "timestamp":123456789
    },
    "protectedSettings": {
       "commandToExecute": "<command-to-execute>",
       "script": "<base64-script-to-execute>",
       "storageAccountName": "<storage-account-name>",
       "storageAccountKey": "<storage-account-key>",
       "fileUris": ["https://.."],
       "managedIdentity" : "<managed-identity-identifier>"
    }
  }
}

Notes

La propriété managedIdentityne doit pas être utilisée conjointement avec la propriété storageAccountName ou storageAccountKey.

Valeurs de propriétés

Nom Valeur ou exemple Type de données
apiVersion 2019-03-01 Date
publisher Microsoft.Azure.Extensions string
type CustomScript string
typeHandlerVersion 2.1 int
fileUris https://github.com/MyProject/Archive/MyPythonScript.py tableau
commandToExecute python MyPythonScript.py \<my-param1> string
script IyEvYmluL3NoCmVjaG8gIlVwZGF0aW5nIHBhY2thZ2VzIC4uLiIKYXB0IHVwZGF0ZQphcHQgdXBncmFkZSAteQo= string
skipDos2Unix false boolean
timestamp 123456789 Entier de 32 bits
storageAccountName examplestorageacct string
storageAccountKey TmJK/1N3AbAZ3q/+hOXoi/l73zOqsaxXDhqa9Y83/v5UpXQp2DQIBuv2Tifp60cE/OaHsJZmQZ7teQfczQj8hg== string
managedIdentity { } ou { "clientId": "31b403aa-c364-4240-a7ff-d85fb6cd7232" } ou { "objectId": "12dd289c-0583-46e5-b9b4-115d5c19ef4b" } Objet JSON

Détails des valeurs de propriété

Propriété Facultatif ou obligatoire Détails
apiVersion Non applicable Vous pouvez trouver la version d’API la plus récente en utilisant l’Explorateur de ressources ou la commande az provider list -o json dans Azure CLI.
fileUris Facultatif URL des fichiers à télécharger.
commandToExecute Obligatoire si script n’est pas défini Script de point d’entrée à exécuter. Utilisez cette propriété à la place de script si votre commande contient des secrets comme des mots de passe.
script Obligatoire si commandToExecute n’est pas défini Un script encodé en base64 et éventuellement compressé au format gzip exécuté par /bin/sh.
skipDos2Unix Facultatif Définissez cette valeur sur false pour ignorer la conversion dos2unix des scripts ou des URL de fichier basées sur des scripts.
timestamp Facultatif Changez cette valeur uniquement pour déclencher une réexécution du script. Toute valeur entière est acceptable, à condition qu’elle soit différente de la valeur précédente.
storageAccountName Facultatif Nom du compte de stockage. Si vous spécifiez des informations d’identification de stockage, toutes les valeurs fileUris doivent être des URL de blobs Azure.
storageAccountKey Facultatif Clé d’accès du compte de stockage.
managedIdentity Facultatif Identité managée pour le téléchargement de fichiers. Les valeurs sont clientId (facultatif, chaîne), qui correspond à l’ID client de l’identité managée, et objectId (facultatif, chaîne), qui correspond à l’ID d’objet de l’identité managée.

Les paramètres publics sont envoyés en texte clair à la machine virtuelle sur laquelle le script est exécuté. Les paramètres protégés sont chiffrés avec une clé connue uniquement d’Azure et de la machine virtuelle. Les paramètres sont enregistrés sur la machine virtuelle quand ils sont envoyés. Autrement dit, si les paramètres sont chiffrés, ils sont enregistrés chiffrés sur la machine virtuelle. Le certificat utilisé pour déchiffrer les valeurs chiffrées est stocké sur la machine virtuelle. Le certificat est également utilisé pour déchiffrer les paramètres, si nécessaire, au moment de l’exécution.

L’utilisation de paramètres publics peut être utile pour le débogage, mais nous vous recommandons fortement d’utiliser des paramètres protégés.

Vous pouvez définir les valeurs suivantes dans des paramètres public ou protégés. L’extension rejette toutes les configurations où ces valeurs sont définies dans des paramètres publics et protégés.

  • commandToExecute
  • script
  • fileUris

Propriété : skipDos2Unix

La version précédente de l’extension de script personnalisé, Microsoft.OSTCExtensions.CustomScriptForLinux, convertit automatiquement les fichiers DOS en fichiers UNIX en traduisant \r\n en \n. Cette conversion existe toujours et est activée par défaut. Elle est appliquée à tous les fichiers téléchargés à partir de fileUris ou du paramètre de script en fonction d’un des critères suivants :

  • L’extension est .sh, .txt, .py ou .pl. Le paramètre de script correspond toujours à ce critère, car il est supposé être un script exécuté avec /bin/sh. Le paramètre de script est enregistré en tant que script.sh sur la machine virtuelle.
  • Si le fichier commence par #!.

La valeur par défaut est false, ce qui signifie que la conversion dos2unix est exécutée. Vous pouvez ignorer la conversion dos2unix en définissant skipDos2Unix sur true :

{
  "fileUris": ["<url>"],
  "commandToExecute": "<command-to-execute>",
  "skipDos2Unix": true
}

Propriété : script

L’extension de script personnalisé prend en charge l’exécution d’un script défini par l’utilisateur. Les paramètres de script combinent commandToExecute et fileUris dans un seul paramètre. Au lieu de devoir configurer un fichier à télécharger depuis un Stockage Azure ou un gist GitHub, vous pouvez encoder le script comme un paramètre. Vous pouvez utiliser le script pour remplacer commandToExecute et fileUris.

Voici quelques-unes des exigences :

  • Le script doit être encodé en Base64.
  • Le script peut éventuellement être compressé au format GZip.
  • Vous pouvez utiliser le paramètre de script dans des paramètres publics ou protégés.
  • La taille maximale des données du paramètre de script est de 256 Ko. Si le script dépasse cette taille, il n’est pas exécuté.

Par exemple, le script suivant enregistré dans le fichier /script.sh/ :

#!/bin/sh
echo "Creating directories ..."
mkdir /data
chown user:user /data
mkdir /appdata
chown user:user /appdata

Vous construisez le paramètre de script d’extension de script personnalisé approprié en prenant la sortie de la commande suivante :

cat script.sh | base64 -w0
{
  "script": "IyEvYmluL3NoCmVjaG8gIlVwZGF0aW5nIHBhY2thZ2VzIC4uLiIKYXB0IHVwZGF0ZQphcHQgdXBncmFkZSAteQo="
}

Dans la plupart des cas, le script peut éventuellement être compressé au format gzip pour réduire davantage la taille. L’extension de script personnalisé détecte automatiquement l’utilisation de la compression gzip.

cat script | gzip -9 | base64 -w 0

L’extension de script personnalisé utilise l’algorithme suivant pour exécuter un script :

  1. Déclarez que la longueur de la valeur du script ne dépasse pas 256 Ko.
  2. Décodez la valeur du script en Base64.
  3. Essayez de décompresser la valeur décodée en Base64.
  4. Écrivez la valeur décodée et éventuellement décompressée sur le disque : /var/lib/waagent/custom-script/#/script.sh.
  5. Exécutez le script avec _/bin/sh -c /var/lib/waagent/custom-script/#/script.sh.

Propriété : managedIdentity

Notes

Cette propriété doit uniquement être spécifiée dans les paramètres protégés.

L’extension de script personnalisé, version 2.1 et ultérieure, prend en charge les identités managées pour le téléchargement de fichiers à partir des URL fournies dans le paramètre fileUris. Cette approche permet à l’extension de script personnalisé d’accéder aux blobs ou conteneurs privés de Stockage Azure sans que l’utilisateur passe des secrets, comme des jetons de signature d’accès partagé (SAS) ou des clés de compte de stockage.

Pour utiliser cette fonctionnalité, ajoutez une identité attribuée par le système ou attribuée par l’utilisateur à la machine virtuelle ou au groupe de machines virtuelles identiques sur lesquelles l’extension de script personnalisé devrait s’exécuter. Ensuite, accordez à l’identité managée l’accès au conteneur ou au blob Stockage Azure.

Pour utiliser l’identité affectée par le système sur la machine virtuelle ou le groupe de machines virtuelles identiques cible, définissez managedidentity sur un objet JSON vide.

{
  "fileUris": ["https://mystorage.blob.core.windows.net/privatecontainer/script1.sh"],
  "commandToExecute": "sh script1.sh",
  "managedIdentity" : {}
}

Pour utiliser l’identité attribuée par l’utilisateur sur la machine virtuelle ou le groupe de machines virtuelles identiques cible, configurez managedidentity avec l’ID client ou l’ID d’objet de l’identité managée.

{
  "fileUris": ["https://mystorage.blob.core.windows.net/privatecontainer/script1.sh"],
  "commandToExecute": "sh script1.sh",
  "managedIdentity" : { "clientId": "31b403aa-c364-4240-a7ff-d85fb6cd7232" }
}
{
  "fileUris": ["https://mystorage.blob.core.windows.net/privatecontainer/script1.sh"],
  "commandToExecute": "sh script1.sh",
  "managedIdentity" : { "objectId": "12dd289c-0583-46e5-b9b4-115d5c19ef4b" }
}

Notes

La propriété managedIdentityne doit pas être utilisée conjointement avec la propriété storageAccountName ou storageAccountKey.

Déploiement de modèle

Vous pouvez déployer des extensions VM Azure avec des modèles Azure Resource Manager. Le schéma JSON détaillé dans la section précédente peut être utilisé dans un modèle Azure Resource Manager pour exécuter l’extension de script personnalisé pendant le déploiement du modèle. Un exemple de modèle comprenant l’extension de script personnalisé est disponible sur GitHub.

{
  "name": "config-app",
  "type": "extensions",
  "location": "[resourceGroup().location]",
  "apiVersion": "2019-03-01",
  "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": {
      },
    "protectedSettings": {
      "commandToExecute": "sh hello.sh <param2>",
      "fileUris": ["https://github.com/MyProject/Archive/hello.sh"
      ]
    }
  }
}

Notes

Ces noms de propriétés respectent la casse. Pour éviter des problèmes de déploiement, utilisez les noms présentés ici.

Azure CLI

Si vous utilisez Azure CLI pour exécuter l’extension de script personnalisé, créez un fichier ou des fichiers de configuration. Au minimum, le fichier de configuration doit contenir commandToExecute. La commande az vm extension set fait référence au fichier de configuration :

az vm extension set \
  --resource-group myResourceGroup \
  --vm-name myVM --name customScript \
  --publisher Microsoft.Azure.Extensions \
  --protected-settings ./script-config.json

Sinon, vous pouvez éventuellement spécifier les paramètres dans la commande sous forme d’une chaîne au format JSON. Cette approche permet de spécifier la configuration lors de l’exécution sans fichier de configuration distinct.

az vm extension set \
  --resource-group exttest \
  --vm-name exttest \
  --name customScript \
  --publisher Microsoft.Azure.Extensions \
  --protected-settings '{"fileUris": ["https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"],"commandToExecute": "./config-music.sh"}'

Exemple : configuration publique avec un fichier de script

Cet exemple utilise le fichier de script suivant nommé script-config.json :

{
  "fileUris": ["https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"],
  "commandToExecute": "./config-music.sh"
}
  1. Créez le fichier de script à l’aide de l’éditeur de texte de votre choix ou de la commande CLI suivante :

    cat <<EOF > script-config.json
    {
      "fileUris": ["https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"],
      "commandToExecute": "./config-music.sh"
    }
    EOF
    
  2. Exécutez la commande suivante :

    az vm extension set \
      --resource-group myResourceGroup \
      --vm-name myVM --name customScript \
      --publisher Microsoft.Azure.Extensions \
      --settings ./script-config.json
    

Exemple : configuration publique sans fichier de script

Cet exemple utilise le contenu au format JSON suivant :

{
  "commandToExecute": "apt-get -y update && apt-get install -y apache2"
}

Exécutez la commande suivante :

az vm extension set \
  --resource-group tim0329vmRG \
  --vm-name tim0329vm --name customScript \
  --publisher Microsoft.Azure.Extensions \
  --settings '{"commandToExecute": "apt-get -y update && apt-get install -y apache2"}'

Exemple : fichiers de configuration publique et protégée

Utilisez un fichier de configuration publique pour spécifier l’URI du fichier de script :

{
  "fileUris": ["https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"]
}

Utilisez un fichier de configuration protégée pour spécifier la commande à exécuter :

{
  "commandToExecute": "./config-music.sh"
}
  1. Créez le fichier de configuration publique à l’aide de l’éditeur de texte de votre choix ou de la commande CLI suivante :

    cat <<EOF > script-config.json
    {
      "fileUris": ["https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"]
    }
    EOF
    
  2. Créez le fichier de configuration protégée à l’aide de l’éditeur de texte de votre choix ou de la commande CLI suivante :

    cat <<EOF > protected-config.json
    {
      "commandToExecute": "./config-music.sh"
    }
    EOF
    
  3. Exécutez la commande suivante :

    az vm extension set \
      --resource-group myResourceGroup \
      --vm-name myVM \
      --name customScript \
      --publisher Microsoft.Azure.Extensions \
      --settings ./script-config.json \
      --protected-settings ./protected-config.json
    

Virtual Machine Scale Sets

Si vous déployez l’extension de script personnalisé à partir du portail Azure, vous ne contrôlez pas l’expiration du jeton SAS pour accéder au script dans votre compte de stockage. Le déploiement initial fonctionne, mais quand le jeton SAP du compte de stockage expire, toute opération de mise à l’échelle ultérieure échoue, car l’extension de script personnalisé ne peut plus accéder au compte de stockage.

Nous vous recommandons d’utiliser PowerShell, Azure CLI ou un modèle Azure Resource Manager quand vous déployez l’extension de script personnalisé sur un groupe de machines virtuelles identiques. De cette façon, vous pouvez choisir d’utiliser une identité managée ou de contrôler directement l’expiration du jeton SAS pour accéder au script dans votre compte de stockage aussi longtemps que nécessaire.

Dépannage

Lors de l’exécution de l’extension de script personnalisé, le script est créé ou téléchargé dans un répertoire semblable à l’exemple suivant. La sortie de la commande y est également enregistrée, dans les fichiers stdout et stderr.

sudo ls -l /var/lib/waagent/custom-script/download/0/

Pour résoudre les problèmes, recherchez d’abord le journal de l’agent Linux et vérifiez que l’extension a été exécutée :

sudo cat /var/log/waagent.log

Recherchez l’exécution de l’extension. Elle ressemble à :

2018/04/26 17:47:22.110231 INFO [Microsoft.Azure.Extensions.customScript-2.0.6] [Enable] current handler state is: notinstalled
2018/04/26 17:47:22.306407 INFO Event: name=Microsoft.Azure.Extensions.customScript, op=Download, message=Download succeeded, duration=167
2018/04/26 17:47:22.339958 INFO [Microsoft.Azure.Extensions.customScript-2.0.6] Initialize extension directory
2018/04/26 17:47:22.368293 INFO [Microsoft.Azure.Extensions.customScript-2.0.6] Update settings file: 0.settings
2018/04/26 17:47:22.394482 INFO [Microsoft.Azure.Extensions.customScript-2.0.6] Install extension [bin/custom-script-shim install]
2018/04/26 17:47:23.432774 INFO Event: name=Microsoft.Azure.Extensions.customScript, op=Install, message=Launch command succeeded: bin/custom-script-shim install, duration=1007
2018/04/26 17:47:23.476151 INFO [Microsoft.Azure.Extensions.customScript-2.0.6] Enable extension [bin/custom-script-shim enable]
2018/04/26 17:47:24.516444 INFO Event: name=Microsoft.Azure.Extensions.customScript, op=Enable, message=Launch command succeeded: bin/custom-sc

Dans la sortie précédente :

  • Enable correspond au début de l’exécution de la commande.
  • Download correspond au téléchargement du package d’extension de script personnalisé à partir d’Azure et non aux fichiers de script spécifiés dans fileUris.

L’extension de script Azure génère un journal qui se trouve à cet emplacement :

sudo cat /var/log/azure/custom-script/handler.log

Recherchez l’exécution individuelle. Elle ressemble à :

time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event=start
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event=pre-check
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="comparing seqnum" path=mrseq
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="seqnum saved" path=mrseq
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="reading configuration"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="read configuration"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="validating json schema"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="json schema valid"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="parsing configuration json"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="parsed configuration json"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="validating configuration logically"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="validated configuration"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="creating output directory" path=/var/lib/waagent/custom-script/download/0
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="created output directory"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 files=1
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 file=0 event="download start"
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 file=0 event="download complete" output=/var/lib/waagent/custom-script/download/0
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="executing command" output=/var/lib/waagent/custom-script/download/0
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="executing protected commandToExecute" output=/var/lib/waagent/custom-script/download/0
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event="executed command" output=/var/lib/waagent/custom-script/download/0
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event=enabled
time=2018-04-26T17:47:23Z version=v2.0.6/git@1008306-clean operation=enable seq=0 event=end

Là, vous pouvez voir :

  • La commande enable qui démarre ce journal.
  • Les paramètres transmis à l’extension.
  • L’extension téléchargeant le fichier et le résultat de cette action.
  • La commande en cours d’exécution et le résultat

Vous pouvez aussi récupérer l’état d’exécution de l’extension de script personnalisé, y compris les arguments réels transmis comme commandToExecute, en utilisant Azure CLI :

az vm extension list -g myResourceGroup --vm-name myVM

La sortie ressemble au texte suivant :

[
  {
    "autoUpgradeMinorVersion": true,
    "forceUpdateTag": null,
    "id": "/subscriptions/subscriptionid/resourceGroups/rgname/providers/Microsoft.Compute/virtualMachines/vmname/extensions/customscript",
    "resourceGroup": "rgname",
    "settings": {
      "commandToExecute": "sh script.sh > ",
      "fileUris": [
        "https://catalogartifact.azureedge.net/publicartifacts/scripts/script.sh",
        "https://catalogartifact.azureedge.net/publicartifacts/scripts/script.sh"
      ]
    },
    "tags": null,
    "type": "Microsoft.Compute/virtualMachines/extensions",
    "typeHandlerVersion": "2.0",
    "virtualMachineExtensionType": "CustomScript"
  },
  {
    "autoUpgradeMinorVersion": true,
    "forceUpdateTag": null,
    "id": "/subscriptions/subscriptionid/resourceGroups/rgname/providers/Microsoft.Compute/virtualMachines/vmname/extensions/OmsAgentForLinux",
    "instanceView": null,
    "location": "eastus",
    "name": "OmsAgentForLinux",
    "protectedSettings": null,
    "provisioningState": "Succeeded",
    "publisher": "Microsoft.EnterpriseCloud.Monitoring",
    "resourceGroup": "rgname",
    "settings": {
      "workspaceId": "workspaceid"
    },
    "tags": null,
    "type": "Microsoft.Compute/virtualMachines/extensions",
    "typeHandlerVersion": "1.0",
    "virtualMachineExtensionType": "OmsAgentForLinux"
  }
]

Problèmes de syntaxe d’Azure CLI

Azure CLI peut s’exécuter dans plusieurs environnements d’interpréteur de commandes, mais avec de légères variantes de format. Si vous avez des résultats inattendus avec des commandes Azure CLI, consultez Comment utiliser Azure CLI avec succès.

Étapes suivantes

Pour afficher le code, les problèmes actuels et les versions, consultez custom-script-extension-linux.