Ćwiczenie — dodawanie skryptu wdrożenia do szablonu usługi ARM

Ukończone

Ważne

Do wykonania tego ćwiczenia potrzebna jest własna subskrypcja platformy Azure. Ponadto mogą zostać naliczone opłaty. Jeśli nie masz jeszcze subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.

W ramach procesu wdrażania aplikacji zespołu należy utworzyć konto magazynu i przygotować plik w magazynie obiektów blob, aby aplikacja mogła odczytać. Do tego momentu ręcznie kopiowano plik za każdym razem, gdy skonfigurowano nowe środowisko. Decydujesz się użyć skryptu wdrażania, aby zautomatyzować ten krok w ramach procesu tworzenia środowiska.

W tym ćwiczeniu użyjesz istniejącego szablonu usługi Azure Resource Manager (ARM) i dodasz nowy skrypt wdrożenia.

Podczas tego procesu wykonasz następujące czynności:

  • Utwórz szablon początkowy.
  • Dodaj wymagania wstępne dotyczące skryptów wdrażania, w tym tożsamość zarządzaną przypisaną przez użytkownika i przypisanie roli.
  • Dodaj skrypt wdrożenia.
  • Wdróż szablon i zweryfikuj wynik.

W tym ćwiczeniu używane są narzędzia usługi Azure Resource Manager dla programu Visual Studio Code. Pamiętaj, aby zainstalować to rozszerzenie w programie Visual Studio Code.

W tym ćwiczeniu jest używane rozszerzenie Bicep dla programu Visual Studio Code. Pamiętaj, aby zainstalować to rozszerzenie w programie Visual Studio Code.

Tworzenie szablonu początkowego

Zaczynasz od istniejącego szablonu, którego używa twój zespół. Szablon tworzy konto magazynu, konfiguruje usługi obiektów blob i wymaga protokołu HTTPS oraz tworzy kontener obiektów blob dla plików konfiguracji.

  1. Otwórz Visual Studio Code.

  2. Utwórz nowy plik o nazwie azuredeploy.json.

  3. Zapisz pusty plik, aby program Visual Studio Code ładuje narzędzia szablonu usługi ARM.

    Możesz wybrać pozycję Plik>Zapisz jako lub wybrać klawisze Ctrl+S w systemie Windows (⌘+S w systemie macOS). Pamiętaj, gdzie został zapisany plik. Możesz na przykład utworzyć folder skryptów , w którym ma zostać zapisany.

  4. Skopiuj poniższy szablon początkowy do azuredeploy.json.

    {
        "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
        "contentVersion": "1.0.0.1",
        "apiProfile": "",
        "parameters": {},
        "variables": {
            "storageAccountName": "[concat('storage', uniqueString(resourceGroup().id))]",
            "storageBlobContainerName": "config"
        },
        "functions": [],
        "resources": [
            {
                "name": "[variables('storageAccountName')]",
                "type": "Microsoft.Storage/storageAccounts",
                "apiVersion": "2019-06-01",
                "tags": {
                    "displayName": "[variables('storageAccountName')]"
                },
                "location": "[resourceGroup().location]",
                "kind": "StorageV2",
                "sku": {
                    "name": "Standard_LRS",
                    "tier": "Standard"
                },
                "properties": {
                    "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. Zapisz szablon.

  1. Otwórz Visual Studio Code.

  2. Utwórz nowy plik o nazwie main.bicep.

  3. Zapisz pusty plik, aby program Visual Studio Code ładował narzędzia Bicep.

    Możesz wybrać pozycję Plik>Zapisz jako lub wybrać klawisze Ctrl+S w systemie Windows (⌘+S w systemie macOS). Pamiętaj, gdzie został zapisany plik. Na przykład możesz utworzyć folder scripts , aby go zapisać.

  4. Skopiuj poniższy szablon początkowy do pliku main.bicep.

    var storageAccountName = 'storage${uniqueString(resourceGroup().id)}'
    var storageBlobContainerName = 'config'
    
    resource storageAccount 'Microsoft.Storage/storageAccounts@2019-06-01' = {
      name: storageAccountName
      tags: {
        displayName: storageAccountName
      }
      location: resourceGroup().location
      kind: 'StorageV2'
      sku: {
        name: 'Standard_LRS'
        tier: 'Standard'
      }
      properties: {
        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. Zapisz szablon.

Dodawanie tożsamości zarządzanej przypisanej przez użytkownika

Następnie należy utworzyć tożsamość zarządzaną przypisaną przez użytkownika. Biorąc pod uwagę podejście infrastruktury jako kodu, możesz utworzyć tożsamość w szablonie.

  1. Edytuj sekcję variablesazuredeploy.json , aby uwzględnić następujące elementy:

    "userAssignedIdentityName": "configDeployer",
    
  2. Edytuj sekcję resourcesazuredeploy.json , aby uwzględnić następujące elementy:

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

  1. W obszarze definicji zmiennych w pliku main.bicep dodaj:

    var userAssignedIdentityName = 'configDeployer'
    
  2. W obszarze definicji zasobów dodaj:

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

Ustawianie roli współautora dla tożsamości zarządzanej

Teraz, gdy masz zdefiniowaną tożsamość zarządzaną, możesz przypisać jej rolę z uprawnieniami do grupy zasobów. Przypiszesz mu rolę Współautor. Rola jest identyfikowana według identyfikatora definicji roli, który jest identyfikatorem GUID. Rola Współautor jest wbudowana na platformie Azure, więc identyfikator definicji roli jest udokumentowany.

Przypisanie roli wymaga również nazwy identyfikatora GUID. Za pomocą guid funkcji można utworzyć identyfikator GUID unikatowy dla grupy zasobów i nazwy roli.

  1. Edytuj sekcję variablesazuredeploy.json , aby uwzględnić następujące elementy:

    "roleAssignmentName": "[guid(concat(resourceGroup().id, 'contributor'))]",
    "contributorRoleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
    
  2. Edytuj sekcję resourcesazuredeploy.json , aby uwzględnić następujące elementy:

    {
        "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. Zapisz szablon.

  1. W obszarze definicji zmiennych w pliku main.bicep dodaj:

    var roleAssignmentName = guid(resourceGroup().id, 'contributor')
    var contributorRoleDefinitionId = resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')
    
  2. W obszarze definicji zasobów dodaj:

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

Tworzenie skryptu wdrażania

Teraz masz wszystkie wymagania wstępne dotyczące skryptu wdrażania. Zaczniesz od typowych wartości, których potrzebuje skrypt wdrożenia. Istnieją dwie zależności, przypisanie roli i kontener magazynu obiektów blob. Przed uruchomieniem skryptu skrypt musi istnieć oba te elementy.

  1. Edytuj sekcję variablesazuredeploy.json , aby uwzględnić następujące elementy:

    "deploymentScriptName": "CopyConfigScript"
    
  2. Edytuj sekcję resourcesazuredeploy.json , aby uwzględnić następujące elementy:

    {
        "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. Dodaj sekcję properties do zasobu, aby zdefiniować skrypt i inne wymagane wartości.

    "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. Zapisz szablon.

  1. W obszarze definicji zmiennych w pliku main.bicep dodaj:

    var deploymentScriptName = 'CopyConfigScript'
    
  2. W obszarze definicji zasobów dodaj:

    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. Dodaj sekcję properties do zasobu, aby zdefiniować skrypt i inne wymagane wartości.

    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. Zapisz szablon.

Dodawanie danych wyjściowych szablonu

Teraz, gdy masz skrypt wdrożenia przekazujący plik do usługi Azure Blob Storage, może być konieczne odwołanie się do tej lokalizacji pliku w późniejszej automatyzacji. (Być może uruchomisz test, aby sprawdzić, czy plik jest miejscem, w którym powinno się znajdować).

resources Po sekcji szablonu usługi ARM dodaj dane wyjściowe odwołujące się do identyfikatora URI pliku zgłoszonego przez skrypt wdrożenia.

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

W dolnej części pliku po definicjach zasobów dodaj dane wyjściowe odwołujące się do identyfikatora URI pliku zgłoszonego przez skrypt wdrożenia.

output fileUri string = deploymentScript.properties.outputs.Uri

Weryfikowanie szablonu

Szablon powinien wyglądać następująco:

{
    "$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": "2019-06-01",
            "tags": {
                "displayName": "[variables('storageAccountName')]"
            },
            "location": "[resourceGroup().location]",
            "kind": "StorageV2",
            "sku": {
                "name": "Standard_LRS",
                "tier": "Standard"
            },
            "properties": {
                "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@2019-06-01' = {
  name: storageAccountName
  tags: {
    displayName: storageAccountName
  }
  location: resourceGroup().location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
    tier: 'Standard'
  }
  properties: {
    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

Jeśli tak nie jest, skopiuj przykład lub dostosuj szablon tak, aby był zgodny z przykładem.

Wdrażanie szablonu

Aby wdrożyć ten szablon na platformie Azure, musisz zalogować się na konto platformy Azure z poziomu terminalu programu Visual Studio Code. Upewnij się, że zainstalowano narzędzia interfejsu wiersza polecenia platformy Azure.

  1. W menu Terminal wybierz polecenie New Terminal (Nowy terminal). Okno terminalu zwykle otwiera się w dolnej połowie ekranu.

  2. Jeśli powłoka wyświetlana po prawej stronie okna terminalu jest powłoka bash, prawidłowa powłoka jest otwarta i możesz przejść do następnej sekcji.

    Screenshot of the Visual Studio Code terminal window, with the bash option shown.

  3. Jeśli zostanie wyświetlona powłoka inna niż powłoka bash , wybierz strzałkę listy rozwijanej powłoki, a następnie wybierz pozycję Git Bash.

    Screenshot of the Visual Studio Code terminal window, with the terminal shell dropdown shown and Git Bash Default selected.

  4. Na liście powłok terminali wybierz pozycję bash.

    Screenshot of the Visual Studio Code terminal window, with the bash terminal selected.

  5. W terminalu przejdź do katalogu, w którym zapisano szablon. Jeśli na przykład szablon został zapisany w folderze templates , możesz użyć następującego polecenia:

    cd templates
    

Logowanie się do platformy Azure przy użyciu interfejsu wiersza polecenia platformy Azure

  1. W terminalu programu Visual Studio Code zaloguj się do platformy Azure, uruchamiając następujące polecenie:

    az login
    
  2. W przeglądarce, która zostanie otwarta, zaloguj się do konta platformy Azure.

    W terminalu programu Visual Studio Code zostanie wyświetlona lista subskrypcji skojarzonych z tym kontem.

  3. Na liście znajdź subskrypcję, której chcesz użyć w tym ćwiczeniu.

    Jeśli pominięto listę z logowania, możesz użyć poniższego fragmentu kodu, aby ponownie wyświetlić listę subskrypcji.

    az account list --output table
    
  4. Ustaw domyślną subskrypcję dla wszystkich poleceń interfejsu wiersza polecenia platformy Azure uruchamianych w tej sesji.

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

Aby wdrożyć ten szablon na platformie Azure, musisz zalogować się na konto platformy Azure z poziomu terminalu programu Visual Studio Code. Upewnij się, że zainstalowano narzędzia interfejsu wiersza polecenia platformy Azure.

  1. W menu Terminal wybierz polecenie New Terminal (Nowy terminal). Okno terminalu zwykle otwiera się w dolnej połowie ekranu.

  2. Jeśli powłoka wyświetlana po prawej stronie okna terminalu jest powłoka bash, prawidłowa powłoka jest otwarta i możesz przejść do następnej sekcji.

    Screenshot of the Visual Studio Code terminal window, with the bash option shown.

  3. Jeśli zostanie wyświetlona powłoka inna niż powłoka bash , wybierz strzałkę listy rozwijanej powłoki, a następnie wybierz pozycję Git Bash.

    Screenshot of the Visual Studio Code terminal window, with the terminal shell dropdown shown and Git Bash Default selected.

  4. Na liście powłok terminali wybierz pozycję bash.

    Screenshot of the Visual Studio Code terminal window, with the bash terminal selected.

  5. W terminalu przejdź do katalogu, w którym zapisano szablon. Jeśli na przykład szablon został zapisany w folderze templates , możesz użyć następującego polecenia:

    cd templates
    

Instalowanie aplikacji Bicep

Uruchom następujące polecenie, aby upewnić się, że masz najnowszą wersję aplikacji Bicep:

az bicep install && az bicep upgrade

Logowanie się do platformy Azure przy użyciu interfejsu wiersza polecenia platformy Azure

  1. W terminalu programu Visual Studio Code zaloguj się do platformy Azure, uruchamiając następujące polecenie:

    az login
    
  2. W przeglądarce, która zostanie otwarta, zaloguj się do konta platformy Azure.

    W terminalu programu Visual Studio Code zostanie wyświetlona lista subskrypcji skojarzonych z tym kontem.

  3. Na liście znajdź subskrypcję, której chcesz użyć w tym ćwiczeniu.

    Jeśli pominięto listę z logowania, możesz użyć poniższego fragmentu kodu, aby ponownie wyświetlić listę subskrypcji.

    az account list --output table
    
  4. Ustaw domyślną subskrypcję dla wszystkich poleceń interfejsu wiersza polecenia platformy Azure uruchamianych w tej sesji.

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

Aby wdrożyć ten szablon na platformie Azure, zaloguj się do konta platformy Azure z poziomu terminalu programu Visual Studio Code. Upewnij się, że zainstalowano program Azure PowerShell i zaloguj się do tego samego konta, na którym aktywowano piaskownicę.

  1. W menu Terminal wybierz polecenie New Terminal (Nowy terminal). Okno terminalu zwykle otwiera się w dolnej połowie ekranu.

  2. Jeśli powłoka wyświetlana po prawej stronie okna terminalu to powershell lub pwsh, prawidłowa powłoka jest otwarta i możesz przejść do następnej sekcji.

    Screenshot of the Visual Studio Code terminal window, with the pwsh option displayed in the shell dropdown list.

  3. Jeśli zostanie wyświetlona powłoka inna niż powershell lub pwsh , wybierz strzałkę listy rozwijanej powłoki, a następnie wybierz pozycję PowerShell.

    Screenshot of the Visual Studio Code terminal window, with the terminal shell dropdown list shown and PowerShell selected.

  4. Na liście powłok terminali wybierz pozycję powershell lub pwsh.

    Screenshot of the Visual Studio Code terminal window, with the PowerShell terminal selected.

  5. W terminalu przejdź do katalogu, w którym zapisano szablon. Jeśli na przykład szablon został zapisany w folderze templates , możesz użyć tego polecenia:

    Set-Location -Path templates
    

Logowanie się na platformie Azure przy użyciu programu Azure PowerShell

  1. W terminalu programu Visual Studio Code zaloguj się do platformy Azure, uruchamiając następujące polecenie:

    Connect-AzAccount
    
  2. W przeglądarce, która zostanie otwarta, zaloguj się do konta platformy Azure.

  3. Pobierz identyfikator subskrypcji, której chcesz użyć w tym ćwiczeniu, uruchamiając następujące polecenie:

    Get-AzSubscription
    

    Identyfikatory subskrypcji znajdują się w drugiej kolumnie. Skopiuj drugą kolumnę. Wygląda na to, że cf49fbbc-217c-4eb6-9eb5-a6a6c68295a0.

  4. Ustaw domyślną subskrypcję dla wszystkich poleceń programu Azure PowerShell uruchamianych w tej sesji.

    Set-AzContext -SubscriptionId {Your subscription ID}
    

Aby wdrożyć ten szablon na platformie Azure, zaloguj się do konta platformy Azure z poziomu terminalu programu Visual Studio Code. Upewnij się, że zainstalowano program Azure PowerShell.

  1. W menu Terminal wybierz polecenie New Terminal (Nowy terminal). Okno terminalu zwykle otwiera się w dolnej połowie ekranu.

  2. Jeśli powłoka wyświetlana po prawej stronie okna terminalu to powershell lub pwsh, prawidłowa powłoka jest otwarta i możesz przejść do następnej sekcji.

    Screenshot of the Visual Studio Code terminal window, with the pwsh option displayed in the shell dropdown list.

  3. Jeśli zostanie wyświetlona powłoka inna niż powershell lub pwsh , wybierz strzałkę listy rozwijanej powłoki, a następnie wybierz pozycję PowerShell.

    Screenshot of the Visual Studio Code terminal window, with the terminal shell dropdown list shown and PowerShell selected.

  4. Na liście powłok terminali wybierz pozycję powershell lub pwsh.

    Screenshot of the Visual Studio Code terminal window, with the PowerShell terminal selected.

  5. W terminalu przejdź do katalogu, w którym zapisano szablon. Jeśli na przykład szablon został zapisany w folderze templates , możesz użyć tego polecenia:

    Set-Location -Path templates
    

Instalowanie interfejsu wiersza polecenia Bicep

Aby użyć aplikacji Bicep z poziomu programu Azure PowerShell, zainstaluj interfejs wiersza polecenia Bicep.

Logowanie się na platformie Azure przy użyciu programu Azure PowerShell

  1. W terminalu programu Visual Studio Code zaloguj się do platformy Azure, uruchamiając następujące polecenie:

    Connect-AzAccount
    
  2. W przeglądarce, która zostanie otwarta, zaloguj się do konta platformy Azure.

  3. Pobierz identyfikator subskrypcji, której chcesz użyć w tym ćwiczeniu, uruchamiając następujące polecenie:

    Get-AzSubscription
    

    Identyfikatory subskrypcji znajdują się w drugiej kolumnie. Skopiuj drugą kolumnę. Wygląda na to, że cf49fbbc-217c-4eb6-9eb5-a6a6c68295a0.

  4. Ustaw domyślną subskrypcję dla wszystkich poleceń programu Azure PowerShell uruchamianych w tej sesji.

    Set-AzContext -SubscriptionId {Your subscription ID}
    

Następnie należy utworzyć grupę zasobów, aby zawierała zasoby, które utworzysz w ramach tego ćwiczenia. Korzystając z nowej grupy zasobów, oczyszczanie będzie znacznie łatwiejsze po wykonaniu tego ćwiczenia.

W terminalu w programie Visual Studio Code uruchom następujące polecenie, aby utworzyć grupę zasobów na potrzeby tego ćwiczenia:

Tworzenie grupy zasobów na potrzeby ćwiczenia

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

Uwaga

Jeśli używasz innej nazwy dla grupy zasobów, musisz upewnić się, że skrypt został zaktualizowany. W dalszej części tego modułu zobaczysz, jak uniknąć twardych nazw grup zasobów w skryptach.

Wdrażanie szablonu na platformie Azure

Poniższy kod wdraża szablon usługi Resource Manager na platformie Azure. Zobaczysz pomyślne wdrożenie.

Wdróż szablon przy użyciu poleceń interfejsu wiersza polecenia platformy Azure w terminalu programu Visual Studio Code.

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

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

Poniższy kod wdraża szablon usługi Resource Manager na platformie Azure. Zobaczysz pomyślne wdrożenie.

Wdróż szablon przy użyciu poleceń interfejsu wiersza polecenia platformy Azure w terminalu programu Visual Studio Code.

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

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

Poniższy kod wdraża szablon na platformie Azure. Zobaczysz pomyślne wdrożenie.

Wdróż szablon za pomocą poleceń programu Azure PowerShell w terminalu.

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

Poniższy kod wdraża szablon na platformie Azure. Zobaczysz pomyślne wdrożenie.

Wdróż szablon za pomocą poleceń programu Azure PowerShell w terminalu.

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

Przejrzyj wynik szablonu

Po zakończeniu wdrażania otrzymasz adres URL wskazujący plik skopiowany przez skrypt wdrożenia do magazynu obiektów blob.

  1. Pobierz ten plik przy użyciu danych wyjściowych adresu URL z wdrożenia szablonu, aby potwierdzić, że skrypt wdrożenia działa prawidłowo.

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

    Polecenie zwraca następujący kod.

    {
      "environment": "production",
      "hostname": "tailwindtraders.com",
      "Logging": {
        "LogLevel": {
          "Default": "Debug"
        }
      },
      "ApplicationInsights": {
        "InstrumentationKey": ""
      },
      "AllowedHosts": "*",
      "CosmosDb": {
        "Host": "",
        "Key": "",
        "Database": "Products"
      }
    }
    
  2. Możesz również przejrzeć dzienniki (i inne szczegóły dotyczące wdrożenia) w witrynie Azure Portal lub za pomocą następującego polecenia.

    az deployment-scripts show-log --resource-group $resourceGroupName --name CopyConfigScript
    
  1. Pobierz ten plik przy użyciu danych wyjściowych adresu URL z wdrożenia szablonu, aby potwierdzić, że skrypt wdrożenia działa prawidłowo.

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

    Polecenie zwraca następujący kod.

    environment         : production
    hostname            : tailwindtraders.com
    Logging             : @{LogLevel=}
    ApplicationInsights : @{InstrumentationKey=}
    AllowedHosts        : *
    CosmosDb            : @{Host=; Key=; Database=Products}
    
  2. Możesz również przejrzeć dzienniki (i inne szczegóły dotyczące wdrożenia) w witrynie Azure Portal lub przy użyciu następującego wiersza polecenia.

    Get-AzDeploymentScriptLog -ResourceGroupName $resourceGroupName -Name CopyConfigScript
    

Czyszczenie grupy zasobów

Po pomyślnym wdrożeniu szablonu usługi ARM za pomocą skryptu wdrażania możesz usunąć grupę zasobów zawierającą wszystkie utworzone zasoby i przypisania ról.

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