Udostępnij za pośrednictwem


Skrypty wdrożeniowe w szablonach ARM

Dowiedz się, jak używać skryptów wdrażania w szablonach usługi Azure Resource Manager (ARM). Za pomocą zasobu deploymentScripts użytkownicy mogą wykonywać skrypty we wdrożeniach usługi ARM i przeglądać wyniki wykonania.

Napiwek

Zalecamy Bicep, ponieważ oferuje te same możliwości co szablony usługi ARM, a składnia jest łatwiejsza w użyciu. Aby dowiedzieć się więcej, zobacz Skrypt wdrażania.

Te skrypty mogą służyć do wykonywania niestandardowych kroków, takich jak:

  • Dodaj użytkowników do katalogu.
  • Wykonywanie operacji na poziomie danych, na przykład kopiowanie obiektów blobów lub inicjowanie bazy danych.
  • Wyszukaj i zweryfikuj klucz licencji.
  • Utwórz certyfikat z podpisem własnym.
  • Utwórz obiekt w identyfikatorze Entra firmy Microsoft.
  • Wyszukaj bloki adresów IP w niestandardowym systemie.

Zalety skryptu wdrażania:

  • Skrypty wdrażania można opracowywać w ulubionych środowiskach deweloperskich. Skrypty można osadzać w szablonach lub w zewnętrznych plikach skryptów.
  • Możesz określić język skryptu i platformę. Obecnie obsługiwane są skrypty wdrażania programu Azure PowerShell i interfejsu wiersza polecenia platformy Azure w środowisku systemu Linux.
  • Zezwól na przekazywanie argumentów wiersza poleceń do skryptu.
  • Może określać dane wyjściowe skryptu i przekazywać je z powrotem do wdrożenia.

Zasób skryptu wdrażania jest dostępny tylko w regionach, w których jest dostępny Azure Container Instance. Zobacz Dostępność zasobów dla usługi Azure Container Instances w regionach świadczenia usługi Azure. Obecnie skrypt wdrażania używa tylko sieci publicznej.

Ważne

Usługa skryptów wdrażania wymaga dwóch zasobów pomocniczych na potrzeby wykonywania skryptów i diagnozowania problemów: konta magazynu i wystąpienia kontenera. Możesz określić istniejące konto magazynowe, w przeciwnym razie skrypt utworzy je dla Ciebie. Dwa automatycznie utworzone zasoby pomocnicze są zwykle usuwane przez usługę skryptów, gdy wykonanie skryptu wdrażania osiąga stan końcowy. Opłaty są naliczane za zasoby pomocnicze do momentu ich usunięcia. Aby uzyskać informacje o cenach, zobacz Cennik usługi Container Instances i Cennik usługi Azure Storage. Aby dowiedzieć się więcej, zobacz Zasoby skryptu wdrażania oczyszczania.

Uwaga

Logika ponawiania prób logowania do platformy Azure jest teraz wbudowana w skrypt osłony. Jeśli przyznasz uprawnienia w tym samym szablonie co skrypty wdrożeniowe, usługa skryptów wdrażania będzie ponawiać próbę logowania przez 10 minut, co 10 sekund, aż przypisanie roli tożsamości zarządzanej zostanie zreplikowane.

Zasoby szkoleniowe

Jeśli wolisz uczyć się o skryptach wdrażania poprzez bardziej szczegółowe wskazówki, zobacz Rozszerzanie szablonów ARM przy użyciu skryptów wdrażania.

Konfigurowanie minimalnych uprawnień

W przypadku interfejsu API skryptu wdrażania w wersji 2020-10-01 lub nowszej istnieją dwa podmioty zabezpieczeń związane z wykonywaniem skryptu wdrażania:

  • Konto użytkownika wdrożenia (konto użytkownika używane do wdrożenia szablonu): to konto użytkownika służy do tworzenia zasobów bazowych wymaganych do wykonania zasobu skryptu wdrożenia — konto magazynu i kontener Azure. Aby skonfigurować uprawnienia o najmniejszym poziomie, przypisz rolę niestandardową z następującymi właściwościami do głównego podmiotu wdrożenia.

    {
      "roleName": "deployment-script-minimum-privilege-for-deployment-principal",
      "description": "Configure least privilege for the deployment principal in deployment script",
      "type": "customRole",
      "IsCustom": true,
      "permissions": [
        {
          "actions": [
            "Microsoft.Storage/storageAccounts/*",
            "Microsoft.ContainerInstance/containerGroups/*",
            "Microsoft.Resources/deployments/*",
            "Microsoft.Resources/deploymentScripts/*"
          ],
         "dataActions": [
            "Microsoft.Storage/storageAccounts/fileServices/*"
          ]
        }
      ],
      "assignableScopes": [
        "[subscription().id]"
      ]
    }
    

    Jeśli dostawcy zasobów Azure Storage i Azure Container Instance nie zostali zarejestrowani, należy również dodać Microsoft.Storage/register/action i Microsoft.ContainerInstance/register/action.

  • Podmiot skryptu wdrażania: ten podmiot jest wymagany tylko wtedy, gdy skrypt wdrożenia musi uwierzytelnić się na platformie Azure i wywołać interfejs wiersza polecenia platformy Azure lub program PowerShell. Istnieją dwa sposoby specyfikacji głównego skryptu wdrożenia:

    • Określ tożsamość zarządzaną przypisaną przez użytkownika we identity właściwości (zobacz Przykładowe szablony). Gdy jest określone, usługa skryptu wywołuje Connect-AzAccount -Identity przed wywołaniem skryptu wdrażania. Tożsamość zarządzana musi mieć wymagany dostęp, aby ukończyć operację w skrycie. Obecnie dla właściwości obsługiwana jest tylko tożsamość zarządzana przypisana przez użytkownika. Aby zalogować się przy użyciu innej tożsamości, użyj drugiej metody na tej liście.
    • Przekaż poświadczenia jednostki usługi jako bezpieczne zmienne środowiskowe, następnie należy użyć Connect-AzAccount lub az login w skrypcie wdrażania.

    Jeśli jest używana tożsamość zarządzana, jednostka wdrożeniowa wymaga przypisania roli Operatora tożsamości zarządzanej (wbudowanej roli) do zasobu tożsamości zarządzanej.

Przykładowe szablony

Poniższy kod JSON jest przykładem. Aby uzyskać więcej informacji, zobacz najnowszy schemat szablonu.

{
  "type": "Microsoft.Resources/deploymentScripts",
  "apiVersion": "2020-10-01",
  "name": "runPowerShellInline",
  "location": "[resourceGroup().location]",
  "tags": {
    "tagName1": "tagValue1",
    "tagName2": "tagValue2"
  },
  "kind": "AzurePowerShell", // or "AzureCLI"
  "identity": {
    "type": "userAssigned",
    "userAssignedIdentities": {
      "/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myID": {}
    }
  },
  "properties": {
    "forceUpdateTag": "1",
    "containerSettings": {
      "containerGroupName": "mycustomaci"
    },
    "storageAccountSettings": {
      "storageAccountName": "myStorageAccount",
      "storageAccountKey": "myKey"
    },
    "azPowerShellVersion": "9.7",  // or "azCliVersion": "2.47.0",
    "arguments": "-name \\\"John Dole\\\"",
    "environmentVariables": [
      {
        "name": "UserName",
        "value": "jdole"
      },
      {
        "name": "Password",
        "secureValue": "jDolePassword"
      }
    ],
    "scriptContent": "
      param([string] $name)
      $output = 'Hello {0}. The username is {1}, the password is {2}.' -f $name,${Env:UserName},${Env:Password}
      Write-Output $output
      $DeploymentScriptOutputs = @{}
      $DeploymentScriptOutputs['text'] = $output
    ", // or "primaryScriptUri": "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/deployment-script/deploymentscript-helloworld.ps1",
    "supportingScriptUris":[],
    "timeout": "PT30M",
    "cleanupPreference": "OnSuccess",
    "retentionInterval": "P1D"
  }
}

