Verwenden von Version 2 der Azure-Erweiterung für benutzerdefinierte Skripts mit virtuellen Linux-Computern

Version 2 der benutzerdefinierten Skripterweiterung lädt Skripts auf virtuelle Azure-Computer (VMs) herunter und führt sie dort aus. Diese Erweiterung ist hilfreich bei der Konfiguration nach der Bereitstellung, bei der Softwareinstallation oder bei anderen Konfigurations- oder Verwaltungsaufgaben. Sie können Skripts von Azure Storage oder einem anderen zugänglichen Speicherort im Internet herunterladen oder sie für die Erweiterungsruntime bereitstellen.

Die Erweiterung für benutzerdefinierte Skripts ist mit Azure Resource Manager-Vorlagen integriert. Sie können sie auch mithilfe der Azure CLI, der Azure Virtual Machines-REST-API oder mithilfe von PowerShell ausführen.

In diesem Artikel wird erläutert, wie Sie die benutzerdefinierte Skripterweiterung über die Azure CLI verwenden und die Erweiterung mithilfe einer Azure Resource Manager-Vorlage ausführen. Außerdem enthält dieser Artikel Schritte zur Problembehandlung für Linux-Systeme.

Die Erweiterung für benutzerdefinierte Linux-Skripts ist in zwei Versionen verfügbar:

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

Stellen Sie neue und bereits vorhandene Bereitstellungen auf die neue Version 2 um. Die neue Version ist ein direkter Ersatz. Die Migration ist genauso einfach wie das Ändern des Namens und der Version. Sie müssen Ihre Erweiterungskonfiguration nicht ändern.

Voraussetzungen

Betriebssystem

Die benutzerdefinierte Skripterweiterung für L wird unter unterstützten Betriebssystemen ausgeführt. Weitere Informationen finden Sie unter Von Azure unterstützte Linux-Distributionen.

Speicherort des Skripts

Sie können die Erweiterung so konfigurieren, dass mit Ihren Azure Blob Storage-Anmeldeinformationen auf Azure Blob Storage zugegriffen wird. Das Skript kann an einem beliebigen Ort gespeichert werden, solange der virtuelle Computer eine Route zu diesem Endpunkt (z. B. GitHub oder interner Dateiserver) einrichten kann.

Internetkonnektivität

Wenn Sie ein Skript extern herunterladen möchten, etwa von GitHub oder Azure Storage, müssen zusätzliche Firewall- oder Netzwerksicherheitsgruppen-Ports (NSG) geöffnet werden. Wenn sich Ihr Skript beispielsweise in Azure Storage befindet, können Sie Zugriff über Azure-NSG-Diensttags für Storage gewähren.

Wenn sich Ihr Skript auf einem lokalen Server befindet, müssen Sie möglicherweise weitere Firewall- oder NSG-Ports öffnen.

