Używanie rozszerzenia niestandardowego skryptu platformy Azure w wersji 2 z maszynami wirtualnymi z systemem Linux

Uwaga

W tym artykule odwołuje się do systemu CentOS — dystrybucji systemu Linux, która zbliża się do stanu zakończenia życia (EOL). Rozważ odpowiednie użycie i zaplanuj. Aby uzyskać więcej informacji, zobacz wskazówki dotyczące zakończenia życia systemu CentOS.

Rozszerzenie niestandardowego skryptu w wersji 2 pobiera i uruchamia skrypty na maszynach wirtualnych platformy Azure. To rozszerzenie służy do konfigurowania po wdrożeniu, instalacji oprogramowania lub innego zadania konfiguracji lub zarządzania. Skrypty można pobrać z usługi Azure Storage lub innej dostępnej lokalizacji internetowej albo udostępnić je środowisku uruchomieniowemu rozszerzenia.

Rozszerzenie niestandardowego skryptu integruje się z szablonami usługi Azure Resource Manager. Można go również uruchomić przy użyciu interfejsu wiersza polecenia platformy Azure, programu Azure PowerShell lub interfejsu API REST usługi Azure Virtual Machines.

W tym artykule opisano sposób używania rozszerzenia niestandardowego skryptu z poziomu interfejsu wiersza polecenia platformy Azure oraz sposobu uruchamiania rozszerzenia przy użyciu szablonu usługi Azure Resource Manager. Ten artykuł zawiera również kroki rozwiązywania problemów z systemami Linux.

Istnieją dwie wersje rozszerzenia niestandardowego skryptu:

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

Użyj wersji 2 dla nowych i istniejących wdrożeń. Nowa wersja jest zastępowaniem. Migracja jest tak łatwa, jak zmiana nazwy i wersji. Nie musisz zmieniać konfiguracji rozszerzenia.

Wymagania wstępne

Obsługiwane dystrybucje systemu Linux

Dystrybucja x64 ARM64
Alma Linux 9.x+ 9.x+
CentOS 7.x+, 8.x+ 7.x+
Debian Ponad 10 11.x+
Flatcar Linux 3374.2.x+ 3374.2.x+
Azure Linux 2.x 2.x
openSUSE 12.3+ Nieobsługiwany
Oracle Linux 6.4+, 7.x+, 8.x+ Nieobsługiwany
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+

Lokalizacja skryptu

Możesz ustawić rozszerzenie tak, aby używało poświadczeń usługi Azure Blob Storage w celu uzyskania dostępu do usługi Azure Blob Storage. Lokalizacja skryptu może znajdować się w dowolnym miejscu, jeśli maszyna wirtualna może kierować do tego punktu końcowego, na przykład do usługi GitHub lub wewnętrznego serwera plików.

Łączność z Internetem

Aby pobrać skrypt zewnętrznie, na przykład z usługi GitHub lub Usługi Azure Storage, musisz otworzyć inne porty zapory lub sieciowej grupy zabezpieczeń. Jeśli na przykład skrypt znajduje się w usłudze Azure Storage, możesz zezwolić na dostęp przy użyciu tagów usługi Azure NSG dla usługi Storage.

Jeśli skrypt znajduje się na serwerze lokalnym, może być konieczne otwarcie innych zapór lub portów sieciowej grupy zabezpieczeń.

Wskazówki

  • Najwyższy odsetek awarii dotyczących tego rozszerzenia jest spowodowany błędami składni w skrypcie. Sprawdź, czy skrypt działa bez błędów. Umieść więcej logowania do skryptu, aby ułatwić znajdowanie błędów.
  • Pisz skrypty idempotentne, aby w razie ich ponownego uruchomienia przez przypadek więcej niż jeden raz nie nastąpiły zmiany systemu.
  • Upewnij się, że skrypty nie wymagają udziału użytkownika w trakcie działania.
  • Dozwolone jest działanie skryptu przez 90 minut. Każdy dłuższy czas spowoduje niepowodzenie aprowizacji rozszerzenia.
  • Nie umieszczaj w skrypcie operacji ponownego uruchamiania. Ponowne uruchamianie powoduje problemy z innymi zainstalowanymi rozszerzeniami, a rozszerzenie nie będzie kontynuowane po ponownym uruchomieniu.
  • Jeśli masz skrypt, który powoduje ponowne uruchomienie przed zainstalowaniem aplikacji i uruchomieniem skryptów, zaplanuj ponowne uruchomienie przy użyciu zadania cron lub przy użyciu narzędzi, takich jak rozszerzenia DSC, Chef lub Puppet.
  • Nie uruchamiaj skryptu, który powoduje zatrzymanie lub aktualizację agenta systemu Linux platformy Azure. Może to pozostawić rozszerzenie w stanie przejściowym i prowadzić do przekroczenia limitu czasu.
  • Rozszerzenie uruchomi skrypt tylko raz. Jeśli chcesz uruchomić skrypt przy każdym uruchomieniu, możesz użyć obrazu cloud-init i użyć modułu Scripts Per Boot (Skrypty na rozruch). Alternatywnie możesz użyć skryptu do utworzenia systemowej jednostki usługi.
  • Do maszyny wirtualnej można zastosować tylko jedną wersję rozszerzenia. Aby uruchomić drugi skrypt niestandardowy, zaktualizuj istniejące rozszerzenie przy użyciu nowej konfiguracji. Alternatywnie możesz usunąć rozszerzenie niestandardowego skryptu i ponownie zastosować go za pomocą zaktualizowanego skryptu.
  • Jeśli chcesz zaplanować, kiedy skrypt jest uruchamiany, użyj rozszerzenia, aby utworzyć zadanie cron.
  • W trakcie działania skryptu będziesz widzieć tylko stan przechodzenie z witryny Azure Portal lub interfejsu wiersza polecenia. Jeśli potrzebujesz częstszych aktualizacji stanu działającego skryptu, musisz utworzyć własne rozwiązanie.
  • Niestandardowe rozszerzenie skryptu nie obsługuje natywnie serwerów proxy. Jednak możesz w swoim skrypcie użyć narzędzia do transferu plików, np. Curl, które obsługuje serwery proxy w ramach tego skryptu, takiego jak Curl.
  • Pamiętaj, że skrypty lub polecenia mogą polegać na lokalizacjach katalogów innych niż domyślne. Przygotuj logikę obsługującą taką sytuację.

Schemat rozszerzenia

Konfiguracja rozszerzenia niestandardowego skryptu określa elementy, takie jak lokalizacja skryptu i polecenie do uruchomienia. Te informacje można przechowywać w plikach konfiguracji, określać je w wierszu polecenia lub określać je w szablonie usługi Azure Resource Manager.

Poufne dane można przechowywać w chronionej konfiguracji, która jest szyfrowana i odszyfrowywane tylko na docelowej maszynie wirtualnej. Chroniona konfiguracja jest przydatna, gdy polecenie wykonywania zawiera wpisy tajne, takie jak hasło. Oto przykład:

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

Uwaga

Właściwość managedIdentitynie może być używana w połączeniu z właściwością storageAccountName or storageAccountKey .

Wartości właściwości

Nazwisko Wartość lub przykład Typ danych
apiVersion 2019-03-01 data
Wydawca Microsoft.Azure.Extensions string
type CustomScript string
typeHandlerVersion 2.1 int
fileUris https://github.com/MyProject/Archive/MyPythonScript.py tablica
commandToExecute python MyPythonScript.py \<my-param1> string
skrypt IyEvYmluL3NoCmVjaG8gIlVwZGF0aW5nIHBhY2thZ2VzIC4uLiIKYXB0IHVwZGF0ZQphcHQgdXBncmFkZSAteQo= string
skipDos2Unix false boolean
timestamp 123456789 32-bitowa liczba całkowita
storageAccountName examplestorageacct string
storageAccountKey TmJK/1N3AbAZ3q/+hOXoi/l73zOqsaxXDhqa9Y83/v5UpXQp2DQIBuv2Tifp60cE/OaHsJZmQZ7teQfczQj8hg== string
managedIdentity { }lub lub { "clientId": "31b403aa-c364-4240-a7ff-d85fb6cd7232" }{ "objectId": "12dd289c-0583-46e5-b9b4-115d5c19ef4b" } Obiekt JSON

Szczegóły wartości właściwości