Uwaga

Przykład służy do celów demonstracyjnych. Właściwości scriptContent i primaryScriptUri nie mogą współistnieć w szablonie.

Uwaga

SkryptContent przedstawia skrypt z wieloma wierszami. Na portalu Azure i w potoku Azure DevOps nie można przeanalizować wielowierszowego skryptu wdrażania. Możesz połączyć polecenia programu PowerShell (przy użyciu średników lub \r\n lub \n) w jednym wierszu albo użyć primaryScriptUri właściwości z zewnętrznym plikiem skryptu. Wiele bezpłatnych narzędzi do escape/unescape łańcuchów JSON jest dostępnych. Na przykład https://www.freeformatter.com/json-escape.html.

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

  • identity: W przypadku interfejsu API skryptu wdrażania w wersji 2020-10-01 lub nowszej tożsamość zarządzana przypisana przez użytkownika jest opcjonalna, chyba że musisz wykonać jakiekolwiek akcje specyficzne dla platformy Azure w skrycie. W przypadku interfejsu API w wersji 2019-10-01-preview tożsamość zarządzana jest wymagana, ponieważ skrypty są wykonywane przy użyciu tej tożsamości. Po określeniu właściwości tożsamości usługa skryptu wywołuje przed Connect-AzAccount -Identity wywołaniem skryptu użytkownika. Obecnie obsługiwana jest tylko tożsamość zarządzana przypisana przez użytkownika. Aby zalogować się przy użyciu innej tożsamości, możesz wywołać polecenie Connect-AzAccount w skrypcie.

  • tags: tagi skryptu wdrożenia. Jeśli usługa skryptu wdrożenia generuje konto magazynowe i wystąpienie kontenera, tagi są przekazywane do obu zasobów, co pozwala na identyfikację tych zasobów. Innym sposobem identyfikacji tych zasobów jest ich sufiksy, które zawierają "azscripts". Aby uzyskać więcej informacji, zobacz Monitorowanie i rozwiązywanie problemów ze skryptami wdrażania.

  • kind: określ typ skryptu. Obecnie obsługiwane są skrypty programu Azure PowerShell i interfejsu wiersza polecenia platformy Azure. Wartości to AzurePowerShell i AzureCLI.

  • forceUpdateTag: zmiana tej wartości między wdrożeniami szablonów wymusza ponowne wykonanie skryptu wdrażania. Jeśli używasz funkcji newGuid() lub funkcji utcNow(), obie funkcje mogą być używane tylko w wartości domyślnej dla parametru. Aby dowiedzieć się więcej, zobacz Uruchamianie skryptu więcej niż raz.

  • containerSettings: Określ ustawienia, aby dostosować instancję kontenera Azure. Skrypt wdrażania wymaga nowego wystąpienia kontenera platformy Azure. Nie można określić istniejącego kontenera Azure. Można jednak dostosować nazwę grupy kontenerów przy użyciu polecenia containerGroupName. Jeśli nie zostanie określona, nazwa grupy zostanie wygenerowana automatycznie.

  • storageAccountSettings: określ ustawienia, które mają być użyte z istniejącego konta magazynu. Jeśli storageAccountName nie zostanie określony, automatycznie zostanie też utworzone konto przechowywania. Zobacz Użyj istniejącego konta magazynu.

  • azPowerShellVersion / azCliVersion: określ wersję modułu, która ma być używana. Zobacz listę obsługiwanych wersji programu Azure PowerShell. Wersja określa, który obraz kontenera ma być używany:

    • Moduł Az w wersji nowszej lub równej 9 używa systemu Ubuntu 22.04.
    • Wersja Az większa niż lub równa 6, ale mniejsza niż 9 używa systemu Ubuntu 20.04.
    • Moduł Az w wersji mniejszej niż 6 używa systemu Ubuntu 18.04.

    Ważne

    Zaleca się uaktualnienie do najnowszej wersji systemu Ubuntu, ponieważ ubuntu 18.04 zbliża się do końca życia i nie będzie już otrzymywać aktualizacji zabezpieczeń poza 31 maja 2023 r.

    Zobacz listę obsługiwanych wersji interfejsu wiersza polecenia platformy Azure.

    Ważne

    Skrypt wdrażania używa dostępnych obrazów interfejsu wiersza polecenia z usługi Microsoft Container Registry (MCR). Zazwyczaj, aby certyfikować obraz CLI dla skryptu wdrożeniowego, trwa to około jednego miesiąca. Nie używaj wersji interfejsu wiersza polecenia, które zostały wydane w ciągu 30 dni. Aby znaleźć daty wydania obrazów, zobacz Informacje o wersji interfejsu wiersza polecenia platformy Azure. Jeśli jest używana nieobsługiwana wersja, komunikat o błędzie zawiera listę obsługiwanych wersji.

  • arguments: Określ wartości parametrów. Wartości są oddzielone spacjami.

    Skrypty wdrażania dzielą argumenty na tablicę ciągów, wywołując wywołanie systemu CommandLineToArgvW . Ten krok jest niezbędny, ponieważ argumenty są przekazywane jako właściwość polecenia do usługi Azure Container Instance, a właściwość polecenia jest tablicą ciągów.

    Jeśli argumenty zawierają znaki ucieczki, użyj JsonEscaper , aby dwukrotnie uniknąć znaków. Wklej oryginalny ciąg ucieczki do narzędzia, a następnie wybierz pozycję Ucieczka. Narzędzie generuje podwójny ciąg ucieczki. Na przykład w poprzednim przykładowym szablonie argument to -name \"John Dole\". Ciąg ucieczki to -name \\\"John Dole\\\".

    Aby przekazać parametr szablonu usługi ARM typu object jako argument, przekonwertuj obiekt na ciąg przy użyciu funkcji string(), a następnie użyj funkcji replace(), aby zamienić każde wystąpienie \" na \\\". Na przykład:

    replace(string(parameters('tables')), '\"', '\\\"')
    

    Aby uzyskać więcej informacji, zobacz przykładowy szablon.

  • environmentVariables: Określ zmienne środowiskowe, które mają być przekazywane do skryptu. Aby uzyskać więcej informacji, zobacz Tworzenie skryptów wdrażania.

  • scriptContent: określ zawartość skryptu. Aby uruchomić skrypt zewnętrzny, zamiast tego użyj polecenia primaryScriptUri . Przykłady można znaleźć w temacie Use inline script (Używanie skryptu wbudowanego) i Use external script (Używanie skryptu zewnętrznego).

  • primaryScriptUri: określ publicznie dostępny adres URL podstawowego skryptu wdrażania z obsługiwanymi rozszerzeniami plików. Aby uzyskać więcej informacji, zobacz Używanie skryptów zewnętrznych.

  • supportingScriptUris: określ tablicę publicznie dostępnych adresów URL do plików pomocniczych, które są wywoływane w elemencie scriptContent lub primaryScriptUri. Aby uzyskać więcej informacji, zobacz Używanie skryptów zewnętrznych.

  • timeout: określ maksymalny dozwolony czas wykonywania skryptu określony w formacie ISO 8601. Wartość domyślna to P1D.

  • cleanupPreference. Określ preferencję czyszczenia dwóch pomocniczych zasobów wdrażania, konta magazynu i wystąpienia kontenera, gdy wykonanie skryptu zostanie w stanie terminalu. Ustawienie domyślne to Zawsze, co oznacza usunięcie zasobów pomocniczych pomimo stanu terminalu (Powodzenie, Niepowodzenie, Anulowanie). Aby dowiedzieć się więcej, zobacz Oczyszczanie zasobów skryptu wdrażania.

  • retentionInterval: określ interwał, dla którego usługa zachowuje zasób skryptu wdrożenia po osiągnięciu stanu terminalu przez wykonanie skryptu wdrożenia. Zasób skryptu wdrażania jest usuwany po wygaśnięciu tego czasu trwania. Czas trwania jest oparty na wzorcu ISO 8601. Interwał przechowywania wynosi od 1 do 26 godzin (PT26H). Ta właściwość jest używana, gdy cleanupPreference jest ustawiona na OnExpiration. Aby dowiedzieć się więcej, zobacz Oczyszczanie zasobów skryptu wdrażania.

