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 managedIdentity
darf 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:
- Stellen Sie sicher, dass die Länge des Werts des Skripts 256 KB nicht überschreitet.
- Führen Sie eine Base64-Decodierung des Skriptwerts durch.
- Versuchen Sie, den Base64-decodierten Wert mit dem Befehl „gunzip“ zu entpacken.
- Schreiben Sie den decodierten (und optional dekomprimierten) Wert auf den Datenträger: /var/lib/waagent/custom-script/#/script.sh.
- 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 managedIdentity
darf 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"
}
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
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"
}
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
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
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 infileUris
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.