Właściwości Opcjonalne lub wymagane Szczegóły
apiVersion Nie dotyczy Najbardziej aktualną wersję interfejsu API można znaleźć przy użyciu Eksploratora zasobów lub polecenia w interfejsie wiersza polecenia az provider list -o json platformy Azure.
fileUris Opcjonalnie Adresy URL plików do pobrania.
commandToExecute Wymagane, jeśli script nie ustawiono Skrypt punktu wejścia do uruchomienia. Użyj tej właściwości zamiast script , jeśli polecenie zawiera wpisy tajne, takie jak hasła.
skrypt Wymagane, jeśli commandToExecute nie ustawiono Skrypt zakodowany w formacie Base64 i opcjonalnie gzip'ed uruchamiany przez /bin/shprogram .
skipDos2Unix Opcjonalnie Ustaw tę wartość na false , jeśli chcesz pominąć konwersję dos2unix adresów URL lub skryptów opartych na skryptach.
timestamp Opcjonalnie Zmień tę wartość tylko, aby wyzwolić ponowne uruchomienie skryptu. Dowolna wartość całkowita jest akceptowalna, o ile różni się od poprzedniej wartości.
storageAccountName Opcjonalnie Nazwa konta magazynu. Jeśli określisz poświadczenia magazynu, wszystkie fileUris wartości muszą być adresami URL dla obiektów blob platformy Azure.
storageAccountKey Opcjonalnie Klucz dostępu konta magazynu.
managedIdentity Opcjonalnie Tożsamość zarządzana do pobierania plików. Wartości to clientId (opcjonalnie, ciąg), czyli identyfikator klienta tożsamości zarządzanej i objectId (opcjonalnie ciąg), czyli identyfikator obiektu tożsamości zarządzanej.

Ustawienia publiczne są wysyłane w postaci zwykłego tekstu do maszyny wirtualnej, na której jest uruchamiany skrypt. Ustawienia chronione są szyfrowane za pośrednictwem klucza znanego tylko dla platformy Azure i maszyny wirtualnej. Ustawienia są zapisywane na maszynie wirtualnej podczas ich wysyłania. Oznacza to, że jeśli ustawienia zostały zaszyfrowane, są one zapisywane jako zaszyfrowane na maszynie wirtualnej. Certyfikat używany do odszyfrowywania zaszyfrowanych wartości jest przechowywany na maszynie wirtualnej. Certyfikat jest również używany do odszyfrowywania ustawień, w razie potrzeby, w czasie wykonywania.

Używanie ustawień publicznych może być przydatne do debugowania, ale zdecydowanie zalecamy używanie ustawień chronionych.

Następujące wartości można ustawić w ustawieniach publicznych lub chronionych. Rozszerzenie odrzuca dowolną konfigurację, w której te wartości są ustawiane zarówno w ustawieniach publicznych, jak i chronionych.

  • commandToExecute
  • script
  • fileUris

Właściwość: skipDos2Unix

Poprzednia wersja rozszerzenia Microsoft.OSTCExtensions.CustomScriptForLinuxniestandardowego skryptu automatycznie konwertuje pliki DOS na pliki system UNIX, tłumacząc \r\n na \n. To tłumaczenie nadal istnieje i jest domyślnie włączone. Ta konwersja jest stosowana do wszystkich plików pobranych z fileUris programu lub ustawienia skryptu na podstawie jednego z następujących kryteriów:

  • Rozszerzenie to .sh, .txt, .py lub .pl. Ustawienie skryptu zawsze pasuje do tego kryterium, ponieważ zakłada się, że jest to skrypt uruchamiany z /bin/sh. Ustawienie skryptu jest zapisywane jako script.sh na maszynie wirtualnej.
  • Plik rozpoczyna się od #!.

Wartość domyślna to false, co oznacza, że jest wykonywana konwersja dos2unix. Konwersję dos2unix można pominąć, ustawiając wartość skipDos2Unix :true

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

Właściwość: script

Rozszerzenie niestandardowego skryptu obsługuje wykonywanie skryptu zdefiniowanego przez użytkownika. Ustawienia skryptu łączą się commandToExecute i fileUris w jedno ustawienie. Zamiast konfigurować plik do pobrania z usługi Azure Storage lub repozytorium GitHub, możesz zakodować skrypt jako ustawienie. Możesz użyć skryptu, aby zastąpić commandToExecute element i fileUris.

