Co jsou skripty nasazení?

Dokončeno

V této lekci se dozvíte, jak deploymentScripts může prostředek rozšířit šablony Azure Resource Manageru (ARM).

Šablony ARM jsou úžasné věci. Můžete je použít k deklarování požadovaného stavu cloudové infrastruktury a nechat rozhraní API a služby zjistit, jak se tam dostat. Občas ale potřebujete provádět akce, které jsou mimo to, co Azure Resource Manager poskytuje.

Co jsou skripty nasazení?

deploymentScripts prostředky jsou skripty PowerShellu nebo Bash, které se spouští v kontejneru Dockeru jako součást nasazení šablony. Výchozí image kontejnerů mají k dispozici Azure CLI nebo Azure PowerShell. Tyto skripty se spouští během zpracování šablony ARM, takže můžete do procesu nasazení přidat vlastní chování.

Skripty nasazení používají spravovanou identitu k ověřování v Azure. Spravovaná identita je instanční objekt, jehož přihlašovací údaje a životní cyklus spravuje platforma Azure. Tato identita je to, co příkazy Azure PowerShellu nebo Azure CLI použijí k tomu, aby fungovaly s prostředím. Vzhledem k tomu, že identitu přiřadíte, řídíte rozsah toho, co deploymentScripts může prostředek ovlivnit.

Prostředek deploymentScripts vytvoří výstup, který můžou použít jiné prostředky v nasazení. Potom můžete vyhledat informace z externího systému nebo zadat data na základě aktuálního stavu vašeho prostředí, abyste ovlivnili zbytek nasazení.

Jak fungují skripty nasazení

Prostředek deploymentScripts přebírá skript poskytovaný uživatelem (buď ze šablony, nebo pomocí identifikátoru URI), případně některé podpůrné skripty a spouští je v instanci kontejneru Azure. Tato instance kontejneru má přiřazenou spravovanou identitu, kterou zadáte. Skripty a jejich výstup jsou uložené ve sdílené složce pro účet úložiště Azure.

Když se nasazení šablony spustí, zkontroluje, jestli v cílové skupině prostředků existuje existující deploymentScripts prostředek. Pokud ano, porovná vlastnosti. Pokud se všechno shoduje, nic nového se nestane. Pokud prostředek neexistuje nebo byl změněn, Azure Resource Manager vytvoří novou instanci kontejneru a spustí skripty nasazení uvnitř této instance kontejneru. Jakýkoli definovaný výstup se předá zpět do Azure Resource Manageru pro pozdější použití v nasazení.

Struktura skriptu nasazení

Pokud chcete do šablony ARM přidat vlastní chování, začněte s prostředkem deploymentScripts . Minimálně je potřeba zadat běžné podrobnosti, jako jsou:

  • A name pro deploymentScripts prostředek.
  • Hodnoty type a apiVersion hodnoty.
  • Umístění (location hodnota), kde budou vytvořeny podpůrné prostředky.
  • Prázdný properties objekt. Za chvíli se k tomu dostaneš.

Jsou vyžadovány dvě deploymentScriptshodnoty specifické pro:

  • kind: Typ skriptu, který se má spustit (nebo AzurePowerShell 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: Spravovaná identita, kterou bude instance kontejneru používat. Spravovanou identitu můžete vytvořit předem a zadat ji jako v následujícím příkladu, nebo ji můžete vytvořit v šabloně a odkazovat na ni (to uděláte v dalším cvičení).

    {
      "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 nastavení těchto prvků můžete přejít do properties části deploymentScripts prostředku. Hlavní částí tohoto je scriptContent, který určuje skutečný skript, který se má provést:

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

Všimněte si, že scriptContent používá víceřádkový řetězec. V bicep můžete zadat víceřádkový řetězec pomocí tří uvozovek (''') před a za řetězcem.

Skript nasazení obvykle předává výstupy zpět do nasazení. Pokud například k vyhledání některých informací z rozhraní API používáte skript, můžete informace předat zpět do nasazení jako výstup. Další prostředky v nasazení by pak mohly použít informace ve svých vlastních definicích.

Pro skript PowerShellu předáte výstupy zpět vytvořením proměnné s názvem $DeploymentScriptOutputs, která musí být hashovací tabulka. Ukázkový skript inicializuje tabulku hash a pak vytvoří výstup s názvem text, který převezme jeho hodnotu z $output místní proměnné:

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

Tip

Můžete také psát skripty nasazení v Bash. Pokud chcete vytvořit výstupy ze skriptu Bash, musíte vytvořit soubor JSON v umístění určeném AZ_SCRIPTS_OUTPUT_PATH proměnnou prostředí.

properties V této části také definujete různé možnosti, které deploymentScripts se dají provést. V tomto modulu si necháme jednoduché a přidáme dostatek k tomu, aby se skript spustil. Minimálně musíte zadat verzi Azure PowerShellu nebo Azure CLI, která se má použít, skript ke spuštění a interval uchovávání informací.

Interval uchovávání informací určuje, jak dlouho se mají výsledky uchovávat, pokud chcete zachovat prostředky. Ve výchozím nastavení se výsledky po spuštění skriptu odeberou.

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

Naše úplná šablona by vypadala nějak takto:

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

Zahrnout soubory skriptů

Vkládání skriptů vložených do šablon může být těžko čitelné, obtížně čitelné a srozumitelné a obtížně se mění. Bicep použije loadTextContent() funkci k vložení externího textového souboru do nasazení. Když Bicep transpiluje šablonu do formátu JSON, vloží externí soubor do šablony, která generuje.

Řekněme, že máte soubor PowerShellu s názvem myscript.ps1 ve stejné složce jako vaše šablona Bicep. Bicep vám dá říct, aby soubor vložil takto:

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

Všechny vlastnosti deploymentScripts prostředku najdete v referenční dokumentaci k šabloně ARM.