Więcej przykładów

  • Przykład 1: utwórz magazyn kluczy i użyj skryptu wdrażania, aby przypisać certyfikat do magazynu kluczy.
  • Przykład 2: utwórz grupę zasobów na poziomie subskrypcji, utwórz magazyn kluczy w grupie zasobów, a następnie użyj skryptu wdrażania, aby przypisać certyfikat do magazynu kluczy.
  • Przykład 3: tworzenie tożsamości zarządzanej przypisanej przez użytkownika, przypisywanie roli współautora do tożsamości na poziomie grupy zasobów, tworzenie magazynu kluczy, a następnie przypisywanie certyfikatu do magazynu kluczy za pomocą skryptu wdrażania.
  • Przykład 4: jest to ten sam scenariusz co przykład 1 na tej liście. Zostanie utworzona nowa grupa zasobów w celu uruchomienia skryptu wdrażania. Ten szablon jest szablonem na poziomie subskrypcji.
  • Przykład 5: jest to ten sam scenariusz co przykład 4. Ten szablon jest szablonem na poziomie grupy zasobów.
  • Przykład 6: ręcznie utwórz tożsamość zarządzaną przypisaną przez użytkownika i przypisz jej uprawnienie do używania interfejsu API programu Microsoft Graph do tworzenia aplikacji Microsoft Entra; w szablonie usługi ARM użyj skryptu wdrażania, aby utworzyć aplikację i jednostkę usługi Microsoft Entra oraz wyświetlić identyfikatory obiektów i identyfikatory klienta.

Korzystanie ze skryptów wbudowanych

Poniższy szablon ma jeden zasób zdefiniowany z typem Microsoft.Resources/deploymentScripts . Wyróżniona część jest wbudowanym skryptem.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "name": {
      "type": "string",
      "defaultValue": "\\\"John Dole\\\""
    },
    "utcValue": {
      "type": "string",
      "defaultValue": "[utcNow()]"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "runPowerShellInlineWithOutput",
      "location": "[resourceGroup().location]",
      "kind": "AzurePowerShell",
      "properties": {
        "forceUpdateTag": "[parameters('utcValue')]",
        "azPowerShellVersion": "8.3",
        "scriptContent": "
          param([string] $name)
          $output = \"Hello {0}\" -f $name
          Write-Output $output
          $DeploymentScriptOutputs = @{}
          $DeploymentScriptOutputs['text'] = $output
        ",
        "arguments": "[concat('-name', ' ', parameters('name'))]",
        "timeout": "PT1H",
        "cleanupPreference": "OnSuccess",
        "retentionInterval": "P1D"
      }
    }
  ],
  "outputs": {
    "result": {
      "value": "[reference('runPowerShellInlineWithOutput').outputs.text]",
      "type": "string"
    }
  }
}

Uwaga

Ponieważ skrypty wdrażania w linii są ujęte w podwójne cudzysłowy, ciągi wewnątrz skryptów wdrażania trzeba wyszczególnić za pomocą ukośnika odwrotnego (\) lub ująć w pojedynczy cudzysłów. Możesz również rozważyć użycie zastępowania tekstu, jak to pokazano w poprzednim przykładzie JSON.

Skrypt przyjmuje jeden parametr i zwraca wartość parametru. DeploymentScriptOutputs służy do przechowywania danych wyjściowych. W sekcji dane wyjściowe wiersz pokazuje, value jak uzyskać dostęp do przechowywanych wartości. Write-Output służy do debugowania. Aby dowiedzieć się, jak uzyskać dostęp do pliku wyjściowego, zobacz Monitorowanie i rozwiązywanie problemów ze skryptami wdrażania. Opisy właściwości można znaleźć w temacie Przykładowe szablony.

Aby uruchomić skrypt, wybierz pozycję Wypróbuj , aby otworzyć usługę Cloud Shell, a następnie wklej następujący kod w okienku powłoki.

$resourceGroupName = Read-Host -Prompt "Enter the name of the resource group to be created"
$location = Read-Host -Prompt "Enter the location (i.e. centralus)"

New-AzResourceGroup -Name $resourceGroupName -Location $location

New-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName -TemplateUri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/deployment-script/deploymentscript-helloworld.json"

Write-Host "Press [ENTER] to continue ..."

Dane wyjściowe wyglądają następująco:

Zrzut ekranu przedstawiający wynik działania skryptu wdrożenia szablonu Resource Manager 'hello world'.

Używanie skryptów zewnętrznych

Oprócz wbudowanych skryptów można również używać zewnętrznych plików skryptów. Obsługiwane są tylko główne skrypty programu PowerShell z rozszerzeniem pliku ps1. W przypadku skryptów CLI skrypty podstawowe mogą mieć dowolne rozszerzenia (lub bez rozszerzenia), o ile skrypty są prawidłowymi skryptami powłoki Bash. Aby użyć plików skryptów zewnętrznych, zastąp scriptContent na primaryScriptUri. Na przykład:

"primaryScriptUri": "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/deployment-script/deploymentscript-helloworld.ps1",

Aby uzyskać więcej informacji, zobacz przykładowy szablon.

Pliki skryptów zewnętrznych muszą być dostępne. Aby zabezpieczyć pliki skryptów przechowywane na kontach usługi Azure Storage, wygeneruj token SAS i dołącz go do identyfikatora URI szablonu. Ustaw czas wygaśnięcia, aby umożliwić wystarczającą ilość czasu na ukończenie wdrożenia. Aby uzyskać więcej informacji, zobacz Wdrażanie prywatnego szablonu ARM z tokenem SAS.

Odpowiadasz za zapewnienie integralności skryptów, do których odwołuje się skrypt wdrożenia, primaryScriptUri lub supportingScriptUris. Odwołuj się tylko do skryptów, którym ufasz.

Korzystanie ze skryptów pomocniczych

Skomplikowane logiki można oddzielić od jednego lub większej liczby plików skryptów pomocniczych. Właściwość supportingScriptUris umożliwia podanie tablicy URI do plików skryptów pomocniczych, jeśli to konieczne.

"scriptContent": "
    ...
    ./Create-Cert.ps1
    ...
"

"supportingScriptUris": [
  "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/deployment-script/create-cert.ps1"
],

Pliki skryptów pomocniczych mogą być wywoływane zarówno ze skryptów wbudowanych, jak i plików skryptów podstawowych. Pliki skryptów pomocniczych nie mają ograniczeń dotyczących rozszerzenia pliku.

Pliki pomocnicze są kopiowane do azscripts/azscriptinput podczas działania. Użyj ścieżki względnej, aby odwołać się do plików pomocniczych ze skryptów wbudowanych i plików skryptów podstawowych.