Tipps und Tricks

  • Der Grund für die höchste Fehlerrate für diese Erweiterung sind Syntaxfehler im Skript. Testen Sie, ob das Skript fehlerfrei ausgeführt wird. Fügen Sie eine zusätzliche Protokollierung in das Skript ein, um das Auffinden von Fehlern zu vereinfachen.
  • Schreiben Sie idempotente Skripts, sodass eine versehentliche mehrfache Ausführung keine Systemänderungen verursacht.
  • Stellen Sie sicher, dass während der Skriptausführung keine Benutzereingaben erforderlich sind.
  • Die Ausführung des Skripts kann 90 Minuten dauern. Alles, was länger dauert, führt zu einer fehlerhaften Bereitstellung der Erweiterung.
  • Fügen Sie keine Neustartvorgänge in das Skript ein. Diese Aktion verursacht Probleme mit anderen Erweiterungen, die installiert werden, und die Erweiterung wird nach dem Neustart nicht fortgesetzt.
  • Wenn Sie ein Skript haben, das zu einem Neustart führt, bevor Anwendungen installiert und Skripts ausgeführt werden, planen Sie den Neustart mit einem Cron-Auftrag oder mit Tools wie DSC, Chef oder Puppet-Erweiterungen.
  • Führen Sie kein Skript aus, das bewirkt, dass der VM-Agent angehalten oder aktualisiert wird. Das kann dazu führen, dass die Erweiterung in einem Übergangszustand verbleibt und ein Timeout verursacht wird.
  • Ein Skript wird von der Erweiterung nur einmal ausgeführt. Soll ein Skript bei jedem Startup ausgeführt werden, können Sie cloud-init image und ein Modul vom Typ Scripts Per Boot (Skripts pro Start) verwenden. Alternativ können Sie mithilfe des Skripts eine systemd-Diensteinheit erstellen.
  • Es kann nur eine Version einer Erweiterung auf den virtuellen Computer angewendet werden. Um ein zweites benutzerdefiniertes Skript auszuführen, können Sie die vorhandene Erweiterung mit einer neuen Konfiguration aktualisieren. Alternativ können Sie die benutzerdefinierte Skripterweiterung entfernen und sie mit dem aktualisierten Skript erneut anwenden.
  • Wenn Sie den Ausführungszeitpunkt eines Skripts planen möchten, erstellen Sie mithilfe der Erweiterung einen Cron-Auftrag.
  • Während der Skriptausführung wird im Azure-Portal oder in der CLI nur der Status „Im Übergang“ für die Erweiterung angezeigt. Sollten Sie häufigere Statusaktualisierungen für ein ausgeführtes Skript benötigen, müssen Sie eine eigene Lösung erstellen.
  • Die benutzerdefinierte Skripterweiterung verfügt über keine native Unterstützung von Proxyservern. Sie können aber ein Dateiübertragungstool verwenden, das Proxyserver in Ihrem Skript unterstützt, z. B. Curl.
  • Achten Sie auf nicht standardmäßige Verzeichnispfade, von denen Ihre Skripts oder Befehle gegebenenfalls abhängen. Verwenden Sie eine entsprechende Logik für diese Situation.

Erweiterungsschema

In der Konfiguration der benutzerdefinierten Skripterweiterung werden Aspekte wie der Skriptspeicherort und der auszuführende Befehl angegeben. Sie können diese Informationen in Konfigurationsdateien speichern oder sie in der Befehlszeile oder in einer Azure Resource Manager-Vorlage angeben.

Sie können sensible Daten in einer geschützten Konfiguration speichern. Diese ist verschlüsselt und wird nur auf dem virtuellen Computer entschlüsselt. Die geschützte Konfiguration ist hilfreich, wenn der Ausführungsbefehl vertrauliche Informationen (beispielsweise ein Kennwort) enthält. Hier sehen Sie ein Beispiel:

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

Hinweis

Die Eigenschaft managedIdentitydarf nicht in Verbindung mit der Eigenschaft storageAccountName oder storageAccountKey verwendet werden.

Eigenschaftswerte

Name Wert oder Beispiel Datentyp
apiVersion 2019-03-01 date
publisher Microsoft.Azure.Extensions Zeichenfolge
type CustomScript Zeichenfolge
typeHandlerVersion 2.1 INT
fileUris https://github.com/MyProject/Archive/MyPythonScript.py array
commandToExecute python MyPythonScript.py \<my-param1> Zeichenfolge
script IyEvYmluL3NoCmVjaG8gIlVwZGF0aW5nIHBhY2thZ2VzIC4uLiIKYXB0IHVwZGF0ZQphcHQgdXBncmFkZSAteQo= Zeichenfolge
skipDos2Unix false Boolean
timestamp 123456789 32-bit integer
storageAccountName examplestorageacct Zeichenfolge
storageAccountKey TmJK/1N3AbAZ3q/+hOXoi/l73zOqsaxXDhqa9Y83/v5UpXQp2DQIBuv2Tifp60cE/OaHsJZmQZ7teQfczQj8hg== Zeichenfolge
managedIdentity { } oder { "clientId": "31b403aa-c364-4240-a7ff-d85fb6cd7232" } oder { "objectId": "12dd289c-0583-46e5-b9b4-115d5c19ef4b" } JSON-Objekt

Details zu Eigenschaftswerten

