Übung: Hinzufügen eines Bereitstellungsskripts zu einer ARM-Vorlage

Abgeschlossen

Wichtig

Sie benötigen für diese Übung ein eigenes Azure-Abonnement. Außerdem fallen möglicherweise Gebühren für Sie an. Wenn Sie noch kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.

Im Rahmen des Prozesses der Anwendungsbereitstellung Ihres Teams müssen Sie ein Speicherkonto erstellen und eine Datei im Blobspeicher bereitstellen, damit die Anwendung gelesen werden kann. Bis zu diesem Zeitpunkt haben Sie die Datei jedes Mal manuell kopiert, wenn eine neue Umgebung eingerichtet wurde. Sie entscheiden sich für die Verwendung eines Bereitstellungsskripts, um diesen Schritt im Rahmen ihres Umgebungserstellungsprozesses zu automatisieren.

In dieser Übung verwenden Sie eine vorhandene ARM-Vorlage (Azure Resource Manager) und fügen ein neues Bereitstellungsskript hinzu.

In dem Prozess gehen Sie wie folgt vor:

  • Erstellen Sie eine Startvorlage.
  • Fügen Sie die Voraussetzungen für Bereitstellungsskripts hinzu, einschließlich einer benutzerseitig zugewiesenen verwalteten Identität und Rollenzuweisung.
  • Fügen Sie ein Bereitstellungsskript hinzu.
  • Stellen Sie die Vorlage bereit, und überprüfen Sie das Ergebnis.

In dieser Übung werden die Azure Resource Manager-Tools für Visual Studio Code verwendet. Sie müssen diese Erweiterung in Visual Studio Code installieren.

In dieser Übung wird die Bicep-Erweiterung für Visual Studio Code verwendet. Sie müssen diese Erweiterung in Visual Studio Code installieren.

Erstellen der anfänglichen Vorlage

Sie beginnen mit einer vorhandenen Vorlage, die Ihr Team bereits verwendet. Die Vorlage erstellt das Speicherkonto, richtet Blobdienste ein und erfordert HTTPS. Zudem wird der Blobcontainer für Ihre Konfigurationsdateien erstellt.

  1. Öffnen Sie Visual Studio Code.

  2. Erstellen Sie eine neue Datei azuredeploy.json.

  3. Speichern Sie die leere Datei, damit Visual Studio Code die ARM-Vorlagentools lädt.

    Sie können entweder Datei>Speichern unter oder STRG+S unter Windows (⌘+S unter macOS) auswählen. Merken Sie sich unbedingt den Speicherort der Datei. Sie können dazu beispielsweise einen Ordner scripts erstellen und es darin speichern.

  4. Kopieren Sie die folgende Startvorlage in 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"
        },
        "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"
                }
            }
        ]
    }
    
  5. Speichern Sie die Vorlage.

  1. Öffnen Sie Visual Studio Code.

  2. Erstellen Sie eine neue Datei namens main.bicep.

  3. Speichern Sie die leere Datei, damit Visual Studio Code die Bicep-Tools lädt.

    Sie können entweder Datei>Speichern unter oder STRG+S unter Windows (⌘+S unter macOS) auswählen. Merken Sie sich unbedingt den Speicherort der Datei. Sie können dazu beispielsweise einen Ordner scripts (Skripts) erstellen und sie darin speichern.

  4. Kopieren Sie die folgende Startvorlage in main.bicep.

    var storageAccountName = 'storage${uniqueString(resourceGroup().id)}'
    var storageBlobContainerName = 'config'
    
    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'
      }
    }
    
  5. Speichern Sie die Vorlage.

Hinzufügen einer benutzerseitig zugewiesenen verwalteten Identität

Als Nächstes müssen Sie eine benutzerseitig zugewiesene verwaltete Identität erstellen. Angesichts des Infrastructure-as-Code-Ansatzes können Sie die Identität in der Vorlage erstellen.

  1. Bearbeiten Sie den Abschnitt variables von azuredeploy.json so, dass er Folgendes enthält:

    "userAssignedIdentityName": "configDeployer",
    
  2. Bearbeiten Sie den Abschnitt resources von azuredeploy.json so, dass er Folgendes enthält:

    {
        "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
        "apiVersion": "2018-11-30",
        "name": "[variables('userAssignedIdentityName')]",
        "location": "[resourceGroup().location]"
    }
    
  3. Speichern Sie die Vorlage.

  1. Fügen Sie unter den Variablendefinitionen in main.bicep Folgendes hinzu:

    var userAssignedIdentityName = 'configDeployer'
    
  2. Fügen Sie unter den Ressourcendefinitionen Folgendes hinzu:

    resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' = {
      name: userAssignedIdentityName
      location: resourceGroup().location
    }
    
  3. Speichern Sie die Vorlage.

