Gyakorlat – Paraméterek hozzáadása az üzembehelyezési szkriptekhez
Most, hogy üzembehelyezési szkripttel migrál néhány manuális munkát az Azure Resource Manager-sablonba, a szervezet egy másik partneralkalmazás-csapata segítséget kért.
A csapat folyamatának hasonló követelményei vannak, de a csapatnak több fájlt kell üzembe helyeznie a tárfiókjában. A csapat rendelkezik egy PowerShell-szkripttel, amely paraméterként felveheti a fájlok listáját, és feltöltheti őket, hasonlóan a sablonban már használt szkripthez.
Ebben a gyakorlatban kiindulási pontként fogja használni az előző sablont, és frissíti a PowerShell-szkriptet, hogy a partnercsapattól származót használja. Ezután hozzáad egy módszert, a mely lehetővé teszi a sablont üzembe helyező személy számára az üzembe helyezendő konfigurációs fájlok (egy vagy több) megadását.
A folyamat során a következőt fogja elvégezni:
- Frissítse az üzembehelyezési szkriptet.
- Adjon hozzá egy környezeti változót és sablonparamétert, és adja át ezeket az üzembehelyezési szkriptnek.
- Adjon hozzá egy kimenetet az üzembehelyezési szkripthez.
- Adjon hozzá egy paraméterfájlt.
- Telepítse a sablont, és ellenőrizze az eredményt.
A kezdősablon létrehozása
Az előző gyakorlatban létrehozott sablonnal kell kezdenie.
Nyissa meg a Visual Studio Code-ot, és hozzon létre egy azuredeploy.json nevű új fájlt.
Másolja a következő kezdősablont az azuredeploy.json fájlba.
{ "$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]" } } }
Mentse a sablont.
Nyissa meg a Visual Studio Code-ot, és hozzon létre egy main.bicep nevű új fájlt.
Másolja a következő kezdősablont a main.bicep fájlba.
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
Mentse a sablont.
A PowerShell-szkript frissítése
Mivel a másik csapat keményen dolgozott egy PowerShell-szkript létrehozásán, hogy több fájlt másoljon, ön úgy dönt, hogy ezt a szkriptet használja a sablonban.
Szerkessze scriptContent
a szakaszban a properties
partnercsapat által megadott szkriptet.
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."
Környezeti változó hozzáadása
Az elfogadott szkripthez környezeti változók szükségesek. Ezeket közvetlenül a sablonban is megadhatja, de rugalmasabb lesz a sablonfüggvények használata az értékek egy részének lekéréséhez.
Adjon hozzá egy tulajdonságot
environmentVariables
azproperties
üzembehelyezési szkript szakaszához."environmentVariables": [ ],
Környezeti változó hozzáadása a következőhöz
ResourceGroupName
: ."environmentVariables": [ { "name": "ResourceGroupName", "value": "[resourceGroup().name]" } ],
Környezeti változó hozzáadása a következőhöz
StorageAccountName
: ."environmentVariables": [ { "name": "ResourceGroupName", "value": "[resourceGroup().name]" }, { "name": "StorageAccountName", "value": "[variables('storageAccountName')]" } ],
Környezeti változó hozzáadása a következőhöz
StorageContainerName
: ."environmentVariables": [ { "name": "ResourceGroupName", "value": "[resourceGroup().name]" }, { "name": "StorageAccountName", "value": "[variables('storageAccountName')]" }, { "name": "StorageContainerName", "value": "[variables('storageBlobContainerName')]" } ],
Tipp.
Sablonfüggvények használata az olyan gyakori értékek eléréséhez, mint a és [variables()]
a [resourceGroup().name]
.
Az elfogadott szkripthez környezeti változók szükségesek. Ezeket közvetlenül a sablonban is megadhatja, de rugalmasabb lesz a Bicep-változók használata az értékek egy részének lekéréséhez.
Adjon hozzá egy tulajdonságot
environmentVariables
azproperties
üzembehelyezési szkript szakaszához.environmentVariables: [ ]
Környezeti változó hozzáadása a következőhöz
ResourceGroupName
: .environmentVariables: [ { name: 'ResourceGroupName' value: resourceGroup().name } ]
Környezeti változó hozzáadása a következőhöz
StorageAccountName
: .environmentVariables: [ { name: 'ResourceGroupName' value: resourceGroup().name } { name: 'StorageAccountName' value: storageAccountName } ]
Környezeti változó hozzáadása a következőhöz
StorageContainerName
: .environmentVariables: [ { name: 'ResourceGroupName' value: resourceGroup().name } { name: 'StorageAccountName' value: storageAccountName } { name: 'StorageContainerName' value: storageBlobContainerName } ]
Sablonparaméter hozzáadása
Annak érdekében, hogy a sablon könnyebben használható legyen a két csapat számára, hozzáadhat egy paramétert a sablonhoz, hogy minden csapat meg tudja adni a másolni kívánt fájlokat.
Adjon hozzá egy paramétert a sablonhoz a fájlnevek tömbjének felvételéhez.
"parameters": {
"filesToCopy": {
"type": "array",
"metadata": {
"description": "List of files to copy to application storage account."
}
}
},
Bónuszként megadhat egy alapértelmezett értéket, hogy a sablon továbbra is működjön a csapatnál az üzembe helyezési folyamat módosítása nélkül. Bár nem kötelező, az új alapértelmezett érték megadása segíthet megérteni, hogy a csapatok egyszerűbben alkalmazhatnak új sablonverziókat, ha továbbra is ugyanúgy viselkednek, mint korábban, és az új funkció a jutalom. Más szóval ez a lépés bemutatja, hogyan tarthatja fenn a meglévő viselkedést, miközben a jövőbeni munkát támogató módosításokat hajthat végre.
Adjon hozzá egy paramétert a sablonhoz a fájlnevek tömbjének felvételéhez.
@description('List of files to copy to application storage account.')
param filesToCopy array
Bónuszként megadhat egy alapértelmezett értéket, hogy a sablon továbbra is működjön a csapatnál az üzembe helyezési folyamat módosítása nélkül. Bár nem kötelező, az új alapértelmezett érték megadása segíthet megérteni, hogy a csapatok egyszerűbben alkalmazhatnak új sablonverziókat, ha továbbra is ugyanúgy viselkednek, mint korábban, és az új funkció a jutalom. Más szóval ez a lépés bemutatja, hogyan tarthatja fenn a meglévő viselkedést, miközben a jövőbeni munkát támogató módosításokat hajthat végre.
Argumentum hozzáadása a másolandó fájlokba
Ezután felveheti az imént definiált paramétert, és átadhatja az üzembehelyezési szkriptnek. A parancssori argumentumok átadása bonyolult lehet, mert a sztringek kiértékelése több szinten történik. Az idézőjelek megfelelő menekülése és a feladathoz megfelelő idézőjelek kiválasztása elengedhetetlen a sikerhez.
Tipp.
Sablonfüggvények használatával hozzáférhet a gyakori függvényekhez, például [string()]
egy típus értékeit sztringgé alakíthatja.
Adjon hozzá egy tulajdonságot
arguments
az üzembehelyezési szkripthez. A PowerShell-szkript egy névvel ellátottFile
paramétert használ, amely a sablonparaméterből származó fájlnevek sztringjefilesToCopy
. Győződjön meg arról, hogy idézőjelek vannak az egész argumentum körül, hogy megfelelően legyen átadva.Figyelem
Ez
arguments
a tulajdonság érvénytelen. Ha az Azure Resource Manager-bővítményt használja a Visual Studio Code-ban, az megjelölheti ezt a sort. Ezt a problémát a következő lépésekben fogja kijavítani."arguments": "[concat( '-File '', string(parameters('filesToCopy')), ''' )]",
Tipp.
A JSON-ban való idézés nehéz lehet, különösen akkor, ha parancssori argumentumokat ad át. Sablonváltozóval olyan karaktert jelölhet, amely nehezen kezelhető.
Adjon hozzá egy sablonváltozót az egy idézőjel karakter megjelenítéséhez.
"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" },
Cserélje le a tulajdonságban szereplő
arguments
egyetlen idézőjeleket az imént definiált változóra."arguments": "[concat( '-File ', variables('singleQuote'), string(parameters('filesToCopy')), variables('singleQuote'))]",
Ezután felveheti az imént definiált paramétert, és átadhatja az üzembehelyezési szkriptnek. A parancssori argumentumok átadása bonyolult lehet, mert a sztringek kiértékelése több szinten történik. Az idézőjelek megfelelő menekülése és a feladathoz megfelelő idézőjelek kiválasztása elengedhetetlen a sikerhez.
Adjon hozzá egy tulajdonságot arguments
az üzembehelyezési szkripthez. A PowerShell-szkript egy névvel ellátott File
paramétert használ, amely a sablonparaméterből származó fájlnevek sztringje filesToCopy
.
arguments: '-File \'${string(filesToCopy)}\''
Figyelje meg, hogy ez számos Bicep-funkciót használ:
- Sztringek interpolációja a sztringek kombinálásához.
- A feloldó karakterrel
\
lehetővé tesszük, hogy egyetlen idézőjelet ('
) is belefoglaljunk a sztringbe, mivel az egyetlen idézőjel általában fenntartott karakter a Bicepben. - A függvény használatával
string()
sztringgé alakítjuk afilesToCopy
tömböt.
A sablon kimenetének frissítése
Mivel az üzembehelyezési szkriptet egy vagy több fájl üzembe helyezésére módosítja, frissítenie kell a sablon kimenetét, hogy minden szükséges információt megadjon.
Frissítse a
outputs
sablont a teljes objektum visszaadásához, amelynek fájlonként URI-ja lesz.$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++ }
Adjon hozzá egy másik kimenetet a tárfiók nevével (amely véletlenszerű azonosítóval rendelkezik). Ezt később fogja használni annak ellenőrzéséhez, hogy az üzembehelyezési szkript a várt módon járt-e el.
$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++ }
Frissítse a sablon kimeneteit a teljes objektum visszaadásához, amelynek fájlonként URI-ja lesz.
output fileUri object = deploymentScript.properties.outputs
Adjon hozzá egy másik kimenetet a tárfiók nevével (amely véletlenszerű azonosítóval rendelkezik). Ezt később fogja használni annak ellenőrzéséhez, hogy az üzembehelyezési szkript a várt módon járt-e el.
output storageAccountName string = storageAccountName
A sablon ellenőrzése
A sablonnak az alábbihoz hasonlónak kell lennie:
{
"$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
Ha nem, másolja ki a példát, vagy módosítsa a sablont a példának megfelelően.
Paraméterfájl létrehozása
Most, hogy megkapta a sablonkészletet, érvényesítheti az új üzembehelyezési szkriptet egy paraméterfájllal, amelyen új fájlok vannak megadva.
Hozzon létre manuálisan egy azuredeploy.parameters.json fájlt, vagy használja a VS Code-bővítményt .
Szerkessze a fájlt úgy, hogy kettő
filesToCopy
legyen megadva:{ "$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" ] } } }
Hozzon létre egy azuredeploy.parameters.json fájlt.
Szerkessze a fájlt úgy, hogy kettő
filesToCopy
legyen megadva:{ "$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" ] } } }
A sablon üzembe helyezése
Erőforráscsoport létrehozása a gyakorlathoz
Létre kell hoznia egy erőforráscsoportot, amely tartalmazza a gyakorlat részeként létrehozandó erőforrásokat. Egy új erőforráscsoport használatával sokkal egyszerűbbé teheti a tisztítást a gyakorlat után.
A Visual Studio Code termináljában futtassa ezt a parancsot a gyakorlathoz tartozó erőforráscsoport létrehozásához.
resourceGroupName="learndeploymentscript_exercise_2"
az group create --location eastus --name $resourceGroupName
$resourceGroupName = 'learndeploymentscript_exercise_2'
New-AzResourceGroup -Location eastus -Name $resourceGroupName
A sablon üzembe helyezése az Azure-ban
Helyezze üzembe a sablont. Ehhez használjon Azure CLI-parancsokat a Visual Studio Code terminálján.
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
A sablon üzembe helyezése az Azure-ban
Helyezze üzembe a sablont Azure PowerShell-parancsok használatával a terminálban.
$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
A sablon üzembe helyezése az Azure-ban
Helyezze üzembe a sablont. Ehhez használjon Azure CLI-parancsokat a Visual Studio Code terminálján.
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
A sablon üzembe helyezése az Azure-ban
Helyezze üzembe a sablont Azure PowerShell-parancsok használatával a terminálban.
$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
A sablon eredményének áttekintése
Az üzembe helyezés befejezése után ellenőrizheti, hogy mindkét fájl át lett-e másolva a tárfiókba a blobtároló tartalmának listázásával.
A blobtároló tartalmának listázása.
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'
A parancs a következő kódot adja vissza:
[ "swagger.Staging.json", "appsettings.Staging.json" ]
A naplókat (és az üzembe helyezés egyéb részleteit) az Azure Portalon vagy a következő paranccsal is áttekintheti.
az deployment-scripts show-log --resource-group $resourceGroupName --name CopyConfigScript
A blobtároló tartalmának listázása.
$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
A parancs a következő kódot adja vissza:
Name ---- swagger.Staging.json appsettings.Staging.json
A naplókat (és az üzembe helyezés egyéb részleteit) az Azure Portalon vagy a következő paranccsal is áttekintheti.
Get-AzDeploymentScriptLog -ResourceGroupName $resourceGroupName -Name CopyConfigScript
Az erőforráscsoport törlése
Sikeresen üzembe helyezett egy ARM-sablont egy üzembehelyezési szkripttel, és különböző módszerekkel adott át adatokat annak viselkedésének testreszabásához. Eltávolíthatja az összes létrehozott erőforrást és szerepkör-hozzárendelést tartalmazó erőforráscsoportot.
az group delete --name $resourceGroupName
Remove-AzResourceGroup -Name $resourceGroupName