Co to są skrypty wdrażania?

Ukończone

W tej lekcji dowiesz się, jak deploymentScripts zasób może rozszerzać szablony usługi Azure Resource Manager (ARM).

Szablony usługi ARM to wspaniałe rzeczy. Można ich używać do deklarowania żądanego stanu infrastruktury chmury i pozwolić interfejsom API i usługom ustalić, jak się tam dostać. Jednak czasami trzeba wykonywać akcje spoza usługi Azure Resource Manager.

Co to są skrypty wdrażania?

deploymentScripts zasoby to skrypty programu PowerShell lub powłoki Bash uruchamiane w kontenerze platformy Docker w ramach wdrożenia szablonu. Domyślne obrazy kontenerów mają dostępny interfejs wiersza polecenia platformy Azure lub program Azure PowerShell. Te skrypty są uruchamiane podczas przetwarzania szablonu usługi ARM, dzięki czemu można dodać niestandardowe zachowanie do procesu wdrażania.

Skrypty wdrażania używają tożsamości zarządzanej do uwierzytelniania na platformie Azure. Tożsamość zarządzana to jednostka usługi, której poświadczenia i cykl życia są zarządzane przez platformę Azure. Ta tożsamość służy do wykonywania działań w środowisku za pomocą poleceń programu Azure PowerShell lub interfejsu wiersza polecenia platformy Azure. Ponieważ przypisujesz tożsamość, możesz kontrolować zakres tego, co może mieć wpływ na deploymentScripts zasób.

Zasób deploymentScripts generuje dane wyjściowe, których mogą używać inne zasoby we wdrożeniu. Następnie możesz wyszukać informacje z systemu zewnętrznego lub podać dane na podstawie bieżącego stanu środowiska, aby wpłynąć na resztę wdrożenia.

Jak działają skrypty wdrażania

Zasób deploymentScripts pobiera skrypt dostarczony przez użytkownika (z szablonu lub za pomocą identyfikatora URI) i prawdopodobnie niektóre skrypty pomocnicze i uruchamia je w wystąpieniu kontenera platformy Azure. To wystąpienie kontenera ma przypisaną tożsamość zarządzaną, którą podajesz. Skrypty i ich dane wyjściowe są przechowywane w udziale plików dla konta usługi Azure Storage.

Po uruchomieniu wdrożenia szablonu sprawdza, czy istnieje istniejący deploymentScripts zasób w docelowej grupie zasobów. Jeśli tak, porównuje właściwości. Jeśli wszystko jest zgodne, nic nowego się nie dzieje. Jeśli zasób nie istnieje lub został zmieniony, usługa Azure Resource Manager tworzy nowe wystąpienie kontenera i uruchamia skrypty wdrażania wewnątrz tego wystąpienia kontenera. Wszystkie zdefiniowane dane wyjściowe zostaną przekazane z powrotem do usługi Azure Resource Manager do późniejszego użycia we wdrożeniu.

Struktura skryptu wdrażania

Aby dodać zachowanie niestandardowe do szablonu usługi ARM, zacznij od deploymentScripts zasobu. Musisz podać co najmniej typowe szczegóły, takie jak:

  • A name dla deploymentScripts zasobu.
  • Wartości type i apiVersion .
  • Lokalizacja (location wartość), w której zostaną utworzone zasoby pomocnicze.
  • Pusty properties obiekt. Wkrótce do tego dowiesz się.

Wymagane są dwie deploymentScriptswartości specyficzne dla:

  • kind: typ skryptu do uruchomienia ( AzurePowerShell lub AzureCLI).

    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "myFirstDeploymentScript",
      "location": "[resourceGroup().location]",
      "kind": "AzurePowerShell",
      "identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/deploymenttest/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myscriptingid": {}
        }
      }
    }
    
    resource myFirstDeploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = {
      name: 'myFirstDeploymentScript'
      location: resourceGroup().location
      kind: 'AzurePowerShell'
      identity: {
        type: 'UserAssigned'
        userAssignedIdentities: {
          '/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/deploymenttest/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myscriptingid': {}
        }
      }
    }
    
  • identity: tożsamość zarządzana używana przez wystąpienie kontenera. Tożsamość zarządzaną można utworzyć z wyprzedzeniem i określić ją jak w poniższym przykładzie lub utworzyć ją w szablonie i odwołać się do niej (co zrobisz w następnym ćwiczeniu).

    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "myFirstDeploymentScript",
      "location": "[resourceGroup().location]",
      "kind": "AzurePowerShell",
      "identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/deploymenttest/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myscriptingid": {}
        }
      }
    }
    
    resource myFirstDeploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = {
      name: 'myFirstDeploymentScript'
      location: resourceGroup().location
      kind: 'AzurePowerShell'
      identity: {
        type: 'UserAssigned'
        userAssignedIdentities: {
          '/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/deploymenttest/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myscriptingid': {}
        }
      }
    }
    

Po ustawieniu tych elementów możesz przejść do properties sekcji deploymentScripts zasobu. Główną częścią tego jest scriptContent, który określa rzeczywisty skrypt do wykonania:

"properties": {
  "scriptContent": "
      $output = 'Hello Learner!'
      Write-Output $output
      $DeploymentScriptOutputs = @{}
      $DeploymentScriptOutputs['text'] = $output
  ",
}
properties: {
  scriptContent: '''
    $output = 'Hello Learner!'
    Write-Output $output
    $DeploymentScriptOutputs = @{}
    $DeploymentScriptOutputs['text'] = $output
  '''
}

Zwróć uwagę, że obiekt scriptContent używa ciągu wielowierszowego. W Bicep można określić ciąg wielowierszowy, używając trzech cudzysłowów (''') przed i po ciągu.

Skrypt wdrożenia często przekazuje dane wyjściowe z powrotem do wdrożenia. Jeśli na przykład używasz skryptu do wyszukiwania niektórych informacji z interfejsu API, możesz przekazać informacje z powrotem do wdrożenia jako dane wyjściowe. Inne zasoby we wdrożeniu mogą następnie używać informacji we własnych definicjach.

W przypadku skryptu programu PowerShell przekazujesz dane wyjściowe z powrotem, tworząc zmienną o nazwie $DeploymentScriptOutputs, która musi być tabelą skrótów. Przykładowy skrypt inicjuje tabelę skrótów, a następnie tworzy dane wyjściowe o nazwie text, która pobiera jego wartość ze zmiennej $output lokalnej:

$output = 'Hello Learner!'
Write-Output $output
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['text'] = $output
$output = 'Hello Learner!'
Write-Output $output
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['text'] = $output

Napiwek

Skrypty wdrażania można również napisać w powłoce Bash. Aby utworzyć dane wyjściowe na podstawie skryptu powłoki Bash, należy utworzyć plik JSON w lokalizacji określonej przez zmienną AZ_SCRIPTS_OUTPUT_PATH środowiskową.

W sekcji zdefiniujesz properties również różne opcje, które deploymentScripts można wykonać. W tym module zachowamy prostotę i dodamy tylko tyle, aby skrypt został uruchomiony. Co najmniej musisz podać wersję programu Azure PowerShell lub interfejsu wiersza polecenia platformy Azure do użycia, skrypt do uruchomienia i interwał przechowywania.

Interwał przechowywania to czas przechowywania wyników, jeśli chcesz zachować zasoby. Domyślnie wyniki są usuwane po uruchomieniu skryptu.

"properties": {
  "azPowerShellVersion": "3.0",
  "scriptContent": "
      $output = 'Hello Learner!'
      Write-Output $output
      $DeploymentScriptOutputs = @{}
      $DeploymentScriptOutputs['text'] = $output
  ",
  "retentionInterval": "P1D"
}
properties: {
  azPowerShellVersion: '3.0'
  scriptContent: '''
    $output = 'Hello Learner!'
    Write-Output $output
    $DeploymentScriptOutputs = @{}
    $DeploymentScriptOutputs['text'] = $output
  '''
  retentionInterval: 'P1D'
}

Nasz pełny szablon wygląda następująco:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.1",
  "apiProfile": "",
  "parameters": {},
  "variables": {},
  "functions": [],
  "resources": [
    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "myFirstDeploymentScript",
      "location": "[resourceGroup().location]",
      "kind": "AzurePowerShell",
      "identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/deploymenttest/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myscriptingid": {}
        }
      },
      "properties": {
        "azPowerShellVersion": "3.0",
        "scriptContent": "
            $output = 'Hello Learner!'
            Write-Output $output
            $DeploymentScriptOutputs = @{}
            $DeploymentScriptOutputs['text'] = $output
        ",
        "retentionInterval": "P1D"
      }
    }
  ],
  "outputs": {
    "scriptResult": {
      "type": "string",
      "value": "[reference('myFirstDeploymentScript').outputs.text]"
    }
  }
}
resource myFirstDeploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = {
  name: 'myFirstDeploymentScript'
  location: resourceGroup().location
  kind: 'AzurePowerShell'
  identity: {
    type: 'UserAssigned'
    userAssignedIdentities: {
      '/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/deploymenttest/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myscriptingid': {}
    }
  }
  properties: {
    azPowerShellVersion: '3.0'
    scriptContent: '''
      $output = 'Hello Learner!'
      Write-Output $output
      $DeploymentScriptOutputs = @{}
      $DeploymentScriptOutputs['text'] = $output
    '''
    retentionInterval: 'P1D'
  }
}

output scriptResult string = myFirstDeploymentScript.properties.outputs.text

Dołączanie plików skryptów

Osadzanie skryptów wbudowanych w szablonach może być kłopotliwe, trudne do odczytania i zrozumienia oraz trudne do zmiany. Bicep używa funkcji do osadzania loadTextContent() zewnętrznego pliku tekstowego we wdrożeniu. Gdy kod Bicep transpiluje szablon w formacie JSON, osadza plik zewnętrzny w szablonie, który emituje.

Załóżmy, że masz plik programu PowerShell o nazwie myscript.ps1 w tym samym folderze co szablon Bicep. Możesz powiedzieć Bicep, aby osadzić plik w następujący sposób:

properties: {
  azPowerShellVersion: '3.0'
  scriptContent: loadTextContent('myscript.ps1')
  retentionInterval: 'P1D'
}

Wszystkie właściwości deploymentScripts zasobu można znaleźć w dokumentacji referencyjnej szablonu usługi ARM.