Festlegen der Rolle „Mitwirkender“ für die verwaltete Identität

Nachdem Sie nun eine verwaltete Identität definiert haben, können Sie ihr eine Rolle mit Rechten für die Ressourcengruppe zuweisen. Sie weisen ihr die Rolle Mitwirkender zu. Sie identifizieren eine Rolle anhand ihrer Rollendefinitions-ID, bei der es sich um eine GUID handelt. Die Rolle Mitwirkender ist in Azure integriert, sodass die Rollendefinitions-ID dokumentiert ist.

Die Rollenzuweisung benötigt auch einen GUID-Namen. Sie können die guid-Funktion verwenden, um eine GUID zu erstellen, die für die Ressourcengruppe und den Rollennamen eindeutig ist.

  1. Bearbeiten Sie den Abschnitt variables von azuredeploy.json so, dass er Folgendes enthält:

    "roleAssignmentName": "[guid(concat(resourceGroup().id, 'contributor'))]",
    "contributorRoleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
    
  2. Bearbeiten Sie den Abschnitt resources von azuredeploy.json so, dass er Folgendes enthält:

    {
        "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"
        }
    }
    
  3. Speichern Sie die Vorlage.

  1. Fügen Sie unter den Variablendefinitionen in main.bicep Folgendes hinzu:

    var roleAssignmentName = guid(resourceGroup().id, 'contributor')
    var contributorRoleDefinitionId = resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')
    
  2. Fügen Sie unter den Ressourcendefinitionen Folgendes hinzu:

    resource roleAssignment 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = {
      name: roleAssignmentName
      properties: {
        roleDefinitionId: contributorRoleDefinitionId
        principalId: userAssignedIdentity.properties.principalId
        principalType: 'ServicePrincipal'
      }
    }
    
  3. Speichern Sie die Vorlage.

Erstellen des Bereitstellungsskripts

Nun verfügen Sie über alle Voraussetzungen für das Bereitstellungsskript. Sie beginnen mit den allgemeinen Werten, die das Bereitstellungsskript benötigt. Es gibt zwei Abhängigkeiten: die Rollenzuweisung und den Blobspeichercontainer. Ihr Skript muss beide enthalten, bevor es ausgeführt werden kann.

  1. Bearbeiten Sie den Abschnitt variables von azuredeploy.json so, dass er Folgendes enthält:

    "deploymentScriptName": "CopyConfigScript"
    
  2. Bearbeiten Sie den Abschnitt resources von azuredeploy.json so, dass er Folgendes enthält:

    {
        "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'))]": {}
            }
        }
    }
    
  3. Fügen Sie der Ressource einen properties-Abschnitt hinzu, um das Skript und die anderen erforderlichen Werte zu definieren.

    "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"
    }
    
  4. Speichern Sie die Vorlage.

  1. Fügen Sie unter den Variablendefinitionen in main.bicep Folgendes hinzu:

    var deploymentScriptName = 'CopyConfigScript'
    
  2. Fügen Sie unter den Ressourcendefinitionen Folgendes hinzu:

    resource deploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = {
      name: deploymentScriptName
      location: resourceGroup().location
      kind: 'AzurePowerShell'
      identity: {
        type: 'UserAssigned'
        userAssignedIdentities: {
          '${userAssignedIdentity.id}': {}
        }
      }
      dependsOn: [
        roleAssignment
        blobContainer
      ]
    }
    
  3. Fügen Sie der Ressource einen properties-Abschnitt hinzu, um das Skript und die anderen erforderlichen Werte zu definieren.

    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'
    }
    
  4. Speichern Sie die Vorlage.

Hinzufügen einer Vorlagenausgabe