Eigenschaft Optional oder erforderlich Details
apiVersion Nicht verfügbar Die aktuelle API-Version kann über den Ressourcen-Explorer oder die Azure CLI dem Befehl az provider list -o json ermittelt werden.
fileUris Optional URLs für Dateien, die heruntergeladen werden sollen.
commandToExecute Erforderlich, wenn script nicht festgelegt wurde Das auszuführende Einstiegspunktskript. Verwenden Sie diese Eigenschaft anstelle von script, falls Ihr Befehl Geheimnisse (beispielsweise Kennwörter) enthält.
script Erforderlich, wenn commandToExecute nicht festgelegt wurde Ein Base64-codiertes (und optional mit gzip komprimiertes) Skript, das von /bin/sh ausgeführt wird.
skipDos2Unix Optional Legen Sie diesen Wert auf false fest, wenn Sie die dos2unix-Konvertierung skriptbasierter Datei-URLs oder -Skripts überspringen möchten.
timestamp Optional Ändern Sie diesen Wert nur, um eine erneute Skriptausausführung auszulösen. Jeder ganzzahlige Wert ist akzeptabel, solange er sich vom vorherigen Wert unterscheidet.
storageAccountName Optional Der Name des Speicherkontos. Wenn Sie Speicheranmeldeinformationen angeben, muss es sich bei allen fileUris-Werten um URLs für Azure-Blobs handeln.
storageAccountKey Optional Der Zugriffsschlüssel des Speicherkontos
managedIdentity Optional Die verwaltete Identität zum Herunterladen von Dateien:

clientId (optional, Zeichenfolge): die Client-ID der verwalteten Identität

objectId (optional, Zeichenfolge): die Objekt-ID der verwalteten Identität

Sie können die folgenden Werte entweder in öffentlichen oder geschützten Einstellungen festlegen. Die Erweiterung lehnt jede Konfiguration ab, bei der diese Werte sowohl in öffentlichen als auch in geschützten Einstellungen festgelegt sind.

  • commandToExecute
  • script
  • fileUris

Die Verwendung öffentlicher Einstellungen kann zwar beim Debuggen hilfreich sein, es wird jedoch empfohlen, geschützte Einstellungen zu verwenden.

Öffentliche Einstellungen werden in Klartext an den virtuellen Computer gesendet, auf dem das Skript ausgeführt wird. Geschützte Einstellungen werden mit einem Schlüssel verschlüsselt, der nur Azure und dem virtuellen Computer bekannt ist. Die Einstellungen werden auf dem virtuellen Computer so gespeichert, wie gesendet wurden. Das heißt, wenn die Einstellungen verschlüsselt wurden, werden sie verschlüsselt auf dem virtuellen Computer gespeichert. Das Zertifikat, das zum Entschlüsseln der verschlüsselten Werte verwendet wird, ist auf dem virtuellen Computer gespeichert. Das Zertifikat wird auch verwendet, um Einstellungen (falls erforderlich) zur Laufzeit zu entschlüsseln.

Eigenschaft: skipDos2Unix

Der Standardwert lautet false, d. h., die dos2unix-Konvertierung wird ausgeführt.

Mit der früheren Version der benutzerdefinierten Skripterweiterung Microsoft.OSTCExtensions.CustomScriptForLinux wurden DOS-Dateien durch Umwandlung von \r\n in \n automatisch in UNIX-Dateien konvertiert. Diese Umwandlung ist noch vorhanden und standardmäßig aktiviert. Die Konvertierung wird basierend auf den folgenden Kriterien auf alle über fileUris heruntergeladenen Dateien oder die Skripteinstellung angewandt:

  • Die Erweiterung ist SH, TXT, PY oder PL. Die Skripteinstellung entspricht immer diesem Kriterium, da davon ausgegangen wird, dass es sich um ein Skript handelt, das mit /bin/sh ausgeführt wird. Die Skripteinstellung wird als script.sh auf dem virtuellen Computer gespeichert.
  • Die Datei beginnt mit #!.

Sie können die dos2unix-Konvertierung überspringen, indem Sie skipDos2Unix auf true festlegen:

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

Eigenschaft: script

Die benutzerdefinierte Skripterweiterung unterstützt die Ausführung eines benutzerdefinierten Skripts. In den Skripteinstellungen werden commandToExecute und fileUris in einer einzelnen Einstellung kombiniert. Anstatt eine Datei für den Download von Azure Storage oder einem GitHub-Gist einrichten zu müssen, können Sie das Skript einfach als eine Einstellung verschlüsseln. Sie können das Skript verwenden, um commandToExecute und fileUris zu ersetzen.

