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. Verwenden Sie diese Erweiterung für die 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 mit der Azure CLI, mit Azure PowerShell oder der Azure Virtual Machines-REST-API ausführen.

In diesem Artikel wird beschrieben, 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.

Es gibt zwei Versionen der benutzerdefinierten Skripterweiterung:

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

Verwenden Sie Version 2 für neue und vorhandene Bereitstellungen. 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

Unterstützte Linux-Distributionen

Distribution x64 ARM64
Alma Linux 9.x und höher 9.x und höher
Debian 10+ 11.x+
Flatcar Linux 3374.2.x+ 3374.2.x+
Azure Linux 2.x 2.x
openSUSE 12.3+ Nicht unterstützt
Oracle Linux 6.4+, 7.x+, 8.x+ Nicht unterstützt
Red Hat Enterprise Linux 6.7+, 7.x+, 8.x+, 9.x+ 8.6+, 9.x+
Rocky Linux 9.x und höher 9.x und höher
SLES 12.x+, 15.x+ 15.x SP4+
Ubuntu 18.04+, 20.04+, 22.04+ 20.04+, 22.04+

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

Um ein Skript extern herunterzuladen, 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 andere Firewall- oder NSG-Ports öffnen.

Tipps

  • Der Grund für die höchste Fehlerrate für diese Erweiterung sind Syntaxfehler im Skript. Vergewissern Sie sich, dass das Skript fehlerfrei ausgeführt wird. Fügen Sie 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. Danach gilt die Bereitstellung der Erweiterung als nicht erfolgreich.
  • Fügen Sie keine Neustartvorgänge in das Skript ein. Der Neustart verursacht Probleme mit anderen Erweiterungen, die installiert werden, und die Erweiterung wird nach dem Neustart nicht fortgesetzt.
  • Wenn Sie ein Skript verwenden, 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 Azure Linux-Agent beendet oder aktualisiert wird. Das kann dazu führen, dass die Erweiterung in einem Übergangszustand verbleibt und ein Timeout verursacht.
  • Ein Skript wird von der Erweiterung nur ein Mal 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, aktualisieren Sie die vorhandene Erweiterung mit einer neuen Konfiguration. 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, erstellen Sie eine eigene Lösung.
  • Die benutzerdefinierte Skripterweiterung verfügt über keine native Unterstützung von Proxyservern. Sie können aber ein Dateiübertragungstool wie Curl verwenden, das Proxyserver in Ihrem Skript unterstützt.
  • Achten Sie auf nicht standardmäßige Verzeichnispfade, von denen Ihre Skripts oder Befehle ggf. 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 der Ziel-VM 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. Gültige Werte sind clientId (optional, Zeichenfolge), die Client-ID der verwalteten Identität, und objectId (optional, Zeichenfolge), bei der es sich um die Objekt-ID der verwalteten Identität handelt.

Öffentliche Einstellungen werden in Klartext an die VM gesendet, auf der das Skript ausgeführt wird. Geschützte Einstellungen werden mit einem Schlüssel verschlüsselt, der nur Azure und der VM 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 zur Laufzeit zu entschlüsseln (falls erforderlich).

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

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

Eigenschaft: skipDos2Unix

Mit der früheren Version der benutzerdefinierten Skripterweiterung (Microsoft.OSTCExtensions.CustomScriptForLinux) wurden DOS-Dateien durch Übersetzen 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 angenommen wird, dass es sich um eine Skriptausführung mit /bin/sh handelt. Die Skripteinstellung wird als script.sh auf der VM gespeichert.
  • Die Datei beginnt mit #!.

Der Standardwert lautet false, d. h., die dos2unix-Konvertierung wird ausgeführt. 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 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 "Creating directories ..."
mkdir /data
chown user:user /data
mkdir /appdata
chown user:user /appdata

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 Werts des Skripts 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 werden. Durch diesen Ansatz kann die benutzerdefinierte Skripterweiterung auf private Azure Storage-Blobs oder -Container zugreifen, ohne dass der Benutzer Geheimnisse wie SAS-Token (Shared Access Signature) oder Speicherkontoschlüssel übergeben muss.

Um dieses Feature verwenden zu können, fügen Sie der VM oder VM-Skalierungsgruppe, auf der die benutzerdefinierte Skripterweiterung ausgeführt werden soll, eine systemseitig zugewiesene oder benutzerseitig zugewiesene Identität hinzu. Gewähren Sie der verwalteten Identität dann Zugriff auf den Azure Storage-Container oder -Blob.

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

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

{
  "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 mindestens eine Konfigurationsdatei. Die Konfigurationsdatei muss mindestens commandToExecute enthalten. Der az vm extension set-Befehl bezieht sich auf die Konfigurationsdatei:

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. Durch diesen Ansatz 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

In diesem Beispiel wird die folgende Skriptdatei namens script-config.json verwendet:

{
  "fileUris": ["https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"],
  "commandToExecute": "./config-music.sh"
}
  1. Erstellen Sie die Skriptdatei mithilfe eines Text-Editors Ihrer Wahl oder mit dem folgenden CLI-Befehl:

    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. Führen Sie den folgenden Befehl aus:

    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

In diesem Beispiel wird der folgende JSON-formatierte Inhalt verwendet:

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

Führen Sie den folgenden Befehl aus:

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

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

Verwenden Sie eine öffentliche Konfigurationsdatei zum Angeben des URI der Skriptdatei:

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

Verwenden Sie eine geschützte Konfigurationsdatei zum Angeben des auszuführenden Befehls:

{
  "commandToExecute": "./config-music.sh"
}
  1. Erstellen Sie die öffentliche Konfigurationsdatei mithilfe eines Text-Editors Ihrer Wahl oder mit dem folgenden CLI-Befehl:

    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. Erstellen Sie die geschützte Konfigurationsdatei mithilfe eines Text-Editors Ihrer Wahl oder mit dem folgenden CLI-Befehl:

    cat <<EOF > protected-config.json
    {
      "commandToExecute": "./config-music.sh"
    }
    EOF
    
  3. Führen Sie den folgenden Befehl aus:

    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

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. Die erste Bereitstellung funktioniert zwar, 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 CLI 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).

sudo ls -l /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:

sudo cat /var/log/waagent.log

Suchen Sie nach der Ausführung der Erweiterung. Dies sieht in etwa wie folgt 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:

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

Suchen Sie nach der einzelnen Ausführung. Dies sieht in etwa wie folgt 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 Erweiterung, die die Datei herunterlädt, und das Ergebnis dieser Aktion.
  • 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 unter custom-script-extension-linux.