Nachdem Sie nun über ein Bereitstellungsskript verfügen, das eine Datei in Azure Blob Storage hochlädt, müssen Sie möglicherweise später in der Automatisierung auf diesen Dateispeicherort verweisen. (Vielleicht führen Sie einen Test aus, um zu überprüfen, ob sich die Datei dort befindet, wo sie Ihrer Meinung nach sein sollte.)

Fügen Sie nach dem resources-Abschnitt der ARM-Vorlage eine Ausgabe hinzu, die auf den URI für die Datei verweist, wie vom Bereitstellungsskript gemeldet.

"outputs": {
    "fileUri": {
        "type": "string",
        "value": "[reference(variables('deploymentScriptName')).outputs.Uri]"
    }
}

Fügen Sie am unteren Rand der Datei nach den Ressourcendefinitionen eine Ausgabe hinzu, die auf den URI für die Datei verweist, wie vom Bereitstellungsskript gemeldet.

output fileUri string = deploymentScript.properties.outputs.Uri

Überprüfen der Vorlage

Ihre Vorlage sollte wie folgt aussehen:

{
    "$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]"
        }
    }
}
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

Andernfalls kopieren Sie entweder das Beispiel, oder passen Sie Ihre Vorlage an das Beispiel an.

Bereitstellen der Vorlage

Sie müssen sich über das Visual Studio Code-Terminal bei Ihrem Azure-Konto anmelden, um diese Vorlage in Azure bereitzustellen. Stellen Sie sicher, dass Sie die Azure CLI-Tools installiert haben.

  1. Wählen Sie im Menü Terminal die Option New Terminal (Neues Terminal) aus. Das Terminalfenster wird in der Regel in der unteren Hälfte des Bildschirms geöffnet.

  2. Wenn die auf der rechten Seite des Terminalfensters angezeigte Shell bash ist, ist die richtige Shell geöffnet, und Sie können mit dem nächsten Abschnitt fortfahren.

    Screenshot des Visual Studio Code-Terminalfensters mit Option „bash“

  3. Wenn eine andere Shell als bash angezeigt wird, wählen Sie die Shell-Dropdownliste und dann Azure Cloud Shell (Bash) aus.

    Screenshot des Visual Studio Code-Terminalfensters mit dem Dropdownmenü für die Terminalshell und Auswahl von „Git Bash (Standard)“

  4. Wählen Sie in der Liste der Terminalshells bash aus.

    Screenshot: Visual Studio Code-Terminalfenster mit „bash“ als ausgewähltem Terminal

  5. Wechseln Sie im Terminal zu dem Verzeichnis, in dem Sie Ihre Vorlage gespeichert haben. Wenn Sie Ihre Vorlage beispielsweise im Ordner templates gespeichert haben, können Sie den folgenden Befehl verwenden:

    cd templates
    

Anmelden bei Azure mithilfe der Azure CLI

  1. Melden Sie sich im Visual Studio Code-Terminal mit dem folgenden Befehl bei Azure an:

    az login
    
  2. Melden Sie sich im Browserfenster, das daraufhin geöffnet wird, in Ihrem Azure-Konto an.

    Im Visual Studio Code-Terminal wird eine Liste der Abonnements angezeigt, die diesem Konto zugeordnet sind.

  3. Suchen Sie in der Liste nach dem Abonnement, das Sie für diese Übung verwenden möchten.

    Wenn Sie die Liste bei der Anmeldung verpasst haben, können Sie den folgenden Codeausschnitt verwenden, um Ihre Abonnements erneut aufzulisten.

    az account list --output table
    
  4. Legen Sie das Standardabonnement für alle Azure CLI-Befehle fest, die Sie in dieser Sitzung ausführen.

    az account set --subscription "Your Subscription Name or ID"
    

