Oefening: parameters toevoegen aan implementatiescripts
Nu u een implementatiescript hebt gebruikt om handmatig werk te migreren naar uw ARM-sjabloon (Azure Resource Manager), heeft een ander partnertoepassingsteam in uw organisatie om hulp gevraagd.
Het proces van het team heeft vergelijkbare vereisten, maar het team moet meerdere bestanden implementeren in het opslagaccount. Het team heeft een PowerShell-script dat een lijst met bestanden als parameter kan gebruiken en deze kan uploaden, vergelijkbaar met het script dat u al in uw sjabloon hebt gebruikt.
In deze oefening neemt u uw vorige sjabloon als uitgangspunt en werkt u het PowerShell-script bij om het script van uw partnerteam te gebruiken. Vervolgens voegt u een manier toe om de persoon die de sjabloon implementeert in te schakelen om op te geven welke configuratiebestanden moeten worden geïmplementeerd (een of meer).
Tijdens het proces gaat u het volgende doen:
- Werk het implementatiescript bij.
- Voeg een omgevingsvariabele en sjabloonparameter toe en geef deze door aan uw implementatiescript.
- Voeg een uitvoer toe aan het implementatiescript.
- Voeg een parameterbestand toe.
- Implementeer de sjabloon en controleer het resultaat.
De beginsjabloon maken
U begint met de sjabloon die u in de vorige oefening hebt gemaakt.
Open Visual Studio Code en maak een nieuw bestand met de naam azuredeploy.json.
Kopieer de volgende beginsjabloon naar 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]" } } }
Sla de sjabloon op.
Open Visual Studio Code en maak een nieuw bestand met de naam main.bicep.
Kopieer de volgende beginsjabloon naar 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
Sla de sjabloon op.
Het PowerShell-script bijwerken
Omdat het andere team hard heeft gewerkt aan het maken van een PowerShell-script om meerdere bestanden te kopiëren, besluit u dat script in uw sjabloon te gebruiken.
Bewerk scriptContent
in de properties
sectie om het script op te nemen dat uw partnerteam heeft opgegeven.
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."
Een omgevingsvariabele toevoegen
Voor het script dat u hebt gebruikt, zijn enkele omgevingsvariabelen vereist. U kunt ze rechtstreeks in de sjabloon opgeven, maar het is flexibeler om sjabloonfuncties te gebruiken om een aantal waarden op te halen.
Voeg een
environmentVariables
eigenschap toe aan deproperties
sectie van het implementatiescript."environmentVariables": [ ],
Voeg een omgevingsvariabele toe voor
ResourceGroupName
."environmentVariables": [ { "name": "ResourceGroupName", "value": "[resourceGroup().name]" } ],
Voeg een omgevingsvariabele toe voor
StorageAccountName
."environmentVariables": [ { "name": "ResourceGroupName", "value": "[resourceGroup().name]" }, { "name": "StorageAccountName", "value": "[variables('storageAccountName')]" } ],
Voeg een omgevingsvariabele toe voor
StorageContainerName
."environmentVariables": [ { "name": "ResourceGroupName", "value": "[resourceGroup().name]" }, { "name": "StorageAccountName", "value": "[variables('storageAccountName')]" }, { "name": "StorageContainerName", "value": "[variables('storageBlobContainerName')]" } ],
Tip
Sjabloonfuncties gebruiken om toegang te krijgen tot algemene waarden zoals [resourceGroup().name]
en [variables()]
.
Voor het script dat u hebt gebruikt, zijn enkele omgevingsvariabelen vereist. U kunt ze rechtstreeks in de sjabloon opgeven, maar het is flexibeler om Bicep-variabelen te gebruiken om een aantal waarden op te halen.
Voeg een
environmentVariables
eigenschap toe aan deproperties
sectie van het implementatiescript.environmentVariables: [ ]
Voeg een omgevingsvariabele toe voor
ResourceGroupName
.environmentVariables: [ { name: 'ResourceGroupName' value: resourceGroup().name } ]
Voeg een omgevingsvariabele toe voor
StorageAccountName
.environmentVariables: [ { name: 'ResourceGroupName' value: resourceGroup().name } { name: 'StorageAccountName' value: storageAccountName } ]
Voeg een omgevingsvariabele toe voor
StorageContainerName
.environmentVariables: [ { name: 'ResourceGroupName' value: resourceGroup().name } { name: 'StorageAccountName' value: storageAccountName } { name: 'StorageContainerName' value: storageBlobContainerName } ]
Een sjabloonparameter toevoegen
Als u uw sjabloon gemakkelijker wilt gebruiken voor de twee teams, kunt u een parameter toevoegen aan de sjabloon, zodat elk team de bestanden kan opgeven die ze willen kopiëren.
Voeg een parameter toe aan de sjabloon om een matrix met bestandsnamen te maken.
"parameters": {
"filesToCopy": {
"type": "array",
"metadata": {
"description": "List of files to copy to application storage account."
}
}
},
Als bonus kunt u een standaardwaarde opgeven, zodat de sjabloon blijft werken voor uw team zonder wijzigingen in het implementatieproces. Hoewel dit niet vereist is, kan het invoeren van een nieuwe standaardwaarde u helpen inzicht te krijgen in het patroon van het eenvoudiger maken voor teams om nieuwe versies van sjablonen te gebruiken als ze zich blijven gedragen zoals ze eerder hebben gedaan, met de nieuwe functionaliteit als beloning. Met andere woorden, deze stap laat zien hoe u het bestaande gedrag kunt behouden terwijl u de wijzigingen aanbrengt om toekomstig werk te ondersteunen.
Voeg een parameter toe aan de sjabloon om een matrix met bestandsnamen te maken.
@description('List of files to copy to application storage account.')
param filesToCopy array
Als bonus kunt u een standaardwaarde opgeven, zodat de sjabloon blijft werken voor uw team zonder wijzigingen in het implementatieproces. Hoewel dit niet vereist is, kan het invoeren van een nieuwe standaardwaarde u helpen inzicht te krijgen in het patroon van het eenvoudiger maken voor teams om nieuwe versies van sjablonen te gebruiken als ze zich blijven gedragen zoals ze eerder hebben gedaan, met de nieuwe functionaliteit als beloning. Met andere woorden, deze stap laat zien hoe u het bestaande gedrag kunt behouden terwijl u de wijzigingen aanbrengt om toekomstig werk te ondersteunen.
Een argument toevoegen om de bestanden door te geven die u wilt kopiëren
Vervolgens kunt u de parameter die u zojuist hebt gedefinieerd, gebruiken en doorgeven aan het implementatiescript. Het doorgeven van opdrachtregelargumenten kan lastig zijn, omdat de tekenreeksen op meerdere niveaus worden geëvalueerd. Correct ontsnappen aanhalingstekens en het kiezen van de juiste aanhalingstekens voor de taak zijn essentieel voor succes.
Tip
Gebruik sjabloonfuncties voor toegang tot algemene functies, zoals [string()]
het converteren van waarden van één type naar een tekenreeks.
Voeg een
arguments
eigenschap toe aan het implementatiescript. Het PowerShell-script gebruikt een parameter met de naamFile
, een tekenreeks met bestandsnamen die afkomstig moeten zijn van defilesToCopy
sjabloonparameter. Zorg ervoor dat er aanhalingstekens rond het hele argument staan, zodat deze correct worden doorgegeven.Let op
Deze
arguments
eigenschap is ongeldig. Als u de Azure Resource Manager-extensie in Visual Studio Code gebruikt, wordt deze regel mogelijk gevlagd. U lost dit probleem op in de volgende stappen."arguments": "[concat( '-File '', string(parameters('filesToCopy')), ''' )]",
Tip
Het citeren van items in JSON kan lastig zijn, met name wanneer u opdrachtregelargumenten doorgeeft. U kunt een sjabloonvariabele gebruiken om een teken weer te geven dat moeilijk te ontsnappen is.
Voeg een sjabloonvariabele toe om het teken met één aanhalingsteken weer te geven.
"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" },
Vervang de enkele aanhalingstekens in de
arguments
eigenschap door de variabele die u zojuist hebt gedefinieerd."arguments": "[concat( '-File ', variables('singleQuote'), string(parameters('filesToCopy')), variables('singleQuote'))]",
Vervolgens kunt u de parameter die u zojuist hebt gedefinieerd, gebruiken en doorgeven aan het implementatiescript. Het doorgeven van opdrachtregelargumenten kan lastig zijn, omdat de tekenreeksen op meerdere niveaus worden geëvalueerd. Correct ontsnappen aanhalingstekens en het kiezen van de juiste aanhalingstekens voor de taak zijn essentieel voor succes.
Voeg een arguments
eigenschap toe aan het implementatiescript. Het PowerShell-script gebruikt een parameter met de naam File
, een tekenreeks met bestandsnamen die afkomstig moeten zijn van de filesToCopy
sjabloonparameter.
arguments: '-File \'${string(filesToCopy)}\''
U ziet dat hiervoor verschillende Bicep-functies worden gebruikt:
- Tekenreeksinterpolatie om de tekenreeksen te combineren.
- We gebruiken het
\
escape-teken om ons in staat te stellen één aanhalingsteken ('
) in de tekenreeks op te nemen, omdat één aanhalingsteken normaal gesproken een gereserveerd teken in Bicep is. - We gebruiken de
string()
functie om defilesToCopy
matrix te converteren naar een tekenreeks.
De sjabloonuitvoer bijwerken
Omdat u het implementatiescript wijzigt om een of meer bestanden te implementeren, moet u de sjabloonuitvoer bijwerken om alle benodigde informatie op te geven.
Werk de
outputs
in de sjabloon bij om het hele object te retourneren, met een URI per bestand.$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++ }
Voeg nog een uitvoer toe met de naam van het opslagaccount (die een willekeurige id heeft). U gebruikt dit later om te controleren of het implementatiescript heeft gedaan wat u verwachtte.
$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++ }
Werk de uitvoer in de sjabloon bij om het hele object te retourneren, met een URI per bestand.
output fileUri object = deploymentScript.properties.outputs
Voeg nog een uitvoer toe met de naam van het opslagaccount (die een willekeurige id heeft). U gebruikt dit later om te controleren of het implementatiescript heeft gedaan wat u verwachtte.
output storageAccountName string = storageAccountName
Uw sjabloon controleren
De sjabloon moet er ongeveer zo uitzien:
{
"$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
Als dit niet het geval is, kopieert u het voorbeeld of past u de sjabloon aan zodat deze overeenkomt met het voorbeeld.
Een parameterbestand maken
Nu u de sjabloonset hebt, kunt u het nieuwe implementatiescript valideren met behulp van een parameterbestand met nieuwe bestanden die zijn opgegeven.
Maak handmatig een azuredeploy.parameters.json-bestand of gebruik hiervoor de VS Code-extensie .
Bewerk het bestand zodat er twee zijn
filesToCopy
opgegeven:{ "$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" ] } } }
Maak een azuredeploy.parameters.json-bestand .
Bewerk het bestand zodat er twee zijn
filesToCopy
opgegeven:{ "$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" ] } } }
De sjabloon implementeren
Een resourcegroep maken voor de oefening
U moet een resourcegroep maken die de resources bevat die u maakt als onderdeel van deze oefening. Door een nieuwe resourcegroep te gebruiken, maakt u het opschonen na de oefening veel eenvoudiger.
Voer vanuit de terminal in Visual Studio Code deze opdracht uit om de resourcegroep voor deze oefening te maken.
resourceGroupName="learndeploymentscript_exercise_2"
az group create --location eastus --name $resourceGroupName
$resourceGroupName = 'learndeploymentscript_exercise_2'
New-AzResourceGroup -Location eastus -Name $resourceGroupName
De sjabloon implementeren in Azure
Implementeer de sjabloon met behulp van Azure CLI-opdrachten in de Visual Studio Code-terminal.
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
De sjabloon implementeren in Azure
Implementeer de sjabloon met behulp van Azure PowerShell-opdrachten in de terminal.
$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
De sjabloon implementeren in Azure
Implementeer de sjabloon met behulp van Azure CLI-opdrachten in de Visual Studio Code-terminal.
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
De sjabloon implementeren in Azure
Implementeer de sjabloon met behulp van Azure PowerShell-opdrachten in de terminal.
$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
Bekijk het resultaat van uw sjabloon
Nadat de implementatie is voltooid, kunt u controleren of beide bestanden naar uw opslagaccount zijn gekopieerd door de inhoud van de blobcontainer weer te geven.
Geef de inhoud van de blobcontainer weer.
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'
De opdracht retourneert de volgende code:
[ "swagger.Staging.json", "appsettings.Staging.json" ]
U kunt ook de logboeken (en andere details over de implementatie) bekijken vanuit Azure Portal of met behulp van de volgende opdracht.
az deployment-scripts show-log --resource-group $resourceGroupName --name CopyConfigScript
Geef de inhoud van de blobcontainer weer.
$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
De opdracht retourneert de volgende code:
Name ---- swagger.Staging.json appsettings.Staging.json
U kunt ook de logboeken (en andere details over de implementatie) bekijken vanuit Azure Portal of met behulp van de volgende opdracht.
Get-AzDeploymentScriptLog -ResourceGroupName $resourceGroupName -Name CopyConfigScript
De resourcegroep opschonen
U hebt een ARM-sjabloon geïmplementeerd met een implementatiescript en verschillende methoden gebruikt om gegevens door te geven om het gedrag ervan aan te passen. U kunt de resourcegroep verwijderen die alle resources en roltoewijzingen bevat die u hebt gemaakt.
az group delete --name $resourceGroupName
Remove-AzResourceGroup -Name $resourceGroupName