Oto kilka wymagań:

  • Skrypt musi być zakodowany w formacie Base64.
  • Skrypt może być opcjonalnie gzip'ed.
  • Możesz użyć ustawienia skryptu w ustawieniach publicznych lub chronionych.
  • Maksymalny rozmiar danych parametru skryptu to 256 KB. Jeśli skrypt przekroczy ten rozmiar, nie zostanie uruchomiony.

Na przykład następujący skrypt jest zapisywany w pliku /script.sh/:

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

Aby utworzyć poprawne ustawienie niestandardowego rozszerzenia skryptu, należy wykonać dane wyjściowe następującego polecenia:

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

W większości przypadków skrypt może być opcjonalnie gzip'ed w celu dalszego zmniejszenia rozmiaru. Rozszerzenie niestandardowego skryptu automatycznie wykrywa użycie kompresji gzip.

cat script | gzip -9 | base64 -w 0

Rozszerzenie niestandardowego skryptu używa następującego algorytmu do uruchomienia skryptu:

  1. Twierdzenie, że długość wartości skryptu nie przekracza 256 KB.
  2. Base64 zdekoduj wartość skryptu.
  3. Spróbuj zastrzelić wartość zdekodowana base64.
  4. Zapisz zdekodowaną i opcjonalnie dekompresowaną wartość na dysku: /var/lib/waagent/custom-script/#/script.sh.
  5. Uruchom skrypt przy użyciu polecenia _/bin/sh -c /var/lib/waagent/custom-script/#/script.sh.

Właściwość: managedIdentity

Uwaga

Ta właściwość musi być określona tylko w ustawieniach chronionych.

Rozszerzenie niestandardowego skryptu w wersji 2.1 lub nowszej obsługuje tożsamości zarządzane do pobierania plików z adresów URL podanych w ustawieniu fileUris . Takie podejście umożliwia rozszerzenie niestandardowego skryptu uzyskiwanie dostępu do prywatnych obiektów blob lub kontenerów usługi Azure Storage bez konieczności przekazywania wpisów tajnych, takich jak tokeny sygnatury dostępu współdzielonego (SAS) lub klucze kont magazynu.

Aby użyć tej funkcji, dodaj tożsamość przypisaną przez system lub przypisaną przez użytkownika do maszyny wirtualnej lub zestawu skalowania maszyn wirtualnych, w którym ma zostać uruchomione rozszerzenie niestandardowego skryptu. Następnie przyznaj tożsamości zarządzanej dostęp do kontenera lub obiektu blob usługi Azure Storage.

Aby użyć tożsamości przypisanej przez system na docelowej maszynie wirtualnej lub zestawie skalowania maszyn wirtualnych, ustaw na managedidentity pusty obiekt JSON.

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

Aby użyć tożsamości przypisanej przez użytkownika na docelowej maszynie wirtualnej lub zestawie skalowania maszyn wirtualnych, skonfiguruj managedidentity identyfikator klienta lub identyfikator obiektu tożsamości zarządzanej.

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

Uwaga

Właściwość managedIdentitynie może być używana w połączeniu z właściwością storageAccountName or storageAccountKey .

Wdrażanie na podstawie szablonu

Rozszerzenia maszyn wirtualnych platformy Azure można wdrożyć przy użyciu szablonów usługi Azure Resource Manager. Schemat JSON opisany w poprzedniej sekcji może służyć w szablonie usługi Azure Resource Manager do uruchamiania rozszerzenia niestandardowego skryptu podczas wdrażania szablonu. Przykładowy szablon zawierający rozszerzenie niestandardowego skryptu można znaleźć w witrynie 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"
      ]
    }
  }
}

Uwaga

Te nazwy właściwości są uwzględniane w wielkości liter. Aby uniknąć problemów z wdrażaniem, użyj nazw, jak pokazano tutaj.

Interfejs wiersza polecenia platformy Azure

Gdy używasz interfejsu wiersza polecenia platformy Azure do uruchamiania rozszerzenia niestandardowego skryptu, utwórz plik konfiguracji lub pliki. Co najmniej plik konfiguracji musi zawierać commandToExecutewartość . Polecenie az vm extension set odwołuje się do pliku konfiguracji:

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

Alternatywnie możesz określić ustawienia w poleceniu jako ciąg w formacie JSON. Takie podejście umożliwia określenie konfiguracji podczas wykonywania i bez oddzielnego pliku konfiguracji.

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

Przykład: Publiczna konfiguracja z plikiem skryptu