Sie müssen sich über das Visual Studio Code-Terminal bei Ihrem Azure-Konto anmelden, um diese Vorlage in Azure bereitzustellen. Stellen Sie sicher, dass Sie die Azure CLI-Tools installiert haben.

  1. Wählen Sie im Menü Terminal die Option New Terminal (Neues Terminal) aus. Das Terminalfenster wird in der Regel in der unteren Hälfte des Bildschirms geöffnet.

  2. Wenn die auf der rechten Seite des Terminalfensters angezeigte Shell bash ist, ist die richtige Shell geöffnet, und Sie können mit dem nächsten Abschnitt fortfahren.

    Screenshot des Visual Studio Code-Terminalfensters mit Option „bash“

  3. Wenn eine andere Shell als bash angezeigt wird, wählen Sie die Shell-Dropdownliste und dann Azure Cloud Shell (Bash) aus.

    Screenshot des Visual Studio Code-Terminalfensters mit dem Dropdownmenü für die Terminalshell und Auswahl von „Git Bash (Standard)“

  4. Wählen Sie in der Liste der Terminalshells bash aus.

    Screenshot: Visual Studio Code-Terminalfenster mit „bash“ als ausgewähltem Terminal

  5. Wechseln Sie im Terminal zu dem Verzeichnis, in dem Sie Ihre Vorlage gespeichert haben. Wenn Sie Ihre Vorlage beispielsweise im Ordner templates gespeichert haben, können Sie den folgenden Befehl verwenden:

    cd templates
    

Installieren von Bicep

Vergewissern Sie sich mit dem folgenden Befehl, dass Sie die aktuelle Version von Bicep verwenden:

az bicep install && az bicep upgrade

Anmelden bei Azure mithilfe der Azure CLI

  1. Melden Sie sich im Visual Studio Code-Terminal mit dem folgenden Befehl bei Azure an:

    az login
    
  2. Melden Sie sich im Browserfenster, das daraufhin geöffnet wird, in Ihrem Azure-Konto an.

    Im Visual Studio Code-Terminal wird eine Liste der Abonnements angezeigt, die diesem Konto zugeordnet sind.

  3. Suchen Sie in der Liste nach dem Abonnement, das Sie für diese Übung verwenden möchten.

    Wenn Sie die Liste bei der Anmeldung verpasst haben, können Sie den folgenden Codeausschnitt verwenden, um Ihre Abonnements erneut aufzulisten.

    az account list --output table
    
  4. Legen Sie das Standardabonnement für alle Azure CLI-Befehle fest, die Sie in dieser Sitzung ausführen.

    az account set --subscription "Your Subscription Name or ID"
    

Melden Sie sich über das Visual Studio Code-Terminal bei Ihrem Azure-Konto an, um diese Vorlage in Azure bereitzustellen. Stellen Sie sicher, dass Azure PowerShell installiert ist, und melden Sie sich unter demselben Konto an, mit dem die Sandbox aktiviert wurde.

  1. Wählen Sie im Menü Terminal die Option New Terminal (Neues Terminal) aus. Das Terminalfenster wird in der Regel in der unteren Hälfte des Bildschirms geöffnet.

  2. Wenn die auf der rechten Seite des Terminalfensters angezeigte Shell powershell oder pwsh ist, ist die richtige Shell geöffnet, und Sie können mit dem nächsten Abschnitt fortfahren.

    Screenshot des Terminalfensters von Visual Studio Code mit der Option „pwsh“ in der Shell-Dropdown-Liste.

  3. Wenn eine andere Shell als powershell oder pwsh angezeigt wird, wählen Sie die Shell-Dropdownliste und dann PowerShell aus.

    Screenshot des Terminalfensters von Visual Studio Code mit der Dropdown-Liste der Terminal-Shell und der Auswahl von PowerShell.

  4. Wählen Sie in der Liste der Terminalshells powershell oder pwsh aus.

    Screenshot des Visual Studio Code-Terminalfensters mit „PowerShell“ als ausgewähltem Terminal.

  5. Wechseln Sie im Terminal zu dem Verzeichnis, in dem Sie Ihre Vorlage gespeichert haben. Wenn Sie Ihre Vorlage beispielsweise im Ordner templates gespeichert haben, können Sie den folgenden Befehl verwenden:

    Set-Location -Path templates
    

Anmelden bei Azure mithilfe von Azure PowerShell

  1. Melden Sie sich im Visual Studio Code-Terminal mit dem folgenden Befehl bei Azure an:

    Connect-AzAccount
    
  2. Melden Sie sich im Browser, der anschließend geöffnet wird, bei Ihrem Azure-Konto an.

  3. Führen Sie den folgenden Befehl aus, um die ID des Abonnements abzurufen, das Sie für diese Übung verwenden möchten:

    Get-AzSubscription
    

    Die Abonnement-ID befindet sich in der zweiten Spalte. Kopieren Sie die zweite Spalte. Dies sieht in etwa wie cf49fbbc-217c-4EB6-9eb5-a6a6c68295a0 aus.

  4. Legen Sie das Standardabonnement für alle Azure PowerShell-Befehle fest, die Sie in dieser Sitzung ausführen.

    Set-AzContext -SubscriptionId {Your subscription ID}
    

