Co to są skrypty wdrażania?
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
dladeploymentScripts
zasobu. - Wartości
type
iapiVersion
. - Lokalizacja (
location
wartość), w której zostaną utworzone zasoby pomocnicze. - Pusty
properties
obiekt. Wkrótce do tego dowiesz się.
Wymagane są dwie deploymentScripts
wartości specyficzne dla:
kind
: typ skryptu do uruchomienia (AzurePowerShell
lubAzureCLI
).{ "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.