W tym przykładzie użyto następującego pliku skryptu o nazwie 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. Utwórz plik skryptu przy użyciu wybranego edytora tekstów lub za pomocą następującego polecenia interfejsu wiersza polecenia:

    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. Uruchom następujące polecenie:

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

Przykład: Publiczna konfiguracja bez pliku skryptu

W tym przykładzie użyto następującej zawartości w formacie JSON:

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

Uruchom następujące polecenie:

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

Przykład: pliki konfiguracji publicznej i chronionej

Użyj pliku konfiguracji publicznej, aby określić identyfikator URI pliku skryptu:

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

Użyj chronionego pliku konfiguracji, aby określić polecenie do uruchomienia:

{
  "commandToExecute": "./config-music.sh"
}
  1. Utwórz plik konfiguracji publicznej przy użyciu wybranego edytora tekstów lub za pomocą następującego polecenia interfejsu wiersza polecenia:

    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. Utwórz chroniony plik konfiguracji przy użyciu wybranego edytora tekstów lub za pomocą następującego polecenia interfejsu wiersza polecenia:

    cat <<EOF > protected-config.json
    {
      "commandToExecute": "./config-music.sh"
    }
    EOF
    
  3. Uruchom następujące polecenie:

    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

Jeśli wdrożysz rozszerzenie niestandardowego skryptu z witryny Azure Portal, nie masz kontroli nad wygaśnięciem tokenu SAS w celu uzyskania dostępu do skryptu na koncie magazynu. Początkowe wdrożenie działa, ale gdy token SAS konta magazynu wygaśnie, każda kolejna operacja skalowania kończy się niepowodzeniem, ponieważ rozszerzenie niestandardowego skryptu nie może już uzyskać dostępu do konta magazynu.

Zalecamy użycie programu PowerShell, interfejsu wiersza polecenia platformy Azure lub szablonu usługi Azure Resource Manager podczas wdrażania rozszerzenia niestandardowego skryptu w zestawie skalowania maszyn wirtualnych. W ten sposób możesz użyć tożsamości zarządzanej lub mieć bezpośrednią kontrolę nad wygaśnięciem tokenu SAS na potrzeby uzyskiwania dostępu do skryptu na koncie magazynu tak długo, jak to konieczne.

Rozwiązywanie problemów

Po uruchomieniu rozszerzenia niestandardowego skryptu skrypt zostanie utworzony lub pobrany do katalogu podobnego do poniższego przykładu. Dane wyjściowe polecenia są również zapisywane w tym katalogu w plikach stdout i stderr .

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

Aby rozwiązać problemy, najpierw sprawdź dziennik agenta systemu Linux i upewnij się, że rozszerzenie jest uruchomione:

sudo cat /var/log/waagent.log

Wyszukaj wykonanie rozszerzenia. Wygląda to następująco:

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

W poprzednich danych wyjściowych:

  • Enable polecenie jest uruchamiane po uruchomieniu polecenia.
  • Download odnosi się do pobierania niestandardowego pakietu rozszerzenia skryptu z platformy Azure, a nie plików skryptów określonych w pliku fileUris.

Rozszerzenie skryptu platformy Azure tworzy dziennik, który można znaleźć tutaj:

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

Poszukaj pojedynczego wykonania. Wygląda to następująco:

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

W tym miejscu można zobaczyć:

  • Polecenie enable uruchamiające ten dziennik.
  • Ustawienia przekazane do rozszerzenia.
  • Rozszerzenie pobierające plik i wynik tej akcji.
  • Uruchamiane polecenie i wynik.

Można również pobrać stan wykonywania rozszerzenia niestandardowego skryptu, w tym rzeczywiste argumenty przekazane jako commandToExecute, przy użyciu interfejsu wiersza polecenia platformy Azure:

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

Dane wyjściowe wyglądają podobnie do następującego tekstu:

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

Problemy ze składnią interfejsu wiersza polecenia platformy Azure

Interfejs wiersza polecenia platformy Azure może działać w kilku środowiskach powłoki, ale z niewielkimi odmianami formatu. Jeśli masz nieoczekiwane wyniki za pomocą poleceń interfejsu wiersza polecenia platformy Azure, zobacz Jak pomyślnie używać interfejsu wiersza polecenia platformy Azure.

Następne kroki

Aby wyświetlić kod, bieżące problemy i wersje, zobacz custom-script-extension-linux.