Melden Sie sich über das Visual Studio Code-Terminal bei Ihrem Azure-Konto an, um diese Vorlage in Azure bereitzustellen. Stellen Sie sicher, dass Azure PowerShell installiert ist.

  1. Wählen Sie im Menü Terminal die Option New Terminal (Neues Terminal) aus. Das Terminalfenster wird in der Regel in der unteren Hälfte des Bildschirms geöffnet.

  2. Wenn die auf der rechten Seite des Terminalfensters angezeigte Shell powershell oder pwsh ist, ist die richtige Shell geöffnet, und Sie können mit dem nächsten Abschnitt fortfahren.

    Screenshot des Terminalfensters von Visual Studio Code mit der Option „pwsh“ in der Shell-Dropdown-Liste.

  3. Wenn eine andere Shell als powershell oder pwsh angezeigt wird, wählen Sie die Shell-Dropdownliste und dann PowerShell aus.

    Screenshot des Terminalfensters von Visual Studio Code mit der Dropdown-Liste der Terminal-Shell und der Auswahl von PowerShell.

  4. Wählen Sie in der Liste der Terminalshells powershell oder pwsh aus.

    Screenshot des Visual Studio Code-Terminalfensters mit „PowerShell“ als ausgewähltem Terminal.

  5. Wechseln Sie im Terminal zu dem Verzeichnis, in dem Sie Ihre Vorlage gespeichert haben. Wenn Sie Ihre Vorlage beispielsweise im Ordner templates gespeichert haben, können Sie den folgenden Befehl verwenden:

    Set-Location -Path templates
    

Installieren der Bicep CLI

Installieren Sie die Bicep-CLI, um Bicep über Azure PowerShell zu verwenden.

Anmelden bei Azure mithilfe von Azure PowerShell

  1. Melden Sie sich im Visual Studio Code-Terminal mit dem folgenden Befehl bei Azure an:

    Connect-AzAccount
    
  2. Melden Sie sich im Browser, der anschließend geöffnet wird, bei Ihrem Azure-Konto an.

  3. Führen Sie den folgenden Befehl aus, um die ID des Abonnements abzurufen, das Sie für diese Übung verwenden möchten:

    Get-AzSubscription
    

    Die Abonnement-ID befindet sich in der zweiten Spalte. Kopieren Sie die zweite Spalte. Dies sieht in etwa wie cf49fbbc-217c-4EB6-9eb5-a6a6c68295a0 aus.

  4. Legen Sie das Standardabonnement für alle Azure PowerShell-Befehle fest, die Sie in dieser Sitzung ausführen.

    Set-AzContext -SubscriptionId {Your subscription ID}
    

Als Nächstes müssen Sie eine Ressourcengruppe erstellen, die die Ressourcen enthält, die Sie im Rahmen dieser Übung erstellen. Wenn Sie eine neue Ressourcengruppe verwenden, vereinfachen Sie die Bereinigung nach der Übung erheblich.

Führen Sie im Terminal in Visual Studio Code den folgenden Befehl aus, um die Ressourcengruppe für diese Übung zu erstellen:

Erstellen einer Ressourcengruppe für die Übung

resourceGroupName="learndeploymentscript_exercise_1"
az group create --location eastus --name $resourceGroupName
$resourceGroupName = 'learndeploymentscript_exercise_1'
New-AzResourceGroup -Location eastus -Name $resourceGroupName

Hinweis

Wenn Sie einen anderen Namen für Ihre Ressourcengruppe verwenden, müssen Sie das Skript aktualisieren. Später in diesem Modul erfahren Sie, wie Sie das Hartcodieren von Ressourcengruppennamen in Ihren Skripts vermeiden.

Bereitstellen der Vorlage in Azure

Der folgende Code stellt die ARM-Vorlage in Azure bereit. Es wird eine erfolgreiche Bereitstellung angezeigt.

Stellen Sie die Vorlage mithilfe von Azure CLI-Befehlen im Visual Studio Code-Terminal bereit.

