Co jsou skripty nasazení?
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
prodeploymentScripts
prostředek. - Hodnoty
type
aapiVersion
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ě deploymentScripts
hodnoty specifické pro:
kind
: Typ skriptu, který se má spustit (neboAzurePowerShell
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.