Praca z danymi wyjściowymi ze skryptów programu PowerShell

Poniższy szablon przedstawia sposób przekazywania wartości między dwoma deploymentScripts zasobami:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "name": {
      "type": "string",
      "defaultValue": "John Dole"
    },
    "utcValue": {
      "type": "string",
      "defaultValue": "[utcNow()]"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "scriptInTemplate1",
      "location": "[resourceGroup().location]",
      "kind": "AzurePowerShell",
      "properties": {
        "forceUpdateTag": "[parameters('utcValue')]",
        "azPowerShellVersion": "8.3",
        "timeout": "PT1H",
        "arguments": "[concat('-name', ' ', concat('\\\"', parameters('name'), '\\\"'))]",
        "scriptContent": "
          param([string] $name)
          $output = 'Hello {0}' -f $name
          Write-Output $output
          $DeploymentScriptOutputs = @{}
          $DeploymentScriptOutputs['text'] = $output
        ",
        "cleanupPreference": "Always",
        "retentionInterval": "P1D"
      }
    },
    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "scriptInTemplate2",
      "location": "[resourceGroup().location]",
      "kind": "AzurePowerShell",
      "dependsOn": [
        "scriptInTemplate1"
      ],
      "properties": {
        "forceUpdateTag": "[parameters('utcValue')]",
        "azPowerShellVersion": "8.3",
        "timeout": "PT1H",
        "arguments": "[concat('-textToEcho', ' ', concat('\\\"', reference('scriptInTemplate1').outputs.text, '\\\"'))]",
        "scriptContent": "
          param([string] $textToEcho)
          Write-Output $textToEcho
          $DeploymentScriptOutputs = @{}
          $DeploymentScriptOutputs['text'] = $textToEcho
        ",
        "cleanupPreference": "Always",
        "retentionInterval": "P1D"
      }
    }
  ],
  "outputs": {
    "result": {
      "value": "[reference('scriptInTemplate2').outputs.text]",
      "type": "string"
    }
  }
}

W pierwszym zasobie zdefiniujesz zmienną o nazwie $DeploymentScriptOutputsi użyjesz jej do przechowywania wartości wyjściowych. Aby uzyskać dostęp do wartości wyjściowej z innego zasobu w szablonie, użyj:

reference('<ResourceName>').outputs.text

Praca z danymi wyjściowymi skryptów interfejsu wiersza polecenia