templateFile="azuredeploy.json"
today=$(date +"%d-%b-%Y")
deploymentName="deploymentscript-"$today

az deployment group create \
    --resource-group $resourceGroupName \
    --name $deploymentName \
    --template-file $templateFile

Der folgende Code stellt die ARM-Vorlage in Azure bereit. Es wird eine erfolgreiche Bereitstellung angezeigt.

Stellen Sie die Vorlage mithilfe von Azure CLI-Befehlen im Visual Studio Code-Terminal bereit.

templateFile="main.bicep"
today=$(date +"%d-%b-%Y")
deploymentName="deploymentscript-"$today

az deployment group create \
    --resource-group $resourceGroupName \
    --name $deploymentName \
    --template-file $templateFile

Der folgende Code stellt die Vorlage in Azure bereit. Es wird eine erfolgreiche Bereitstellung angezeigt.

Stellen Sie die Vorlage mithilfe von Azure PowerShell-Befehle im Terminal bereit.

$templateFile = 'azuredeploy.json'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "deploymentscript-$today"
New-AzResourceGroupDeployment `
  -ResourceGroupName $resourceGroupName `
  -Name $deploymentName `
  -TemplateFile $templateFile

Der folgende Code stellt die Vorlage in Azure bereit. Es wird eine erfolgreiche Bereitstellung angezeigt.

Stellen Sie die Vorlage mithilfe von Azure PowerShell-Befehle im Terminal bereit.

$templateFile = 'main.bicep'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "deploymentscript-$today"
New-AzResourceGroupDeployment `
  -ResourceGroupName $resourceGroupName `
  -Name $deploymentName `
  -TemplateFile $templateFile

Überprüfen des Ergebnisses Ihrer Vorlage

Nach Abschluss der Bereitstellung erhalten Sie eine URL, die auf die Datei verweist, die Ihr Bereitstellungsskript in den Blobspeicher kopiert hat.

  1. Rufen Sie diese Datei mithilfe der URL-Ausgabe der Vorlagenbereitstellung ab, um zu überprüfen, ob das Bereitstellungsskript ordnungsgemäß ausgeführt wurde.

    uri=$(az deployment group show --resource-group $resourceGroupName --name $deploymentName --query 'properties.outputs.fileUri.value' --output tsv)
    curl $uri
    

    Der Befehl gibt den folgenden Code zurück.

    {
      "environment": "production",
      "hostname": "tailwindtraders.com",
      "Logging": {
        "LogLevel": {
          "Default": "Debug"
        }
      },
      "ApplicationInsights": {
        "InstrumentationKey": ""
      },
      "AllowedHosts": "*",
      "CosmosDb": {
        "Host": "",
        "Key": "",
        "Database": "Products"
      }
    }
    
  2. Sie können auch die Protokolle (und andere Details zur Bereitstellung) über das Azure-Portal oder mithilfe des folgenden Befehls überprüfen.

    az deployment-scripts show-log --resource-group $resourceGroupName --name CopyConfigScript
    
  1. Rufen Sie diese Datei mithilfe der URL-Ausgabe der Vorlagenbereitstellung ab, um zu überprüfen, ob das Bereitstellungsskript ordnungsgemäß ausgeführt wurde.

    $fileUri = (Get-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName -Name $deploymentName).Outputs.fileUri.Value
    Invoke-RestMethod $fileUri
    

    Der Befehl gibt den folgenden Code zurück.

    environment         : production
    hostname            : tailwindtraders.com
    Logging             : @{LogLevel=}
    ApplicationInsights : @{InstrumentationKey=}
    AllowedHosts        : *
    CosmosDb            : @{Host=; Key=; Database=Products}
    
  2. Sie können auch die Protokolle (und andere Details zur Bereitstellung) über das Azure-Portal oder mithilfe der folgenden Befehlszeile überprüfen.

    Get-AzDeploymentScriptLog -ResourceGroupName $resourceGroupName -Name CopyConfigScript
    

Bereinigen der Ressourcengruppe

Nachdem Sie nun erfolgreich eine ARM-Vorlage mit einem Bereitstellungsskript bereitgestellt haben, können Sie die Ressourcengruppe entfernen, die alle von Ihnen erstellten Ressourcen und Rollenzuweisungen enthält.

az group delete --name $resourceGroupName
Remove-AzResourceGroup -Name $resourceGroupName