Hier sind einige Anforderungen:

  • Das Skript muss Base64-codiert sein.
  • Das Skript kann optional mit Gzip komprimiert werden.
  • Sie können die Skripteinstellung in öffentlichen oder geschützten Einstellungen verwenden.
  • Die Daten des Skriptparameters können eine Größe von maximal 256 KB aufweisen. Wenn das Skript diese Größe überschreitet, wird es nicht ausgeführt.

Beispielsweise wurde das folgende Skript in der Datei /script.sh/ gespeichert:

#!/bin/sh
echo "Updating packages ..."
apt update
apt upgrade -y

Erstellen Sie die richtige Skripteinstellung für die benutzerdefinierte Skripterweiterung, indem Sie die Ausgabe des folgenden Befehls verwenden:

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

In den meisten Fällen kann das Skript optional mit gzip komprimiert werden, um die Größe weiter zu verringern. Die benutzerdefinierte Skripterweiterung erkennt automatisch die Verwendung der gzip-Komprimierung.

cat script | gzip -9 | base64 -w 0

Die benutzerdefinierte Skripterweiterung verwendet den folgenden Algorithmus, um ein Skript auszuführen:

  1. Stellen Sie sicher, dass die Länge des Skriptwerts 256 KB nicht überschreitet.
  2. Führen Sie eine Base64-Decodierung des Skriptwerts durch.
  3. Versuchen Sie, den Base64-decodierten Wert mit dem Befehl „gunzip“ zu entpacken.
  4. Schreiben Sie den decodierten (und optional dekomprimierten) Wert auf den Datenträger (/var/lib/waagent/custom-script/#/script.sh).
  5. Führen Sie das Skript mit _/bin/sh -c /var/lib/waagent/custom-script/#/script.sh aus.

Eigenschaft: managedIdentity

Hinweis

Diese Eigenschaft muss nur in geschützten Einstellungen angegeben werden.

Die benutzerdefinierte Skripterweiterung (Version 2.1 und höher) unterstützt verwaltete Identitäten zum Herunterladen von Dateien von URLs, die in der Einstellung fileUris angegeben sind. So kann die benutzerdefinierte Skripterweiterung auf private Azure Storage-Blobs oder -Container zugreifen, ohne dass der Benutzer Geheimnisse wie Shared Access Signature-Token (SAS) oder Speicherkontoschlüssel übergeben muss.

Um dieses Feature verwenden zu können, muss der Benutzer der VM oder VM-Skalierungsgruppe, auf der die benutzerdefinierte Skripterweiterung ausgeführt werden soll, eine vom System zugewiesene oder vom Benutzer zugewiesene Identität hinzufügen. Der Benutzer muss anschließend der verwalteten Identität Zugriff auf den Azure Storage-Container oder -Blob gewähren.

Um die vom System zugewiesene Identität für die Ziel-VM oder die VM-Skalierungsgruppe zu verwenden, legen Sie managedidentity auf ein leeres JSON-Objekt fest.

Beispiel:

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

Um die vom Benutzer zugewiesene Identität für die Ziel-VM oder die VM-Skalierungsgruppe zu verwenden, konfigurieren Sie managedidentity mit der Client-ID oder der Objekt-ID der verwalteten Identität.

Beispiele:

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

Hinweis

Die Eigenschaft managedIdentitydarf nicht in Verbindung mit der Eigenschaft storageAccountName oder storageAccountKey verwendet werden.

Bereitstellung von Vorlagen

Sie können Azure-VM-Erweiterungen mithilfe von Azure Resource Manager-Vorlagen bereitstellen. Das im vorherigen Abschnitt erläuterte JSON-Schema kann in einer Azure Resource Manager-Vorlage zum Ausführen der benutzerdefinierten Skripterweiterung während der Bereitstellung der Vorlage verwendet werden. Eine Beispielvorlage, die die benutzerdefinierte Skripterweiterung enthält, finden Sie hier auf 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"
      ]  
    }
  }
}

Hinweis

Bei Eigenschaftennamen wird zwischen Groß- und Kleinschreibung unterschieden. Um Bereitstellungsprobleme zu vermeiden, verwenden Sie die Namen wie hier gezeigt.

Azure CLI

Wenn Sie die Azure CLI zum Ausführen der benutzerdefinierten Skripterweiterung verwenden, erstellen Sie eine Konfigurationsdatei oder mehrere Konfigurationsdateien. Sie müssen mindestens über commandToExecute verfügen.

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