W przeciwieństwie do skryptów wdrażania programu Azure PowerShell interfejs wiersza polecenia/powłoka bash nie uwidacznia wspólnej zmiennej do przechowywania danych wyjściowych skryptu. Zamiast tego używa zmiennej środowiskowej o nazwie AZ_SCRIPTS_OUTPUT_PATH , aby wskazać lokalizację pliku wyjściowego skryptu. Podczas wykonywania skryptu wdrażania w szablonie usługi ARM powłoka powłoki Bash automatycznie konfiguruje tę zmienną środowiskową. Jego wstępnie zdefiniowana wartość jest ustawiana jako /mnt/azscripts/azscriptoutput/scriptoutputs.json. Dane wyjściowe są wymagane do zachowania zgodności z prawidłową strukturą obiektów ciągów JSON. Zawartość pliku powinna być sformatowana jako para klucz-wartość. Na przykład tablica ciągów powinna zostać zapisana jako { "MyResult": [ "foo", "bar"] }. Przechowywanie tylko wyników tablicy, takich jak [ "foo", "bar" ], jest uznawane za nieprawidłowe.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "identity": {
      "type": "string"
    },
    "utcValue": {
      "type": "string",
      "defaultValue": "[utcNow()]"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "runBashWithOutputs",
      "location": "[resourceGroup().location]",
      "kind": "AzureCLI",
      "identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "[parameters('identity')]": {
          }
        }
      },
      "properties": {
        "forceUpdateTag": "[parameters('utcValue')]",
        "AzCliVersion": "2.40.0",
        "timeout": "PT30M",
        "arguments": "'foo' 'bar'",
        "environmentVariables": [
          {
            "name": "UserName",
            "value": "jdole"
          },
          {
            "name": "Password",
            "secureValue": "jDolePassword"
          }
        ],
        "scriptContent": "result=$(az keyvault list); echo \"arg1 is: $1\"; echo \"arg2 is: $2\"; echo \"Username is: $UserName\"; echo \"password is: $Password\"; echo $result | jq -c '{Result: map({id: .id})}' > $AZ_SCRIPTS_OUTPUT_PATH",
        "cleanupPreference": "OnExpiration",
        "retentionInterval": "P1D"

W poprzednim przykładzie użyto języka jq . Jest on dostarczany z obrazami kontenerów. Zobacz Konfigurowanie środowiska projektowego.

Użycie istniejącego konta przechowywania

Konto magazynowe i wystąpienie kontenera są potrzebne do uruchamiania skryptu i rozwiązywania problemów. Masz możliwość określenia istniejącego konta magazynu; w przeciwnym razie konto magazynu wraz z wystąpieniem kontenera jest automatycznie tworzone przez skrypt. Wymagania dotyczące korzystania z istniejącego konta magazynu:

  • Obsługiwane rodzaje kont magazynu to:

    jednostka magazynowa (SKU) Obsługiwany rodzaj
    Premium_LRS Przechowywanie plików
    Premium_ZRS Przechowywanie plików
    Standard_GRS Storage, StorageV2
    Standard_GZRS StorageV2
    Standard_LRS Storage, StorageV2
    Standard_RAGRS Storage, StorageV2
    Standard_RAGZRS StorageV2
    Standard_ZRS StorageV2

    Te kombinacje obsługują zasoby plikowe. Aby uzyskać więcej informacji, zobacz Tworzenie udziału plików platformy Azure i typy kont magazynu.

  • Reguły zapory sieciowej konta magazynowego nie są jeszcze obsługiwane. Aby uzyskać więcej informacji, zobacz Konfigurowanie zapór i sieci wirtualnych usługi Azure Storage.

  • Główna jednostka wdrożeniowa musi mieć uprawnienia do zarządzania kontem magazynu, co obejmuje odczyt, tworzenie i usuwanie udziałów plików.

  • Właściwość allowSharedKeyAccess konta magazynu musi być ustawiona na true. Jedynym sposobem instalacji konta magazynu w usłudze Azure Container Instance (ACI) jest użycie klucza dostępu.

Aby określić istniejące konto magazynu, dodaj następujący kod JSON do elementu właściwości :Microsoft.Resources/deploymentScripts

"storageAccountSettings": {
  "storageAccountName": "myStorageAccount",
  "storageAccountKey": "myKey"
},
  • storageAccountName: określ nazwę konta magazynu.

  • storageAccountKey: określ jeden z kluczy konta magazynu. Aby pobrać klucz, możesz użyć funkcji listKeys( ). Na przykład:

    "storageAccountSettings": {
        "storageAccountName": "[variables('storageAccountName')]",
        "storageAccountKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2019-06-01').keys[0].value]"
    }
    

Zobacz Przykładowe szablony , aby uzyskać pełną Microsoft.Resources/deploymentScripts definicję.

Gdy jest używane istniejące konto magazynu, usługa skryptu tworzy udział plików o unikatowej nazwie. Zobacz Czyszczenie zasobów skryptu wdrażania, aby dowiedzieć się, jak usługa skryptu czyści udział plików.

Opracowywanie skryptów wdrażania

Obsługa błędów nieokreślonych

Możesz kontrolować, jak program PowerShell reaguje na błędy nieokreślone, używając zmiennej $ErrorActionPreference w skrypicie wdrożenia. Jeśli zmienna nie jest ustawiona w skrypsie wdrożenia, usługa skryptu używa wartości domyślnej Kontynuuj.

Usługa skryptu ustawia stan aprowizacji zasobu na Niepowodzenie, gdy skrypt napotka błąd pomimo ustawienia .$ErrorActionPreference

Używanie zmiennych środowiskowych

Skrypt wdrażania używa następujących zmiennych środowiskowych:

Zmienna środowiskowa Domyślna wartość Zarezerwowane dla systemu
AZ_SCRIPTS_AZURE_ENVIRONMENT AzureCloud N
Preferencje_Usuwania_Skryptów_AZ OnExpiration N
AZ_SCRIPTS_OUTPUT_PATH < >AZ_SCRIPTS_PATH_OUTPUT_DIRECTORY/<AZ_SCRIPTS_PATH_SCRIPT_OUTPUT_FILE_NAME> Y
AZ_SCRIPTS_PATH_INPUT_DIRECTORY /mnt/azscripts/azscriptinput Y
AZ_SCRIPTS_PATH_OUTPUT_DIRECTORY /mnt/azscripts/azscriptoutput Y
ŚCIEŻKA_SKRYPTÓW_AZ_PLIK_SKRYPTU_UŻYTKOWNIKA Azure PowerShell: userscript.ps1; Interfejs wiersza polecenia platformy Azure: userscript.sh Y
AZ_SCRIPTS_PATH_PRIMARY_SCRIPT_URI_FILE_NAME primaryscripturi.config Y
AZ_SCRIPTS_PATH_SUPPORTING_SCRIPT_URI_FILE_NAME supportingscripturi.config Y
AZ_SCRIPTS_PATH_SCRIPT_OUTPUT_FILE_NAME scriptoutputs.json Y
AZ_SCRIPTS_PATH_WYNIKI_WYKONANIA_NAZWA_PLIKU executionresult.json Y
AZ_SCRIPTS_USER_ASSIGNED_IDENTITY /Subskrypcji/ N

Aby uzyskać więcej informacji na temat korzystania z AZ_SCRIPTS_OUTPUT_PATH, zobacz Praca z danymi wyjściowymi ze skryptu CLI.

Przekazywanie zabezpieczonych ciągów do skryptu wdrożenia

Ustawienie zmiennych środowiskowych (EnvironmentVariable) w wystąpieniach kontenera umożliwia zapewnienie dynamicznej konfiguracji aplikacji lub skryptu uruchamianego przez kontener. Skrypt wdrażania obsługuje niezabezpieczone i zabezpieczone zmienne środowiskowe w taki sam sposób jak Azure Container Instances. Aby uzyskać więcej informacji, zobacz Ustawianie zmiennych środowiskowych w wystąpieniach kontenera. Przykład można znaleźć w temacie Przykładowe szablony.

Maksymalny dozwolony rozmiar zmiennych środowiskowych to 64 KB.

Monitorowanie i rozwiązywanie problemów ze skryptami wdrażania

Usługa skryptu tworzy konto magazynowe (chyba że określisz istniejące konto magazynowe) i instancję kontenera do wykonywania skryptu. Jeśli te zasoby są tworzone automatycznie przez usługę skryptów, oba zasoby mają azscripts sufiks w nazwach zasobów.

Zrzut ekranu przedstawiający nazwy zasobów skryptu wdrażania szablonu usługi Resource Manager.

Skrypt użytkownika, wyniki wykonywania i plik stdout są przechowywane w udostępnionych zasobach plikowych konta przechowywania. Istnieje folder o nazwie azscripts. W folderze znajdują się jeszcze dwa foldery dla plików wejściowych i wyjściowych: azscriptinput i azscriptoutput.

Folder wyjściowy zawiera executionresult.json i plik wyjściowy skryptu. W executionresult.json jest wyświetlany komunikat o błędzie wykonywania skryptu. Plik wyjściowy jest tworzony tylko wtedy, gdy skrypt zostanie wykonany pomyślnie. Folder input zawiera systemowy plik skryptu programu PowerShell i pliki skryptów wdrożenia użytkownika. Możesz zastąpić plik skryptu wdrożenia użytkownika poprawionym plikiem i ponownie uruchomić skrypt wdrożenia z wystąpienia kontenera platformy Azure.

Korzystanie z witryny Azure Portal

Po wdrożeniu zasobu skryptu wdrażania zasób jest wyświetlany w grupie zasobów w witrynie Azure Portal. Poniższy zrzut ekranu przedstawia stronę Przegląd zasobu skryptu wdrażania:

Zrzut ekranu przedstawiający przegląd portalu skryptu wdrażania szablonu usługi Resource Manager.

Na stronie przeglądu wyświetlane są niektóre ważne informacje dotyczące zasobu, takie jak stan dostarczania, konto magazynowe, instancja kontenera oraz dzienniki.

W menu po lewej stronie możesz wyświetlić zawartość skryptu wdrożenia, argumenty przekazane do skryptu i dane wyjściowe. Można również wyeksportować szablon skryptu wdrożenia, w tym skrypt wdrożenia.

Użyj PowerShell

Za pomocą programu Azure PowerShell można zarządzać skryptami wdrażania w zakresie subskrypcji lub grupy zasobów:

Wynik Get-AzDeploymentScript jest podobny do następującego:

Name                : runPowerShellInlineWithOutput
Id                  : /subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myds0618rg/providers/Microsoft.Resources/deploymentScripts/runPowerShellInlineWithOutput
ResourceGroupName   : myds0618rg
Location            : centralus
SubscriptionId      : aaaabbbb-0000-cccc-1111-dddd2222eeee
ProvisioningState   : Succeeded
Identity            : /subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/mydentity1008rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myuami
ScriptKind          : AzurePowerShell
AzPowerShellVersion : 9.7
StartTime           : 5/11/2023 7:46:45 PM
EndTime             : 5/11/2023 7:49:45 PM
ExpirationDate      : 5/12/2023 7:49:45 PM
CleanupPreference   : OnSuccess
StorageAccountId    : /subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myds0618rg/providers/Microsoft.Storage/storageAccounts/ftnlvo6rlrvo2azscripts
ContainerInstanceId : /subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myds0618rg/providers/Microsoft.ContainerInstance/containerGroups/ftnlvo6rlrvo2azscripts
Outputs             :
                      Key                 Value
                      ==================  ==================
                      text                Hello John Dole

RetentionInterval   : P1D
Timeout             : PT1H

Użyj Azure CLI

Za pomocą interfejsu wiersza polecenia platformy Azure można zarządzać skryptami wdrażania w zakresie subskrypcji lub grupy zasobów:

Dane wyjściowe polecenia listy są podobne do następujących:

[
  {
    "arguments": "'foo' 'bar'",
    "azCliVersion": "2.40.0",
    "cleanupPreference": "OnExpiration",
    "containerSettings": {
      "containerGroupName": null
    },
    "environmentVariables": null,
    "forceUpdateTag": "20231101T163748Z",
    "id": "/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myds0624rg/providers/Microsoft.Resources/deploymentScripts/runBashWithOutputs",
    "identity": {
      "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
      "type": "userAssigned",
      "userAssignedIdentities": {
        "/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourcegroups/myidentity/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myuami": {
          "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
          "principalId": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
        }
      }
    },
    "kind": "AzureCLI",
    "location": "centralus",
    "name": "runBashWithOutputs",
    "outputs": {
      "Result": [
        {
          "id": "/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/mytest/providers/Microsoft.KeyVault/vaults/mykv1027",
          "resourceGroup": "mytest"
        }
      ]
    },
    "primaryScriptUri": null,
    "provisioningState": "Succeeded",
    "resourceGroup": "mytest",
    "retentionInterval": "1 day, 0:00:00",
    "scriptContent": "result=$(az keyvault list); echo \"arg1 is: $1\"; echo $result | jq -c '{Result: map({id: .id})}' > $AZ_SCRIPTS_OUTPUT_PATH",
    "status": {
      "containerInstanceId": "/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/mytest/providers/Microsoft.ContainerInstance/containerGroups/eg6n7wvuyxn7iazscripts",
      "endTime": "2023-11-01T16:39:12.080950+00:00",
      "error": null,
      "expirationTime": "2023-11-02T16:39:12.080950+00:00",
      "startTime": "2023-11-01T16:37:53.139700+00:00",
      "storageAccountId": null
    },
    "storageAccountSettings": {
      "storageAccountKey": null,
      "storageAccountName": "dsfruro267qwb4i"
    },
    "supportingScriptUris": null,
    "systemData": {
      "createdAt": "2023-10-31T19:06:57.060909+00:00",
      "createdBy": "someone@contoso.com",
      "createdByType": "User",
      "lastModifiedAt": "2023-11-01T16:37:51.859570+00:00",
      "lastModifiedBy": "someone@contoso.com",
      "lastModifiedByType": "User"
    },
    "tags": null,
    "timeout": "0:30:00",
    "type": "Microsoft.Resources/deploymentScripts"
  }
]

Korzystanie z interfejsu API REST

Informacje o wdrożeniu zasobu skryptu wdrażania można uzyskać na poziomie grupy zasobów i na poziomie subskrypcji przy użyciu interfejsu API REST:

/subscriptions/<SubscriptionID>/resourcegroups/<ResourceGroupName>/providers/microsoft.resources/deploymentScripts/<DeploymentScriptResourceName>?api-version=2020-10-01
/subscriptions/<SubscriptionID>/providers/microsoft.resources/deploymentScripts?api-version=2020-10-01

W poniższym przykładzie użyto elementu ARMClient:

armclient login
armclient get /subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourcegroups/myrg/providers/microsoft.resources/deploymentScripts/myDeployementScript?api-version=2020-10-01

Dane wyjściowe są podobne do następujących:

{
  "kind": "AzurePowerShell",
  "identity": {
    "type": "userAssigned",
    "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
    "userAssignedIdentities": {
      "/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myidentity1008rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myuami": {
        "principalId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
        "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444"
      }
    }
  },
  "location": "centralus",
  "systemData": {
    "createdBy": "someone@contoso.com",
    "createdByType": "User",
    "createdAt": "2023-05-11T02:59:04.7501955Z",
    "lastModifiedBy": "someone@contoso.com",
    "lastModifiedByType": "User",
    "lastModifiedAt": "2023-05-11T02:59:04.7501955Z"
  },
  "properties": {
    "provisioningState": "Succeeded",
    "forceUpdateTag": "20220625T025902Z",
    "azPowerShellVersion": "9.7",
    "scriptContent": "\r\n          param([string] $name)\r\n          $output = \"Hello {0}\" -f $name\r\n          Write-Output $output\r\n          $DeploymentScriptOutputs = @{}\r\n          $DeploymentScriptOutputs['text'] = $output\r\n        ",
    "arguments": "-name \\\"John Dole\\\"",
    "retentionInterval": "P1D",
    "timeout": "PT1H",
    "containerSettings": {},
    "status": {
      "containerInstanceId": "/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myds0624rg/providers/Microsoft.ContainerInstance/containerGroups/64lxews2qfa5uazscripts",
      "storageAccountId": "/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myds0624rg/providers/Microsoft.Storage/storageAccounts/64lxews2qfa5uazscripts",
      "startTime": "2023-05-11T02:59:07.5951401Z",
      "endTime": "2023-05-11T03:00:16.7969234Z",
      "expirationTime": "2023-05-12T03:00:16.7969234Z"
    },
    "outputs": {
      "text": "Hello John Dole"
    },
    "cleanupPreference": "OnSuccess"
  },
  "id": "/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myds0624rg/providers/Microsoft.Resources/deploymentScripts/runPowerShellInlineWithOutput",
  "type": "Microsoft.Resources/deploymentScripts",
  "name": "runPowerShellInlineWithOutput"
}

Następujący interfejs API REST zwraca dziennik:

/subscriptions/<SubscriptionID>/resourcegroups/<ResourceGroupName>/providers/microsoft.resources/deploymentScripts/<DeploymentScriptResourceName>/logs?api-version=2020-10-01

Działa tylko przed usunięciem zasobów skryptu wdrożenia.

Aby wyświetlić zasób deploymentScripts w portalu, wybierz pozycję Pokaż ukryte typy:

Zrzut ekranu przedstawiający skrypt wdrażania szablonu usługi Resource Manager z opcją wyświetlania ukrytych typów w portalu.

Czyszczenie zasobów skryptu wdrażania

Te dwa automatycznie utworzone zasoby pomocnicze nigdy nie będą istnieć dłużej niż zasób deploymentScript, chyba że wystąpią problemy z ich usunięciem. Cykl życia zasobów pomocniczych jest kontrolowany przez cleanupPreference właściwość, cykl deploymentScript życia zasobu jest kontrolowany retentionInterval przez właściwość :

  • cleanupPreference: Określ opcję czyszczenia dla dwóch zasobów pomocniczych, gdy wykonywanie skryptu osiągnie stan końcowy. Obsługiwane wartości to:

    • Zawsze: usuń dwa zasoby pomocnicze, gdy wykonanie skryptu zostanie w stanie terminalu. Jeśli jest używane istniejące konto magazynu, usługa skryptu usuwa udział plików utworzony przez usługę. deploymentScripts Ponieważ zasób może być nadal obecny po wyczyszczeniu zasobów pomocniczych, usługa skryptu utrwala wyniki wykonywania skryptu, na przykład stdout, outputs i zwraca wartość przed usunięciem zasobów.

    • OnSuccess: Usuń dwa zasoby pomocnicze tylko wtedy, gdy wykonanie skryptu zakończy się pomyślnie. Jeśli jest używane istniejące konto przechowywania, usługa wykonująca skrypt usuwa udział plików tylko wtedy, gdy wykonanie skryptu zakończy się pomyślnie.

      Jeśli wykonanie skryptu nie powiedzie się, usługa skryptu czeka, aż retentionInterval wygaśnie, zanim wyczyści zasoby wspierające, a potem zasób skryptu wdrażania.

    • OnExpiration: Usuń dwa zasoby pomocnicze tylko wtedy, gdy retentionInterval ustawienie wygasło. Jeśli wykorzystujemy istniejące konto magazynowe, usługa skryptu usuwa udział plików, ale zachowuje konto magazynowe.

    Wystąpienie kontenera i konto magazynu są usuwane zgodnie z .cleanupPreference Jeśli jednak skrypt zakończy się niepowodzeniem i cleanupPreference nie zostanie ustawiony na Zawsze, proces wdrażania automatycznie przechowuje kontener uruchomiony przez jedną godzinę lub do momentu wyczyszczenia kontenera. Aby rozwiązać problemy ze skryptem, możesz użyć czasu. Jeśli chcesz zachować działanie kontenera po pomyślnych wdrożeniach, dodaj krok uśpienia do skryptu. Na przykład dodaj pozycję Start-Sleep na końcu skryptu. Jeśli nie dodasz kroku uśpienia, kontener zostanie ustawiony na stan terminalu i nie będzie można uzyskać do niego dostępu, nawet jeśli nie został jeszcze usunięty.

  • retentionInterval: określ interwał czasu, który zostanie zachowany przez deploymentScript zasób, a następnie wygaśnie i zostanie usunięty.

Uwaga

Nie zaleca się używania konta magazynu i wystąpienia kontenera, które są generowane przez usługę skryptu w innych celach. Te dwa zasoby można usunąć w zależności od cyklu życia skryptu.

Nie można usunąć automatycznie utworzonego konta magazynu i wystąpienia kontenera, jeśli skrypt wdrożenia został wdrożony w grupie zasobów z blokadą CanNotDelete. Aby rozwiązać ten problem, możesz wdrożyć skrypt wdrażania w innej grupie zasobów bez blokad. Zobacz Przykład 4 i Przykład 5 w przykładowych szablonach.

Uruchamianie skryptu więcej niż raz

Wykonanie skryptu wdrażania stanowi idempotentną operację. Jeśli żadna z deploymentScripts właściwości zasobu (w tym skrypt wbudowany) nie zostanie zmieniona, skrypt nie zostanie wykonany podczas ponownego wdrażania szablonu. Usługa skryptu wdrażania porównuje nazwy zasobów w szablonie z istniejącymi zasobami w tej samej grupie zasobów. Istnieją dwie opcje wielokrotnego wykonywania tego samego skryptu wdrażania:

  • Zmień nazwę deploymentScripts zasobu. Na przykład użyj funkcji szablonu utcNow jako nazwy zasobu lub jako części nazwy zasobu. Zmiana nazwy zasobu powoduje utworzenie nowego deploymentScripts zasobu. Dobrze jest zachować historię wykonywania skryptu.

    Uwaga

    Funkcja utcNow może być używana tylko w wartości domyślnej parametru.

  • Określ inną wartość we właściwości szablonu forceUpdateTag . Na przykład użyj utcNow jako wartości.

Uwaga

Napisz skrypty wdrażania, które są idempotentne. Gwarantuje to, że jeśli zostaną uruchomione ponownie przypadkowo, nie spowoduje to zmian systemu. Jeśli na przykład skrypt wdrażania jest używany do tworzenia zasobu platformy Azure, sprawdź, czy zasób nie istnieje przed jego utworzeniem, więc skrypt zakończy się powodzeniem lub nie utworzysz zasobu ponownie.

Konfigurowanie środowiska programowania

Możesz użyć wstępnie skonfigurowanego obrazu kontenera jako środowiska deweloperskiego skryptu wdrażania. Aby uzyskać więcej informacji, zobacz Konfigurowanie środowiska deweloperskiego dla skryptów wdrażania w szablonach.

Po pomyślnym przetestowaniu skryptu możesz użyć go jako skryptu wdrażania w szablonach.

Kody błędów skryptu wdrażania

Kod błędu opis
NieprawidłowaOperacjaSkryptuWdrażania Definicja zasobu skryptu wdrożenia w szablonie zawiera nieprawidłowe nazwy właściwości.
KonfliktZasobuSkrótuWdrożenia Nie można usunąć zasobu skryptu wdrożenia, który jest w stanie nieokreślonym, a wykonanie nie przekroczyło 1 godziny. Lub nie można ponownie uruchomić tego samego skryptu wdrożenia o tym samym identyfikatorze zasobu (tej samej subskrypcji, nazwie grupy zasobów i nazwie zasobu), ale w tym samym czasie innej zawartości treści skryptu.
Operacja skryptu wdrożeniowego nie powiodła się Operacja skryptu wdrażania nie powiodła się wewnętrznie. Skontaktuj się z pomocą techniczną firmy Microsoft.
Klucz dostępu do konta magazynowego Deployment Script nie został określony Klucz dostępu nie został określony dla istniejącego konta pamięci masowej.
GrupaKontenerówSkryptówDewojowychZawieraNiepoprawneKontenery Grupa kontenerów utworzona przez usługę skryptu wdrożenia została zmodyfikowana zewnętrznie i dodano nieprawidłowe kontenery.
KontenerScriptDeploymentGroupWStanieNiekońcowym Co najmniej dwa zasoby skryptu wdrożenia używają tej samej nazwy wystąpienia kontenera platformy Azure w tej samej grupie zasobów, a jedna z nich jeszcze nie zakończyła wykonywania.
Typ identyfikatora konta magazynu skryptów wdrożenia jest nieprawidłowy Istniejące konto magazynu typu BlobBlobStorage lub BlobStorage nie obsługuje udziałów plików i nie można go używać.
Nieprawidłowy rodzaj i SKU konta magazynu dla skryptu wdrażania Istniejące konto pamięci masowej nie obsługuje udziałów plików. Aby uzyskać listę obsługiwanych rodzajów kont magazynu, zobacz Używanie istniejącego konta magazynu.
KontoSkryptuWdrażaniaNieZnaleziona Konto magazynu nie istnieje lub zostało usunięte przez zewnętrzny proces lub narzędzie.
DeploymentScriptMagazynKontaZAktywnymPunktemKońcowymUsługi Określone konto magazynu ma punkt końcowy usługi. Konto magazynowe z punktem końcowym usługi nie jest obsługiwane.
Nieprawidłowy klucz dostępu dla konta pamięci skryptu wdrożenia Nieprawidłowy klucz dostępu określony dla istniejącego konta magazynu.
FormatKluczaDostępuKontenerSkryptuWdrożeniaJestNieprawidłowy Nieprawidłowy format klucza konta magazynu. Zobacz Zarządzanie kluczami dostępu do konta magazynu.
Skrypt wdrożenia przekroczył maksymalny dozwolony czas Czas wykonywania skryptu wdrożenia przekroczył wartość limitu czasu określoną w definicji zasobu skryptu wdrożenia.
NieprawidłoweWynikiSkryptuWdrażania Dane wyjściowe skryptu wdrażania nie są prawidłowym obiektem JSON.
Błąd logowania usługi DeploymentScriptContainerInstances Tożsamość zarządzana przypisana przez użytkownika nie mogła się zalogować po 10 próbach z 1-minutowym interwałem.
SkrzynkaKontenerówSkryptuWdrożeniaNieZnaleziona Grupa kontenerów utworzona przez usługę skryptu wdrażania została usunięta przez zewnętrzne narzędzie lub proces.
Awaria pobierania skryptu wdrożenia Nie można pobrać skryptu pomocniczego. Zobacz Używanie skryptu pomocniczego.
BłądSkryptuWdrażania Skrypt użytkownika zgłosił błąd.
Niepowodzenie wykonania skryptu uruchomieniowego skryptu wdrożenia Skrypt bootstrap wygenerował błąd. Skrypt bootstrap to skrypt systemowy, który organizuje wykonywanie skryptu wdrażania.
Błąd wykonania skryptu wdrożeniowego Nieznany błąd podczas wykonywania skryptu wdrażania.
Usługa instancji kontenerów Deployment Script jest niedostępna Podczas tworzenia wystąpienia kontenera platformy Azure (ACI) usługa ACI zwróciła błąd niedostępności usługi.
KontenerScriptDeploymentGroupWStanieNiekońcowym Podczas tworzenia wystąpienia kontenera platformy Azure (ACI) inny skrypt wdrażania używa tej samej nazwy ACI w tym samym zakresie (tej samej subskrypcji, nazwy grupy zasobów i nazwy zasobu).
NieprawidłowaNazwakGrupyKontenerówScenariuszaWdrożenia Określona nazwa wystąpienia kontenera platformy Azure nie spełnia wymagań ACI. Zobacz Rozwiązywanie typowych problemów w usłudze Azure Container Instances.

Używanie programu Microsoft Graph w skrycie wdrażania

Skrypt wdrażania może używać programu Microsoft Graph do tworzenia obiektów i pracy z obiektami w identyfikatorze Entra firmy Microsoft.

Polecenia

Korzystając ze skryptów wdrażania interfejsu wiersza polecenia platformy Azure, możesz użyć poleceń w az ad grupie poleceń do pracy z aplikacjami, jednostkami usługi, grupami i użytkownikami. Interfejsy API programu Microsoft Graph można również wywoływać bezpośrednio za pomocą az rest polecenia .

Jeśli używasz skryptów wdrażania programu Azure PowerShell, możesz użyć Invoke-RestMethod polecenia cmdlet , aby bezpośrednio wywołać interfejsy API programu Microsoft Graph.

Uprawnienia

Tożsamość używana przez skrypt wdrażania musi być autoryzowana do pracy z interfejsem API programu Microsoft Graph z odpowiednimi uprawnieniami do wykonywanych operacji. Musisz autoryzować tożsamość poza wdrożeniem szablonu, na przykład przez wstępnie utworzenie tożsamości zarządzanej przypisanej przez użytkownika i przypisanie jej roli aplikacji dla programu Microsoft Graph. Aby uzyskać więcej informacji, zobacz ten przykład z przewodnika Szybki start.

Uzyskiwanie dostępu do prywatnej sieci wirtualnej

W przypadku biblioteki Microsoft.Resources/deploymentScripts w wersji 2023-08-01 można uruchamiać skrypty wdrażania w sieciach prywatnych z dodatkowymi konfiguracjami.

  • Utwórz tożsamość zarządzaną przypisaną przez użytkownika i określ ją we identity właściwości . Aby przypisać tożsamość, zobacz Tożsamość.

  • Utwórz konto magazynu, ustawiając allowSharedKeyAccess na true, i określ skrypt wdrożenia, aby użyć istniejącego konta magazynu. Aby określić istniejące konto magazynu, zobacz Używanie istniejącego konta magazynu. Wymagana jest dodatkowa konfiguracja konta magazynowego.

    1. Otwórz konto magazynowe w portalu Azure.

    2. W menu po lewej stronie wybierz pozycję Kontrola dostępu (zarządzanie dostępem i tożsamościami), a następnie wybierz kartę Przypisania ról.

    3. Dodaj rolę Storage File Data Privileged Contributor do zarządzanej tożsamości przypisania użytkownika.

    4. W menu po lewej stronie w obszarze Zabezpieczenia i sieć wybierz pozycję Sieć, a następnie wybierz pozycję Zapory i sieci wirtualne.

    5. Wybierz pozycję Włączone z dostępnych wybranych sieci wirtualnych i adresów IP.

      Zrzut ekranu przedstawiający konfigurowanie konta przechowywania do dostępu do sieci prywatnej.

    6. W obszarze Sieci wirtualne dodaj podsieć. Na zrzucie ekranu podsieć nosi nazwę dspvnVnet.

    7. W obszarze Wyjątki wybierz pozycję Zezwalaj usługom platformy Azure z listy zaufanych usług na dostęp do tego konta przechowywania.

Poniższy szablon usługi ARM pokazuje, jak skonfigurować środowisko do uruchamiania skryptu wdrażania:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "prefix": {
      "type": "string",
      "maxLength": 10
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    },
    "userAssignedIdentityName": {
      "type": "string",
      "defaultValue": "[format('{0}Identity', parameters('prefix'))]"
    },
    "storageAccountName": {
      "type": "string",
      "defaultValue": "[format('{0}stg{1}', parameters('prefix'), uniqueString(resourceGroup().id))]"
    },
    "vnetName": {
      "type": "string",
      "defaultValue": "[format('{0}Vnet', parameters('prefix'))]"
    },
    "subnetName": {
      "type": "string",
      "defaultValue": "[format('{0}Subnet', parameters('prefix'))]"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Network/virtualNetworks",
      "apiVersion": "2023-09-01",
      "name": "[parameters('vnetName')]",
      "location": "[parameters('location')]",
      "properties": {
        "addressSpace": {
          "addressPrefixes": [
            "10.0.0.0/16"
          ]
        },
        "enableDdosProtection": false,
        "subnets": [
          {
            "name": "[parameters('subnetName')]",
            "properties": {
              "addressPrefix": "10.0.0.0/24",
              "serviceEndpoints": [
                {
                  "service": "Microsoft.Storage"
                }
              ],
              "delegations": [
                {
                  "name": "Microsoft.ContainerInstance.containerGroups",
                  "properties": {
                    "serviceName": "Microsoft.ContainerInstance/containerGroups"
                  }
                }
              ]
            }
          }
        ]
      }
    },
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2023-01-01",
      "name": "[parameters('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "StorageV2",
      "properties": {
        "networkAcls": {
          "bypass": "AzureServices",
          "virtualNetworkRules": [
            {
              "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('vnetName'), parameters('subnetName'))]",
              "action": "Allow",
              "state": "Succeeded"
            }
          ],
          "defaultAction": "Deny"
        },
        "allowSharedKeyAccess": true
      },
      "dependsOn": [
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('vnetName'))]"
      ]
    },
    {
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
      "apiVersion": "2023-07-31-preview",
      "name": "[parameters('userAssignedIdentityName')]",
      "location": "[parameters('location')]"
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Storage/storageAccounts/{0}', parameters('storageAccountName'))]",
      "name": "[guid(tenantResourceId('Microsoft.Authorization/roleDefinitions', '69566ab7-960f-475b-8e7c-b3118f30c6bd'), resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userAssignedIdentityName')), resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')))]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userAssignedIdentityName')), '2023-07-31-preview').principalId]",
        "roleDefinitionId": "[tenantResourceId('Microsoft.Authorization/roleDefinitions', '69566ab7-960f-475b-8e7c-b3118f30c6bd')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userAssignedIdentityName'))]"
      ]
    }
  ]
}

