Gyakorlat – Paraméterek hozzáadása az üzembehelyezési szkriptekhez

Befejeződött

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.

  1. Nyissa meg a Visual Studio Code-ot, és hozzon létre egy azuredeploy.json nevű új fájlt.

  2. 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]"
            }
        }
    }
    
  3. Mentse a sablont.

  1. Nyissa meg a Visual Studio Code-ot, és hozzon létre egy main.bicep nevű új fájlt.

  2. 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
    
  3. 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.

  1. Adjon hozzá egy tulajdonságot environmentVariables az properties üzembehelyezési szkript szakaszához.

    "environmentVariables": [
    ],
    
  2. Környezeti változó hozzáadása a következőhöz ResourceGroupName: .

    "environmentVariables": [
        {
            "name": "ResourceGroupName",
            "value": "[resourceGroup().name]"
        }
    ],
    
  3. Környezeti változó hozzáadása a következőhöz StorageAccountName: .

    "environmentVariables": [
        {
            "name": "ResourceGroupName",
            "value": "[resourceGroup().name]"
        },
        {
            "name": "StorageAccountName",
            "value": "[variables('storageAccountName')]"
        }
    ],
    
  4. 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.

  1. Adjon hozzá egy tulajdonságot environmentVariables az properties üzembehelyezési szkript szakaszához.

    environmentVariables: [
    ]
    
  2. Környezeti változó hozzáadása a következőhöz ResourceGroupName: .

    environmentVariables: [
      {
        name: 'ResourceGroupName'
        value: resourceGroup().name
      }
    ]
    
  3. Környezeti változó hozzáadása a következőhöz StorageAccountName: .

    environmentVariables: [
      {
        name: 'ResourceGroupName'
        value: resourceGroup().name
      }
      {
        name: 'StorageAccountName'
        value: storageAccountName
      }
    ]
    
  4. 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.

  1. Adjon hozzá egy tulajdonságot arguments az üzembehelyezési szkripthez. A PowerShell-szkript egy névvel ellátott Fileparamétert használ, amely a sablonparaméterből származó fájlnevek sztringje filesToCopy . 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ő.

  2. 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"
    },
    
  3. 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 Fileparamé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 a filesToCopy 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.

  1. 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++
    }
    
  2. 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++
    }
    
  1. Frissítse a sablon kimeneteit a teljes objektum visszaadásához, amelynek fájlonként URI-ja lesz.

    output fileUri object = deploymentScript.properties.outputs
    
  2. 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.

  1. Hozzon létre manuálisan egy azuredeploy.parameters.json fájlt, vagy használja a VS Code-bővítményt .

  2. 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"
                ]
            }
        }
    }
    
  1. Hozzon létre egy azuredeploy.parameters.json fájlt.

  2. 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.

  1. 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"
    ]
    
  2. 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
    
  1. 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
    
  2. 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