Ćwiczenie — dodawanie parametrów do skryptów wdrażania
Teraz, gdy użyto skryptu wdrażania do migracji ręcznej pracy do szablonu usługi Azure Resource Manager (ARM), inny zespół aplikacji partnerskich w organizacji poprosił o pomoc.
Proces zespołu ma podobne wymagania, ale zespół musi wdrożyć wiele plików na koncie magazynu. Zespół ma skrypt programu PowerShell, który może pobrać listę plików jako parametr i przekazać je, podobnie jak skrypt, który był już używany w szablonie.
W tym ćwiczeniu użyjesz poprzedniego szablonu jako punktu początkowego i zaktualizujesz skrypt programu PowerShell, aby użyć go z zespołu partnerskiego. Następnie dodasz sposób włączenia osoby wdrażającej szablon w celu określenia plików konfiguracji do wdrożenia (co najmniej jednego).
Podczas tego procesu wykonasz następujące czynności:
- Zaktualizuj skrypt wdrażania.
- Dodaj zmienną środowiskową i parametr szablonu i przekaż je do skryptu wdrożenia.
- Dodaj dane wyjściowe do skryptu wdrażania.
- Dodaj plik parametrów.
- Wdróż szablon i zweryfikuj wynik.
Tworzenie szablonu początkowego
Zaczynasz od szablonu utworzonego w ostatnim ćwiczeniu.
Otwórz program Visual Studio Code i utwórz nowy plik o nazwie azuredeploy.json.
Skopiuj poniższy szablon początkowy do azuredeploy.json.
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.1", "apiProfile": "", "parameters": {}, "variables": { "storageAccountName": "[concat('storage', uniqueString(resourceGroup().id))]", "storageBlobContainerName": "config", "userAssignedIdentityName": "configDeployer", "roleAssignmentName": "[guid(concat(resourceGroup().id, 'contributor'))]", "contributorRoleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]", "deploymentScriptName": "CopyConfigScript" }, "functions": [], "resources": [ { "name": "[variables('storageAccountName')]", "type": "Microsoft.Storage/storageAccounts", "apiVersion": "2023-01-01", "tags": { "displayName": "[variables('storageAccountName')]" }, "location": "[resourceGroup().location]", "kind": "StorageV2", "sku": { "name": "Standard_LRS", "tier": "Standard" }, "properties": { "allowBlobPublicAccess": true, "encryption": { "services": { "blob": { "enabled": true } }, "keySource": "Microsoft.Storage" }, "supportsHttpsTrafficOnly": true } }, { "type": "Microsoft.Storage/storageAccounts/blobServices", "apiVersion": "2019-04-01", "name": "[concat(variables('storageAccountName'), '/default')]", "dependsOn": [ "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]" ] }, { "type": "Microsoft.Storage/storageAccounts/blobServices/containers", "apiVersion": "2019-04-01", "name": "[concat(variables('storageAccountName'),'/default/',variables('storageBlobContainerName'))]", "dependsOn": [ "[resourceId('Microsoft.Storage/storageAccounts/blobServices', variables('storageAccountName'), 'default')]", "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]" ], "properties": { "publicAccess": "Blob" } }, { "type": "Microsoft.ManagedIdentity/userAssignedIdentities", "apiVersion": "2018-11-30", "name": "[variables('userAssignedIdentityName')]", "location": "[resourceGroup().location]" }, { "type": "Microsoft.Authorization/roleAssignments", "apiVersion": "2020-04-01-preview", "name": "[variables('roleAssignmentName')]", "dependsOn": [ "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName'))]" ], "properties": { "roleDefinitionId": "[variables('contributorRoleDefinitionId')]", "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName')), '2015-08-31-preview').principalId]", "scope": "[resourceGroup().id]", "principalType": "ServicePrincipal" } }, { "type": "Microsoft.Resources/deploymentScripts", "apiVersion": "2020-10-01", "name": "[variables('deploymentScriptName')]", "location": "[resourceGroup().location]", "kind": "AzurePowerShell", "dependsOn": [ "[resourceId('Microsoft.Authorization/roleAssignments', variables('roleAssignmentName'))]", "[resourceId('Microsoft.Storage/storageAccounts/blobServices/containers', variables('storageAccountName'), 'default', variables('storageBlobContainerName'))]" ], "identity": { "type": "UserAssigned", "userAssignedIdentities": { "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities',variables('userAssignedIdentityName'))]": {} } }, "properties": { "azPowerShellVersion": "3.0", "scriptContent": " Invoke-RestMethod -Uri 'https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/appsettings.json' -OutFile 'appsettings.json' $storageAccount = Get-AzStorageAccount -ResourceGroupName 'learndeploymentscript_exercise_1' | Where-Object { $_.StorageAccountName -like 'storage*' } $blob = Set-AzStorageBlobContent -File 'appsettings.json' -Container 'config' -Blob 'appsettings.json' -Context $StorageAccount.Context $DeploymentScriptOutputs = @{} $DeploymentScriptOutputs['Uri'] = $blob.ICloudBlob.Uri $DeploymentScriptOutputs['StorageUri'] = $blob.ICloudBlob.StorageUri ", "retentionInterval": "P1D" } } ], "outputs": { "fileUri": { "type": "string", "value": "[reference(variables('deploymentScriptName')).outputs.Uri]" } } }
Zapisz szablon.
Otwórz program Visual Studio Code i utwórz nowy plik o nazwie main.bicep.
Skopiuj poniższy szablon początkowy do pliku main.bicep.
var storageAccountName = 'storage${uniqueString(resourceGroup().id)}' var storageBlobContainerName = 'config' var userAssignedIdentityName = 'configDeployer' var roleAssignmentName = guid(resourceGroup().id, 'contributor') var contributorRoleDefinitionId = resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c') var deploymentScriptName = 'CopyConfigScript' resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = { name: storageAccountName tags: { displayName: storageAccountName } location: resourceGroup().location kind: 'StorageV2' sku: { name: 'Standard_LRS' tier: 'Standard' } properties: { allowBlobPublicAccess: true encryption: { services: { blob: { enabled: true } } keySource: 'Microsoft.Storage' } supportsHttpsTrafficOnly: true } resource blobService 'blobServices' existing = { name: 'default' } } resource blobContainer 'Microsoft.Storage/storageAccounts/blobServices/containers@2019-04-01' = { parent: storageAccount::blobService name: storageBlobContainerName properties: { publicAccess: 'Blob' } } resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' = { name: userAssignedIdentityName location: resourceGroup().location } resource roleAssignment 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = { name: roleAssignmentName properties: { roleDefinitionId: contributorRoleDefinitionId principalId: userAssignedIdentity.properties.principalId principalType: 'ServicePrincipal' } } resource deploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = { name: deploymentScriptName location: resourceGroup().location kind: 'AzurePowerShell' identity: { type: 'UserAssigned' userAssignedIdentities: { '${userAssignedIdentity.id}': {} } } properties: { azPowerShellVersion: '3.0' scriptContent: ''' Invoke-RestMethod -Uri 'https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/appsettings.json' -OutFile 'appsettings.json' $storageAccount = Get-AzStorageAccount -ResourceGroupName 'learndeploymentscript_exercise_1' | Where-Object { $_.StorageAccountName -like 'storage*' } $blob = Set-AzStorageBlobContent -File 'appsettings.json' -Container 'config' -Blob 'appsettings.json' -Context $storageAccount.Context $DeploymentScriptOutputs = @{} $DeploymentScriptOutputs['Uri'] = $blob.ICloudBlob.Uri $DeploymentScriptOutputs['StorageUri'] = $blob.ICloudBlob.StorageUri ''' retentionInterval: 'P1D' } dependsOn: [ roleAssignment blobContainer ] } output fileUri string = deploymentScript.properties.outputs.Uri
Zapisz szablon.
Aktualizowanie skryptu programu PowerShell
Ponieważ drugi zespół wykonał ciężką pracę podczas tworzenia skryptu programu PowerShell w celu skopiowania wielu plików, decydujesz się na użycie tego skryptu w szablonie.
Edytuj scriptContent
w sekcji , properties
aby uwzględnić skrypt udostępniony przez zespół partnerski.
param([string]$File)
$fileList = $File -replace '(\[|\])' -split ',' | ForEach-Object { $_.trim() }
$storageAccount = Get-AzStorageAccount -ResourceGroupName $env:ResourceGroupName -Name $env:StorageAccountName -Verbose
$count = 0
$DeploymentScriptOutputs = @{}
foreach ($fileName in $fileList) {
Write-Host \"Copying $fileName to $env:StorageContainerName in $env:StorageAccountName.\"
Invoke-RestMethod -Uri \"https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/$fileName\" -OutFile $fileName
$blob = Set-AzStorageBlobContent -File $fileName -Container $env:StorageContainerName -Blob $fileName -Context $storageAccount.Context
$DeploymentScriptOutputs[$fileName] = @{}
$DeploymentScriptOutputs[$fileName]['Uri'] = $blob.ICloudBlob.Uri
$DeploymentScriptOutputs[$fileName]['StorageUri'] =$blob.ICloudBlob.StorageUri
$count++
}
Write-Host \"Finished copying $count files.\"
param([string]$File)
$fileList = $File -replace '(\[|\])' -split ',' | ForEach-Object { $_.trim() }
$storageAccount = Get-AzStorageAccount -ResourceGroupName $env:ResourceGroupName -Name $env:StorageAccountName -Verbose
$count = 0
$DeploymentScriptOutputs = @{}
foreach ($fileName in $fileList) {
Write-Host "Copying $fileName to $env:StorageContainerName in $env:StorageAccountName."
Invoke-RestMethod -Uri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/$fileName" -OutFile $fileName
$blob = Set-AzStorageBlobContent -File $fileName -Container $env:StorageContainerName -Blob $fileName -Context $storageAccount.Context
$DeploymentScriptOutputs[$fileName] = @{}
$DeploymentScriptOutputs[$fileName]['Uri'] = $blob.ICloudBlob.Uri
$DeploymentScriptOutputs[$fileName]['StorageUri'] = $blob.ICloudBlob.StorageUri
$count++
}
Write-Host "Finished copying $count files."
Dodawanie zmiennej środowiskowej
Przyjęty skrypt wymaga pewnych zmiennych środowiskowych. Można je określić bezpośrednio w szablonie, ale bardziej elastyczne będzie użycie funkcji szablonu w celu uzyskania niektórych wartości.
environmentVariables
Dodaj właściwość doproperties
sekcji skryptu wdrażania."environmentVariables": [ ],
Dodaj zmienną środowiskową dla
ResourceGroupName
elementu ."environmentVariables": [ { "name": "ResourceGroupName", "value": "[resourceGroup().name]" } ],
Dodaj zmienną środowiskową dla
StorageAccountName
elementu ."environmentVariables": [ { "name": "ResourceGroupName", "value": "[resourceGroup().name]" }, { "name": "StorageAccountName", "value": "[variables('storageAccountName')]" } ],
Dodaj zmienną środowiskową dla
StorageContainerName
elementu ."environmentVariables": [ { "name": "ResourceGroupName", "value": "[resourceGroup().name]" }, { "name": "StorageAccountName", "value": "[variables('storageAccountName')]" }, { "name": "StorageContainerName", "value": "[variables('storageBlobContainerName')]" } ],
Napiwek
Użyj funkcji szablonu, aby uzyskać dostęp do typowych wartości, takich jak [resourceGroup().name]
i [variables()]
.
Przyjęty skrypt wymaga pewnych zmiennych środowiskowych. Można je określić bezpośrednio w szablonie, ale bardziej elastyczne będzie użycie zmiennych Bicep w celu uzyskania niektórych wartości.
environmentVariables
Dodaj właściwość doproperties
sekcji skryptu wdrażania.environmentVariables: [ ]
Dodaj zmienną środowiskową dla
ResourceGroupName
elementu .environmentVariables: [ { name: 'ResourceGroupName' value: resourceGroup().name } ]
Dodaj zmienną środowiskową dla
StorageAccountName
elementu .environmentVariables: [ { name: 'ResourceGroupName' value: resourceGroup().name } { name: 'StorageAccountName' value: storageAccountName } ]
Dodaj zmienną środowiskową dla
StorageContainerName
elementu .environmentVariables: [ { name: 'ResourceGroupName' value: resourceGroup().name } { name: 'StorageAccountName' value: storageAccountName } { name: 'StorageContainerName' value: storageBlobContainerName } ]
Dodawanie parametru szablonu
Aby ułatwić korzystanie z szablonu dwóm zespołom, możesz dodać parametr do szablonu, aby każdy zespół mógł określić pliki, które mają zostać skopiowane.
Dodaj parametr do szablonu, aby pobrać tablicę nazw plików.
"parameters": {
"filesToCopy": {
"type": "array",
"metadata": {
"description": "List of files to copy to application storage account."
}
}
},
Jako bonus możesz podać wartość domyślną, aby szablon nadal działał dla zespołu bez zmian w procesie wdrażania. Mimo że nie jest to wymagane, wprowadzenie nowej wartości domyślnej może pomóc zrozumieć wzorzec ułatwiania zespołom wdrażania nowych wersji szablonów, jeśli nadal zachowują się tak jak wcześniej, a nowa funkcja jest nagrodą. Innymi słowy, ten krok pokazuje, jak zachować istniejące zachowanie podczas wprowadzania zmian w celu obsługi przyszłej pracy.
Dodaj parametr do szablonu, aby pobrać tablicę nazw plików.
@description('List of files to copy to application storage account.')
param filesToCopy array
Jako bonus możesz podać wartość domyślną, aby szablon nadal działał dla zespołu bez zmian w procesie wdrażania. Mimo że nie jest to wymagane, wprowadzenie nowej wartości domyślnej może pomóc zrozumieć wzorzec ułatwiania zespołom wdrażania nowych wersji szablonów, jeśli nadal zachowują się tak jak wcześniej, a nowa funkcja jest nagrodą. Innymi słowy, ten krok pokazuje, jak zachować istniejące zachowanie podczas wprowadzania zmian w celu obsługi przyszłej pracy.
Dodawanie argumentu w celu przekazania plików w celu skopiowania
Następnie możesz pobrać właśnie zdefiniowany parametr i przekazać go do skryptu wdrażania. Przekazywanie argumentów wiersza polecenia może być trudne, ponieważ ciągi są oceniane na wielu poziomach. Prawidłowe ucieczki cudzysłowów i wybieranie odpowiednich cudzysłowów dla zadania są niezbędne dla sukcesu.
Napiwek
Użyj funkcji szablonu, aby uzyskać dostęp do typowych funkcji, takich jak [string()]
konwertowanie wartości jednego typu na ciąg.
arguments
Dodaj właściwość do skryptu wdrażania. Skrypt programu PowerShell przyjmuje parametr o nazwieFile
, który jest ciągiem nazw plików, które powinny pochodzić z parametru szablonufilesToCopy
. Upewnij się, że istnieją cudzysłowy wokół całego argumentu, aby został prawidłowo przekazany.Uwaga
Ta
arguments
właściwość jest nieprawidłowa. Jeśli używasz rozszerzenia usługi Azure Resource Manager w programie Visual Studio Code, może to oznaczać flagę tego wiersza. Ten problem zostanie rozwiązany w następnych krokach."arguments": "[concat( '-File '', string(parameters('filesToCopy')), ''' )]",
Napiwek
Cytowanie elementów w formacie JSON może być trudne, zwłaszcza w przypadku przekazywania argumentów wiersza polecenia. Możesz użyć zmiennej szablonu, aby reprezentować znak, który jest trudny do ucieczki.
Dodaj zmienną szablonu, aby reprezentować znak pojedynczego cudzysłowu.
"variables": { "singleQuote": "'", "storageAccountName": "[concat('storage', uniqueString(resourceGroup().id))]", "storageBlobContainerName": "config", "userAssignedIdentityName": "configDeployer", "roleAssignmentName": "[guid(concat(resourceGroup().id, 'contributor'))]", "contributorRoleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]", "deploymentScriptName": "CopyConfigScript" },
Zastąp apostrofy we
arguments
właściwości zmienną, która została właśnie zdefiniowana."arguments": "[concat( '-File ', variables('singleQuote'), string(parameters('filesToCopy')), variables('singleQuote'))]",
Następnie możesz pobrać właśnie zdefiniowany parametr i przekazać go do skryptu wdrażania. Przekazywanie argumentów wiersza polecenia może być trudne, ponieważ ciągi są oceniane na wielu poziomach. Prawidłowe ucieczki cudzysłowów i wybieranie odpowiednich cudzysłowów dla zadania są niezbędne dla sukcesu.
arguments
Dodaj właściwość do skryptu wdrażania. Skrypt programu PowerShell przyjmuje parametr o nazwie File
, który jest ciągiem nazw plików, które powinny pochodzić z parametru szablonu filesToCopy
.
arguments: '-File \'${string(filesToCopy)}\''
Zwróć uwagę, że jest używanych kilka funkcji Bicep:
- Interpolacja ciągów w celu połączenia ciągów.
- Używamy
\
znaku ucieczki, aby umożliwić nam dołączenie pojedynczego znaku cudzysłowu ('
) wewnątrz ciągu, ponieważ pojedynczy cudzysłów jest zwykle znakiem zastrzeżonym w Bicep. - Używamy
string()
funkcji , aby przekonwertować tablicęfilesToCopy
na ciąg.
Aktualizowanie danych wyjściowych szablonu
Ponieważ zmieniasz skrypt wdrażania w celu wdrożenia co najmniej jednego pliku, musisz zaktualizować dane wyjściowe szablonu, aby podać wszystkie niezbędne informacje.
outputs
Zaktualizuj element w szablonie, aby zwrócić cały obiekt, który będzie miał identyfikator URI dla każdego pliku.$DeploymentScriptOutputs = @{} foreach ($fileName in $fileList) { Write-Host \"Copying $fileName to $env:StorageContainerName in $env:StorageAccountName.\" Invoke-RestMethod -Uri \"https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/$fileName\" -OutFile $fileName $blob = Set-AzStorageBlobContent -File $fileName -Container $env:StorageContainerName -Blob $fileName -Context $storageAccount.Context $DeploymentScriptOutputs[$fileName] = @{} $DeploymentScriptOutputs[$fileName]['Uri'] = $blob.ICloudBlob.Uri $DeploymentScriptOutputs[$fileName]['StorageUri'] =$blob.ICloudBlob.StorageUri $count++ }
Dodaj kolejne dane wyjściowe z nazwą konta magazynu (który ma losowy identyfikator). Użyjesz tego później, aby sprawdzić, czy skrypt wdrożenia zrobił to, czego oczekiwano.
$DeploymentScriptOutputs = @{} foreach ($fileName in $fileList) { Write-Host \"Copying $fileName to $env:StorageContainerName in $env:StorageAccountName.\" Invoke-RestMethod -Uri \"https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/$fileName\" -OutFile $fileName $blob = Set-AzStorageBlobContent -File $fileName -Container $env:StorageContainerName -Blob $fileName -Context $storageAccount.Context $DeploymentScriptOutputs[$fileName] = @{} $DeploymentScriptOutputs[$fileName]['Uri'] = $blob.ICloudBlob.Uri $DeploymentScriptOutputs[$fileName]['StorageUri'] =$blob.ICloudBlob.StorageUri $count++ }
Zaktualizuj dane wyjściowe w szablonie, aby zwrócić cały obiekt, który będzie miał identyfikator URI dla każdego pliku.
output fileUri object = deploymentScript.properties.outputs
Dodaj kolejne dane wyjściowe z nazwą konta magazynu (który ma losowy identyfikator). Użyjesz tego później, aby sprawdzić, czy skrypt wdrożenia zrobił to, czego oczekiwano.
output storageAccountName string = storageAccountName
Weryfikowanie szablonu
Szablon powinien być podobny do tego wyświetlonego poniżej:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.1",
"apiProfile": "",
"parameters": {
"filesToCopy": {
"type": "array",
"defaultValue": [ "appsettings.json" ],
"metadata": {
"description": "List of files to copy to application storage account."
}
}
},
"variables": {
"singleQuote": "'",
"storageAccountName": "[concat('storage', uniqueString(resourceGroup().id))]",
"storageBlobContainerName": "config",
"userAssignedIdentityName": "configDeployer",
"roleAssignmentName": "[guid(concat(resourceGroup().id, 'contributor'))]",
"contributorRoleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
"deploymentScriptName": "CopyConfigScript"
},
"functions": [],
"resources": [
{
"name": "[variables('storageAccountName')]",
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2023-01-01",
"tags": {
"displayName": "[variables('storageAccountName')]"
},
"location": "[resourceGroup().location]",
"kind": "StorageV2",
"sku": {
"name": "Standard_LRS",
"tier": "Standard"
},
"properties": {
"allowBlobPublicAccess": true,
"encryption": {
"services": {
"blob": {
"enabled": true
}
},
"keySource": "Microsoft.Storage"
},
"supportsHttpsTrafficOnly": true
}
},
{
"type": "Microsoft.Storage/storageAccounts/blobServices",
"apiVersion": "2019-04-01",
"name": "[concat(variables('storageAccountName'), '/default')]",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
]
},
{
"type": "Microsoft.Storage/storageAccounts/blobServices/containers",
"apiVersion": "2019-04-01",
"name": "[concat(variables('storageAccountName'),'/default/',variables('storageBlobContainerName'))]",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', variables('storageAccountName'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
],
"properties": {
"publicAccess": "Blob"
}
},
{
"type": "Microsoft.ManagedIdentity/userAssignedIdentities",
"apiVersion": "2018-11-30",
"name": "[variables('userAssignedIdentityName')]",
"location": "[resourceGroup().location]"
},
{
"type": "Microsoft.Authorization/roleAssignments",
"apiVersion": "2020-04-01-preview",
"name": "[variables('roleAssignmentName')]",
"dependsOn": [ "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName'))]" ],
"properties": {
"roleDefinitionId": "[variables('contributorRoleDefinitionId')]",
"principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName')), '2015-08-31-preview').principalId]",
"scope": "[resourceGroup().id]",
"principalType": "ServicePrincipal"
}
},
{
"type": "Microsoft.Resources/deploymentScripts",
"apiVersion": "2020-10-01",
"name": "[variables('deploymentScriptName')]",
"location": "[resourceGroup().location]",
"kind": "AzurePowerShell",
"dependsOn": [
"[resourceId('Microsoft.Authorization/roleAssignments', variables('roleAssignmentName'))]",
"[resourceId('Microsoft.Storage/storageAccounts/blobServices/containers', variables('storageAccountName'), 'default', variables('storageBlobContainerName'))]"
],
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities',variables('userAssignedIdentityName'))]": {}
}
},
"properties": {
"arguments": "[concat( '-File ', variables('singleQuote'), string(parameters('filesToCopy')), variables('singleQuote'))]",
"environmentVariables": [
{
"name": "ResourceGroupName",
"value": "[resourceGroup().name]"
},
{
"name": "StorageAccountName",
"value": "[variables('storageAccountName')]"
},
{
"name": "StorageContainerName",
"value": "[variables('storageBlobContainerName')]"
}
],
"azPowerShellVersion": "3.0",
"scriptContent": "
param([string]$File)
$fileList = $File -replace '(\[|\])' -split ',' | ForEach-Object { $_.trim() }
$storageAccount = Get-AzStorageAccount -ResourceGroupName $env:ResourceGroupName -Name $env:StorageAccountName -Verbose
$count = 0
$DeploymentScriptOutputs = @{}
foreach ($fileName in $fileList) {
Write-Host \"Copying $fileName to $env:StorageContainerName in $env:StorageAccountName.\"
Invoke-RestMethod -Uri \"https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/$fileName\" -OutFile $fileName
$blob = Set-AzStorageBlobContent -File $fileName -Container $env:StorageContainerName -Blob $fileName -Context $storageAccount.Context
$DeploymentScriptOutputs[$fileName] = @{}
$DeploymentScriptOutputs[$fileName]['Uri'] = $blob.ICloudBlob.Uri
$DeploymentScriptOutputs[$fileName]['StorageUri'] =$blob.ICloudBlob.StorageUri
$count++
}
Write-Host \"Finished copying $count files.\"
",
"retentionInterval": "P1D"
}
}
],
"outputs": {
"fileUri": {
"type": "object",
"value": "[reference(variables('deploymentScriptName')).outputs]"
},
"storageAccountName": {
"type": "string",
"value": "[variables('storageAccountName')]"
}
}
}
@description('List of files to copy to application storage account.')
param filesToCopy array = [
'appsettings.json'
]
var storageAccountName = 'storage${uniqueString(resourceGroup().id)}'
var storageBlobContainerName = 'config'
var userAssignedIdentityName = 'configDeployer'
var roleAssignmentName = guid(resourceGroup().id, 'contributor')
var contributorRoleDefinitionId = resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')
var deploymentScriptName = 'CopyConfigScript'
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = {
name: storageAccountName
tags: {
displayName: storageAccountName
}
location: resourceGroup().location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
tier: 'Standard'
}
properties: {
allowBlobPublicAccess: true
encryption: {
services: {
blob: {
enabled: true
}
}
keySource: 'Microsoft.Storage'
}
supportsHttpsTrafficOnly: true
}
resource blobService 'blobServices' existing = {
name: 'default'
}
}
resource blobContainer 'Microsoft.Storage/storageAccounts/blobServices/containers@2019-04-01' = {
parent: storageAccount::blobService
name: storageBlobContainerName
properties: {
publicAccess: 'Blob'
}
}
resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' = {
name: userAssignedIdentityName
location: resourceGroup().location
}
resource roleAssignment 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = {
name: roleAssignmentName
properties: {
roleDefinitionId: contributorRoleDefinitionId
principalId: userAssignedIdentity.properties.principalId
principalType: 'ServicePrincipal'
}
}
resource deploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = {
name: deploymentScriptName
location: resourceGroup().location
kind: 'AzurePowerShell'
identity: {
type: 'UserAssigned'
userAssignedIdentities: {
'${userAssignedIdentity.id}': {}
}
}
properties: {
arguments: '-File \'${string(filesToCopy)}\''
environmentVariables: [
{
name: 'ResourceGroupName'
value: resourceGroup().name
}
{
name: 'StorageAccountName'
value: storageAccountName
}
{
name: 'StorageContainerName'
value: storageBlobContainerName
}
]
azPowerShellVersion: '3.0'
scriptContent: '''
param([string]$File)
$fileList = $File -replace '(\[|\])' -split ',' | ForEach-Object { $_.trim() }
$storageAccount = Get-AzStorageAccount -ResourceGroupName $env:ResourceGroupName -Name $env:StorageAccountName -Verbose
$count = 0
$DeploymentScriptOutputs = @{}
foreach ($fileName in $fileList) {
Write-Host "Copying $fileName to $env:StorageContainerName in $env:StorageAccountName."
Invoke-RestMethod -Uri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/$fileName" -OutFile $fileName
$blob = Set-AzStorageBlobContent -File $fileName -Container $env:StorageContainerName -Blob $fileName -Context $storageAccount.Context
$DeploymentScriptOutputs[$fileName] = @{}
$DeploymentScriptOutputs[$fileName]['Uri'] = $blob.ICloudBlob.Uri
$DeploymentScriptOutputs[$fileName]['StorageUri'] = $blob.ICloudBlob.StorageUri
$count++
}
Write-Host "Finished copying $count files."
'''
retentionInterval: 'P1D'
}
dependsOn: [
roleAssignment
blobContainer
]
}
output fileUri object = deploymentScript.properties.outputs
output storageAccountName string = storageAccountName
Jeśli tak nie jest, skopiuj przykład lub dostosuj szablon tak, aby był zgodny z przykładem.
Tworzenie pliku parametrów
Teraz, gdy masz zestaw szablonów, możesz zweryfikować nowy skrypt wdrażania przy użyciu pliku parametrów z określonymi nowymi plikami.
Utwórz plik azuredeploy.parameters.json ręcznie lub użyj rozszerzenia programu VS Code, aby to zrobić.
Edytuj plik, aby miał określony dwa
filesToCopy
elementy:{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { "filesToCopy": { "value": [ "swagger.Staging.json", "appsettings.Staging.json" ] } } }
Utwórz plik azuredeploy.parameters.json.
Edytuj plik, aby miał określony dwa
filesToCopy
elementy:{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { "filesToCopy": { "value": [ "swagger.Staging.json", "appsettings.Staging.json" ] } } }
Wdrażanie szablonu
Tworzenie grupy zasobów na potrzeby ćwiczenia
Musisz utworzyć grupę zasobów, aby zawierała zasoby, które utworzysz w ramach tego ćwiczenia. Korzystając z nowej grupy zasobów, oczyszczanie będzie znacznie łatwiejsze po wykonaniu tego ćwiczenia.
W terminalu w programie Visual Studio Code uruchom to polecenie, aby utworzyć grupę zasobów na potrzeby tego ćwiczenia.
resourceGroupName="learndeploymentscript_exercise_2"
az group create --location eastus --name $resourceGroupName
$resourceGroupName = 'learndeploymentscript_exercise_2'
New-AzResourceGroup -Location eastus -Name $resourceGroupName
Wdrażanie szablonu na platformie Azure
Wdróż szablon przy użyciu poleceń interfejsu wiersza polecenia platformy Azure w terminalu programu Visual Studio Code.
templateFile="azuredeploy.json"
templateParameterFile="azuredeploy.parameters.json"
today=$(date +"%d-%b-%Y")
deploymentName="deploymentscript-"$today
az deployment group create \
--resource-group $resourceGroupName \
--name $deploymentName \
--template-file $templateFile \
--parameters $templateParameterFile
Wdrażanie szablonu na platformie Azure
Wdróż szablon za pomocą poleceń programu Azure PowerShell w terminalu.
$templateFile = 'azuredeploy.json'
$templateParameterFile = 'azuredeploy.parameters.json'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "deploymentscript-$today"
New-AzResourceGroupDeployment `
-ResourceGroupName $resourceGroupName `
-Name $deploymentName `
-TemplateFile $templateFile `
-TemplateParameterFile $templateParameterFile
Wdrażanie szablonu na platformie Azure
Wdróż szablon przy użyciu poleceń interfejsu wiersza polecenia platformy Azure w terminalu programu Visual Studio Code.
templateFile="main.bicep"
templateParameterFile="azuredeploy.parameters.json"
today=$(date +"%d-%b-%Y")
deploymentName="deploymentscript-"$today
az deployment group create \
--resource-group $resourceGroupName \
--name $deploymentName \
--template-file $templateFile \
--parameters $templateParameterFile
Wdrażanie szablonu na platformie Azure
Wdróż szablon za pomocą poleceń programu Azure PowerShell w terminalu.
$templateFile = 'main.bicep'
$templateParameterFile = 'azuredeploy.parameters.json'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "deploymentscript-$today"
New-AzResourceGroupDeployment `
-ResourceGroupName $resourceGroupName `
-Name $deploymentName `
-TemplateFile $templateFile `
-TemplateParameterFile $templateParameterFile
Przejrzyj wynik szablonu
Po zakończeniu wdrażania możesz sprawdzić, czy oba pliki zostały skopiowane na konto magazynu, wyświetlając listę zawartości kontenera obiektów blob.
Wyświetl listę zawartości kontenera obiektów blob.
storageAccountName=$(az deployment group show --resource-group $resourceGroupName --name $deploymentName --query 'properties.outputs.storageAccountName.value' --output tsv) az storage blob list --account-name $storageAccountName --container-name config --query '[].name'
Polecenie zwraca następujący kod:
[ "swagger.Staging.json", "appsettings.Staging.json" ]
Możesz również przejrzeć dzienniki (i inne szczegóły dotyczące wdrożenia) w witrynie Azure Portal lub za pomocą następującego polecenia.
az deployment-scripts show-log --resource-group $resourceGroupName --name CopyConfigScript
Wyświetl listę zawartości kontenera obiektów blob.
$storageAccountName = (Get-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName -Name $deploymentName).Outputs.storageAccountName.Value $storageAccount = Get-AzStorageAccount -ResourceGroupName $resourceGroupName Get-AzStorageBlob -Context $storageAccount.Context -Container config | Select-Object Name
Polecenie zwraca następujący kod:
Name ---- swagger.Staging.json appsettings.Staging.json
Możesz również przejrzeć dzienniki (i inne szczegóły dotyczące wdrożenia) w witrynie Azure Portal lub za pomocą następującego polecenia.
Get-AzDeploymentScriptLog -ResourceGroupName $resourceGroupName -Name CopyConfigScript
Czyszczenie grupy zasobów
Pomyślnie wdrożono szablon usługi ARM ze skryptem wdrażania i użyto różnych metod przekazywania danych w celu dostosowania jego zachowania. Możesz usunąć grupę zasobów zawierającą wszystkie utworzone zasoby i przypisania ról.
az group delete --name $resourceGroupName
Remove-AzResourceGroup -Name $resourceGroupName