Optional können Sie die Einstellungen im Befehl als JSON-formatierte Zeichenfolge angeben. Dadurch kann die Konfiguration während der Ausführung und ohne separate Konfigurationsdatei angegeben werden.

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"}'

Beispiel: Öffentliche Konfiguration mit Skriptdatei

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

Befehl für die Azure-Befehlszeilenschnittstelle:

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

Beispiel: Öffentliche Konfiguration ohne Skriptdatei

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

Befehl für die Azure-Befehlszeilenschnittstelle:

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

Beispiel: Dateien für die öffentliche und geschützte Konfiguration

Dateien für die öffentliche Konfiguration werden zum Angeben des Skriptdatei-URI verwendet. Dateien für die geschützte Konfiguration werden zum Angeben des auszuführenden Befehls verwendet.

Datei für die öffentliche Konfiguration:

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

Datei für die geschützte Konfiguration:

{
  "commandToExecute": "./config-music.sh <param1>"
}

Befehl für die Azure-Befehlszeilenschnittstelle:

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

VM-Skalierungsgruppen

Wenn Sie die benutzerdefinierte Skripterweiterung über das Azure-Portal bereitstellen, haben Sie keine Kontrolle über den Ablauf des SAS-Tokens für den Zugriff auf das Skript in Ihrem Speicherkonto. Aus diesem Grund funktioniert zwar die erste Bereitstellung, aber wenn das SAS-Token des Speicherkontos abläuft, führen nachfolgende Skalierungsvorgänge zu Fehlern, da die benutzerdefinierte Skripterweiterung nicht mehr auf das Speicherkonto zugreifen kann.

Es wird empfohlen, PowerShell, die Azure-Befehlszeilenschnittstelle oder eine Azure Resource Manager-Vorlage zu verwenden, wenn Sie die benutzerdefinierte Skripterweiterung in einer VM-Skalierungsgruppe bereitstellen. Auf diese Weise können Sie eine verwaltete Identität verwenden oder den Ablauf des SAS-Tokens für den Zugriff auf das Skript in Ihrem Speicherkonto direkt steuern.

Problembehandlung

Beim Ausführen der Erweiterung für benutzerdefinierte Skripts wird das Skript erstellt oder wie im folgenden Beispiel in ein Verzeichnis heruntergeladen. Die Ausgabe des Befehls wird ebenfalls in diesem Verzeichnis gespeichert (in den Dateien stdout und stderr).

/var/lib/waagent/custom-script/download/0/

Überprüfen Sie zur Problembehandlung zunächst das Protokoll des Linux-Agents, und vergewissern Sie sich, dass die Erweiterung ausgeführt wurde:

/var/log/waagent.log 

Suchen Sie nach der Ausführung der Erweiterung. Er sieht ungefähr so aus:

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

Für die obige Ausgabe gilt Folgendes:

  • Enable gibt den Beginn der Befehlsausführung an.
  • Download bezieht sich auf das Herunterladen des Pakets der benutzerdefinierten Skripterweiterung von Azure (nicht auf die in fileUris angegebenen Skriptdateien).

Das von der Azure-Skripterweiterung erzeugte Protokoll finden Sie hier:

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

Suchen Sie nach der einzelnen Ausführung. Er sieht ungefähr so aus:

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

Darin sind folgende Informationen enthalten:

  • Der Befehl enable, der dieses Protokoll startet
  • Die an die Erweiterung übergebenen Einstellungen
  • Die Downloaddatei der Erweiterung und das entsprechende Ergebnis
  • Der ausgeführte Befehl und das Ergebnis.

Sie können den Ausführungsstatus der benutzerdefinierten Skripterweiterung einschließlich der als commandToExecute übergebenen Argumente auch über die Azure CLI abrufen:

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

Die Ausgabe sieht in etwa wie folgt aus:

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

Azure CLI-Syntaxprobleme

Die Azure CLI kann mit geringfügigen Formatvariationen in verschiedenen Shellumgebungen ausgeführt werden. Wenn Sie unerwartete Ergebnisse mit Azure CLI-Befehlen haben, lesen Sie, wie Sie die Azure CLI erfolgreich verwenden.

Nächste Schritte

Den Code sowie aktuelle Probleme und Versionen finden Sie im Repository der CustomScript-Erweiterung für Linux auf GitHub.