Do przetestowania wdrożenia można użyć następującego szablonu usługi ARM:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "prefix": {
      "type": "string"
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    },
    "utcValue": {
      "type": "string",
      "defaultValue": "[utcNow()]"
    },
    "storageAccountName": {
      "type": "string"
    },
    "vnetName": {
      "type": "string"
    },
    "subnetName": {
      "type": "string"
    },
    "userAssignedIdentityName": {
      "type": "string"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2023-08-01",
      "name": "[format('{0}DS', parameters('prefix'))]",
      "location": "[parameters('location')]",
      "identity": {
        "type": "userAssigned",
        "userAssignedIdentities": {
          "[format('{0}', resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userAssignedIdentityName')))]": {}
        }
      },
      "kind": "AzureCLI",
      "properties": {
        "forceUpdateTag": "[parameters('utcValue')]",
        "azCliVersion": "2.47.0",
        "storageAccountSettings": {
          "storageAccountName": "[parameters('storageAccountName')]"
        },
        "containerSettings": {
          "subnetIds": [
            {
              "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('vnetName'), parameters('subnetName'))]"
            }
          ]
        },
        "scriptContent": "echo \"Hello world!\"",
        "retentionInterval": "P1D",
        "cleanupPreference": "OnExpiration"
      }
    }
  ]
}

Następne kroki

W tym artykule przedstawiono sposób używania skryptów wdrażania. Aby przejść przez samouczek dotyczący skryptu wdrażania: