Упражнение. Добавление сценария развертывания в шаблон ARM

Завершено

Внимание

Для выполнения этого упражнения вам нужна собственная подписка Azure. При этом с вас может взиматься плата. Если у вас еще нет подписки Azure, создайте бесплатную учетную запись, прежде чем начинать работу.

В рамках процесса развертывания приложений команды необходимо создать учетную запись хранения и подготовить файл в хранилище BLOB-объектов для чтения приложения. До этого момента файлы приходилось копировать вручную каждый раз при настройке новой среды. Вы решили использовать скрипт развертывания для автоматизации этого шага в рамках процесса создания среды.

В этом упражнении вы перейдете к существующему шаблону Azure Resource Manager (ARM) и добавите новый сценарий развертывания.

В процессе вы:

  • Создайте начальный шаблон.
  • Добавьте необходимые компоненты для сценариев развертывания, включая назначенное пользователем управляемое удостоверение и назначение ролей.
  • Добавьте сценарий развертывания.
  • Разверните шаблон и проверьте результат.

В этом упражнении используются инструменты Azure Resource Manager для Visual Studio Code. Убедитесь, что это расширение установлено в Visual Studio Code.

В этом упражнении используется расширение Bicep для Visual Studio Code. Убедитесь, что это расширение установлено в Visual Studio Code.

Создание начального шаблона

Начните с существующего шаблона, который использовался вашей командой. Шаблон создает учетную запись хранения, настраивает службы BLOB-объектов и требует наличия протокола HTTPS, а также создает контейнер BLOB-объектов для файлов конфигурации.

  1. Откройте Visual Studio Code.

  2. Создайте новый файл с именем azuredeploy.json.

  3. Сохраните пустой файл, чтобы Visual Studio Code загрузил инструменты шаблона ARM.

    Можно выбрать Файл>Сохранить как или нажать клавиши CTRL+S в Windows (⌘+S в macOS). Обязательно запомните, где сохранен файл. Например, может потребоваться создать папку скриптов , в которой она будет сохранена.

  4. Скопируйте следующий начальный шаблон в 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. Сохраните шаблон.

  1. Откройте Visual Studio Code.

  2. Создайте файл с именем main.bicep.

  3. Сохраните пустой файл, куда Visual Studio Code загрузит средства Bicep.

    Можно выбрать Файл>Сохранить как или нажать клавиши CTRL+S в Windows (⌘+S в macOS). Обязательно запомните, где сохранен файл. Например, можно создать для него папку scripts.

  4. Скопируйте следующий начальный шаблон в 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. Сохраните шаблон.

Добавление управляемого удостоверения, назначаемого пользователем

Далее необходимо создать назначенное пользователем управляемое удостоверение. Используя модель «инфраструктура как код», можно создать удостоверение в шаблоне.

  1. Измените раздел variables файла azuredeploy.json, чтобы включить в него следующее:

    "userAssignedIdentityName": "configDeployer",
    
  2. Измените раздел resources файла azuredeploy.json, чтобы включить в него следующее:

    {
        "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
        "apiVersion": "2018-11-30",
        "name": "[variables('userAssignedIdentityName')]",
        "location": "[resourceGroup().location]"
    }
    
  3. Сохраните шаблон.

  1. В определениях переменных в main.bicepдобавьте:

    var userAssignedIdentityName = 'configDeployer'
    
  2. В разделе определений ресурсов добавьте:

    resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' = {
      name: userAssignedIdentityName
      location: resourceGroup().location
    }
    
  3. Сохраните шаблон.

Настройка роли участника для управляемого удостоверения

После того как вы определите управляемое удостоверение, можно назначить ему роль с правами для группы ресурсов. Вы назначите ему роль Участник. Роль определяется по идентификатору определения роли — GUID. Роль Участник встроена в Azure, поэтому идентификатор определения роли задокументирован.

Для назначения роли также требуется имя GUID. С помощью функции guid можно создать уникальный идентификатор GUID для группы ресурсов и имени роли.

  1. Измените раздел variables файла azuredeploy.json, чтобы включить в него следующее:

    "roleAssignmentName": "[guid(concat(resourceGroup().id, 'contributor'))]",
    "contributorRoleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
    
  2. Измените раздел resources файла azuredeploy.json, чтобы включить в него следующее:

    {
        "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. Сохраните шаблон.

  1. В определениях переменных в main.bicepдобавьте:

    var roleAssignmentName = guid(resourceGroup().id, 'contributor')
    var contributorRoleDefinitionId = resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')
    
  2. В разделе определений ресурсов добавьте:

    resource roleAssignment 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = {
      name: roleAssignmentName
      properties: {
        roleDefinitionId: contributorRoleDefinitionId
        principalId: userAssignedIdentity.properties.principalId
        principalType: 'ServicePrincipal'
      }
    }
    
  3. Сохраните шаблон.

Создание сценария развертывания

Теперь у вас есть все необходимые компоненты для сценария развертывания. Начнем с общих значений, которые требуются для сценария развертывания. Существует две зависимости: назначение ролей и контейнер хранилища BLOB-объектов. Для запуска сценария необходимо создать обе.

  1. Измените раздел variables файла azuredeploy.json, чтобы включить в него следующее:

    "deploymentScriptName": "CopyConfigScript"
    
  2. Измените раздел resources файла azuredeploy.json, чтобы включить в него следующее:

    {
        "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. Добавьте раздел properties в ресурс, чтобы определить сценарий и другие обязательные значения.

    "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. Сохраните шаблон.

  1. В определениях переменных в main.bicepдобавьте:

    var deploymentScriptName = 'CopyConfigScript'
    
  2. В разделе определений ресурсов добавьте:

    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. Добавьте раздел properties в ресурс, чтобы определить сценарий и другие обязательные значения.

    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. Сохраните шаблон.

Добавление выходных данных шаблона

Теперь, когда сценарий развертывания отправляет файл в службу хранилища BLOB-объектов Azure, может потребоваться создать ссылку на это расположение файла в последующем процессе автоматизации. Возможно, вам придется провести тест, чтобы проверить, что файл будет там, где вы ожидаете.

После раздела resources шаблона ARM добавьте выходные данные, которые ссылаются на универсальный код ресурса (URI) для файла, сообщаемый сценарием развертывания.

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

В нижней части файла после определений ресурсов добавьте выходные данные, которые ссылаются на универсальный код ресурса (URI) для файла, который сообщается сценарием развертывания.

output fileUri string = deploymentScript.properties.outputs.Uri

Проверка шаблона

Шаблон должен выглядеть следующим образом:

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

Если это не так, скопируйте пример или настройте шаблон в соответствии с примером.

Развертывание шаблона

Чтобы развернуть этот шаблон в Azure, необходимо войти в свою учетную запись Azure из терминала Visual Studio Code. Убедитесь, что средства Azure CLI установлены.

  1. В меню Терминал выберите Новый терминал. Окно терминала обычно открывается в нижней половине экрана.

  2. Если оболочка в правой части окна терминала указана как bash, то открыта подходящая оболочка, и вы можете перейти к следующему разделу.

    Снимок экрана: окно терминала Visual Studio Code с bash.

  3. Если появится оболочка, отличной от bash, выберите стрелку раскрывающегося списка оболочки и выберите Azure Cloud Shell (Bash).

    Снимок экрана: окно терминала Visual Studio Code, где отображается раскрывающийся список оболочек терминала и выбран параметр

  4. В списке оболочек терминала выберите bash.

    Снимок экрана: окно терминала Visual Studio Code с выбранным терминалом bash.

  5. Перейдите в терминале в каталог, где сохранили свой шаблон. Например, если вы сохранили его в папке templates, можно использовать следующую команду:

    cd templates
    

Вход в Azure с помощью Azure CLI

  1. В окне терминала Visual Studio Code войдите в Azure, выполнив следующую команду:

    az login
    
  2. В открывшемся браузере войдите в свою учетную запись Azure.

    Терминал Visual Studio Code отобразит список подписок, связанных с данной учетной записью.

  3. В списке найдите подписку, которую вы хотите использовать для этого упражнения.

    Если вы пропустили список при входе, можно использовать следующий фрагмент кода для повторного составления списка подписок.

    az account list --output table
    
  4. Установите подписку по умолчанию для всех команд Azure CLI, которые выполняются во время этого сеанса:

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

Чтобы развернуть этот шаблон в Azure, необходимо войти в свою учетную запись Azure из терминала Visual Studio Code. Убедитесь, что средства Azure CLI установлены.

  1. В меню Терминал выберите Новый терминал. Окно терминала обычно открывается в нижней половине экрана.

  2. Если оболочка в правой части окна терминала указана как bash, то открыта подходящая оболочка, и вы можете перейти к следующему разделу.

    Снимок экрана: окно терминала Visual Studio Code с bash.

  3. Если появится оболочка, отличной от bash, выберите стрелку раскрывающегося списка оболочки и выберите Azure Cloud Shell (Bash).

    Снимок экрана: окно терминала Visual Studio Code, где отображается раскрывающийся список оболочек терминала и выбран параметр

  4. В списке оболочек терминала выберите bash.

    Снимок экрана: окно терминала Visual Studio Code с выбранным терминалом bash.

  5. Перейдите в терминале в каталог, где сохранили свой шаблон. Например, если вы сохранили его в папке templates, можно использовать следующую команду:

    cd templates
    

Установка Bicep

Выполните следующую команду, чтобы убедиться, что у вас установлена последняя версия Bicep:

az bicep install && az bicep upgrade

Вход в Azure с помощью Azure CLI

  1. В окне терминала Visual Studio Code войдите в Azure, выполнив следующую команду:

    az login
    
  2. В открывшемся браузере войдите в свою учетную запись Azure.

    Терминал Visual Studio Code отобразит список подписок, связанных с данной учетной записью.

  3. В списке найдите подписку, которую вы хотите использовать для этого упражнения.

    Если вы пропустили список при входе, можно использовать следующий фрагмент кода для повторного составления списка подписок.

    az account list --output table
    
  4. Установите подписку по умолчанию для всех команд Azure CLI, которые выполняются во время этого сеанса:

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

Чтобы развернуть этот шаблон в Azure, войдите в свою учетную запись Azure из терминала Visual Studio Code. Убедитесь, что вы установили Azure PowerShell, и войдите в ту же учетную запись, которая активировала песочницу.

  1. В меню Терминал выберите Новый терминал. Окно терминала обычно открывается в нижней половине экрана.

  2. Если оболочка, показанная справа от окна терминала, powershell или pwsh, открыта правильная оболочка, и вы можете перейти к следующему разделу.

    Снимок экрана: окно терминала Visual Studio Code с параметром pwsh, отображаемым в раскрывающемся списке оболочки.

  3. Если появится оболочка, отличной от powershell или pwsh , выберите стрелку раскрывающегося списка оболочки и выберите PowerShell.

    Снимок экрана: окно терминала Visual Studio Code с раскрывающимся списком оболочки терминала и выбранным PowerShell.

  4. В списке оболочек терминала выберите PowerShell или pwsh.

    Снимок экрана: окно терминала Visual Studio Code с выбранным терминалом PowerShell.

  5. Перейдите в терминале в каталог, где сохранили свой шаблон. Например, если вы сохранили его в папке templates, можно использовать следующую команду:

    Set-Location -Path templates
    

Вход в Azure с помощью Azure PowerShell

  1. В окне терминала Visual Studio Code войдите в Azure, выполнив следующую команду:

    Connect-AzAccount
    
  2. В открывшемся браузере войдите в свою учетную запись Azure.

  3. Получите идентификатор подписки, которую вы хотите использовать для этого упражнения, выполнив следующую команду:

    Get-AzSubscription
    

    Идентификатор подписки находится во втором столбце. Скопируйте второй столбец. Он будет иметь вид наподобие cf49fbbc-217c-4eb6-9eb5-a6a6c68295a0.

  4. Установите подписку по умолчанию для всех команд Azure PowerShell, которые вы выполняете в этом сеансе:

    Set-AzContext -SubscriptionId {Your subscription ID}
    

Чтобы развернуть этот шаблон в Azure, войдите в свою учетную запись Azure из терминала Visual Studio Code. Убедитесь, что Azure PowerShell установлено.

  1. В меню Терминал выберите Новый терминал. Окно терминала обычно открывается в нижней половине экрана.

  2. Если оболочка, показанная справа от окна терминала, powershell или pwsh, открыта правильная оболочка, и вы можете перейти к следующему разделу.

    Снимок экрана: окно терминала Visual Studio Code с параметром pwsh, отображаемым в раскрывающемся списке оболочки.

  3. Если появится оболочка, отличной от powershell или pwsh , выберите стрелку раскрывающегося списка оболочки и выберите PowerShell.

    Снимок экрана: окно терминала Visual Studio Code с раскрывающимся списком оболочки терминала и выбранным PowerShell.

  4. В списке оболочек терминала выберите PowerShell или pwsh.

    Снимок экрана: окно терминала Visual Studio Code с выбранным терминалом PowerShell.

  5. Перейдите в терминале в каталог, где сохранили свой шаблон. Например, если вы сохранили его в папке templates, можно использовать следующую команду:

    Set-Location -Path templates
    

Установите Bicep CLI

Чтобы использовать Bicep из Azure PowerShell, установите Bicep CLI.

Вход в Azure с помощью Azure PowerShell

  1. В окне терминала Visual Studio Code войдите в Azure, выполнив следующую команду:

    Connect-AzAccount
    
  2. В открывшемся браузере войдите в свою учетную запись Azure.

  3. Получите идентификатор подписки, которую вы хотите использовать для этого упражнения, выполнив следующую команду:

    Get-AzSubscription
    

    Идентификатор подписки находится во втором столбце. Скопируйте второй столбец. Он будет иметь вид наподобие cf49fbbc-217c-4eb6-9eb5-a6a6c68295a0.

  4. Установите подписку по умолчанию для всех команд Azure PowerShell, которые вы выполняете в этом сеансе:

    Set-AzContext -SubscriptionId {Your subscription ID}
    

Далее необходимо создать группу ресурсов для хранения ресурсов, которые будут созданы в рамках этого упражнения. При использовании новой группы ресурсов выполнять очистку после упражнения будет гораздо проще.

Из терминала в Visual Studio Code выполните следующую команду, чтобы создать группу ресурсов для этого упражнения.

Создайте группу ресурсов для упражнения

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

Примечание.

Если вы используете другое имя для группы ресурсов, необходимо обновить сценарий. Далее в этом модуле вы узнаете, как избежать жесткого написания имен групп ресурсов в скриптах.

Развертывание шаблона в Azure

Следующий код развертывает шаблон ARM в Azure. Вы увидите успешное развертывание.

Разверните шаблон с помощью команд Azure CLI в терминале 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

Следующий код развертывает шаблон ARM в Azure. Вы увидите успешное развертывание.

Разверните шаблон с помощью команд Azure CLI в терминале 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

Следующий код развертывает шаблон в Azure. Вы увидите успешное развертывание.

Разверните шаблон, выполнив в терминале следующие команды Azure PowerShell.

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

Следующий код развертывает шаблон в Azure. Вы увидите успешное развертывание.

Разверните шаблон, выполнив в терминале следующие команды Azure PowerShell.

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

Проверка результата для шаблона

По завершении развертывания вам будет предоставлен URL-адрес, указывающий на файл, скопированный сценарием развертывания в хранилище BLOB-объектов.

  1. Извлеките этот файл, используя выходные данные URL-адреса из развертывания шаблона, чтобы убедиться в том, что сценарий развертывания сработал правильно.

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

    Команда возвращает следующий код.

    {
      "environment": "production",
      "hostname": "tailwindtraders.com",
      "Logging": {
        "LogLevel": {
          "Default": "Debug"
        }
      },
      "ApplicationInsights": {
        "InstrumentationKey": ""
      },
      "AllowedHosts": "*",
      "CosmosDb": {
        "Host": "",
        "Key": "",
        "Database": "Products"
      }
    }
    
  2. Кроме того, можно просмотреть журналы (и другие сведения о развертывании) на портале Azure или использовать для этого следующую команду.

    az deployment-scripts show-log --resource-group $resourceGroupName --name CopyConfigScript
    
  1. Извлеките этот файл, используя выходные данные URL-адреса из развертывания шаблона, чтобы убедиться в том, что сценарий развертывания сработал правильно.

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

    Команда возвращает следующий код.

    environment         : production
    hostname            : tailwindtraders.com
    Logging             : @{LogLevel=}
    ApplicationInsights : @{InstrumentationKey=}
    AllowedHosts        : *
    CosmosDb            : @{Host=; Key=; Database=Products}
    
  2. Кроме того, можно просмотреть журналы (и другие сведения о развертывании) на портале Azure или использовать для этого следующую командную строку.

    Get-AzDeploymentScriptLog -ResourceGroupName $resourceGroupName -Name CopyConfigScript
    

Очистка группы ресурсов

После успешного развертывания шаблона ARM с помощью сценария развертывания можно удалить группу ресурсов, которая содержит все созданные ресурсы и назначения ролей.

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