Упражнение. Добавление сценария развертывания в шаблон 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-объектов для файлов конфигурации.
Откройте Visual Studio Code.
Создайте новый файл с именем azuredeploy.json.
Сохраните пустой файл, чтобы Visual Studio Code загрузил инструменты шаблона ARM.
Можно выбрать Файл>Сохранить как или нажать клавиши CTRL+S в Windows (⌘+S в macOS). Обязательно запомните, где сохранен файл. Например, может потребоваться создать папку скриптов , в которой она будет сохранена.
Скопируйте следующий начальный шаблон в 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" } } ] }
Сохраните шаблон.
Откройте Visual Studio Code.
Создайте файл с именем main.bicep.
Сохраните пустой файл, куда Visual Studio Code загрузит средства Bicep.
Можно выбрать Файл>Сохранить как или нажать клавиши CTRL+S в Windows (⌘+S в macOS). Обязательно запомните, где сохранен файл. Например, можно создать для него папку scripts.
Скопируйте следующий начальный шаблон в 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' } }
Сохраните шаблон.
Добавление управляемого удостоверения, назначаемого пользователем
Далее необходимо создать назначенное пользователем управляемое удостоверение. Используя модель «инфраструктура как код», можно создать удостоверение в шаблоне.
Измените раздел
variables
файла azuredeploy.json, чтобы включить в него следующее:"userAssignedIdentityName": "configDeployer",
Измените раздел
resources
файла azuredeploy.json, чтобы включить в него следующее:{ "type": "Microsoft.ManagedIdentity/userAssignedIdentities", "apiVersion": "2018-11-30", "name": "[variables('userAssignedIdentityName')]", "location": "[resourceGroup().location]" }
Сохраните шаблон.
В определениях переменных в main.bicepдобавьте:
var userAssignedIdentityName = 'configDeployer'
В разделе определений ресурсов добавьте:
resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' = { name: userAssignedIdentityName location: resourceGroup().location }
Сохраните шаблон.
Настройка роли участника для управляемого удостоверения
После того как вы определите управляемое удостоверение, можно назначить ему роль с правами для группы ресурсов. Вы назначите ему роль Участник. Роль определяется по идентификатору определения роли — GUID. Роль Участник встроена в Azure, поэтому идентификатор определения роли задокументирован.
Для назначения роли также требуется имя GUID. С помощью функции guid
можно создать уникальный идентификатор GUID для группы ресурсов и имени роли.
Измените раздел
variables
файла azuredeploy.json, чтобы включить в него следующее:"roleAssignmentName": "[guid(concat(resourceGroup().id, 'contributor'))]", "contributorRoleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
Измените раздел
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" } }
Сохраните шаблон.
В определениях переменных в main.bicepдобавьте:
var roleAssignmentName = guid(resourceGroup().id, 'contributor') var contributorRoleDefinitionId = resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')
В разделе определений ресурсов добавьте:
resource roleAssignment 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = { name: roleAssignmentName properties: { roleDefinitionId: contributorRoleDefinitionId principalId: userAssignedIdentity.properties.principalId principalType: 'ServicePrincipal' } }
Сохраните шаблон.
Создание сценария развертывания
Теперь у вас есть все необходимые компоненты для сценария развертывания. Начнем с общих значений, которые требуются для сценария развертывания. Существует две зависимости: назначение ролей и контейнер хранилища BLOB-объектов. Для запуска сценария необходимо создать обе.
Измените раздел
variables
файла azuredeploy.json, чтобы включить в него следующее:"deploymentScriptName": "CopyConfigScript"
Измените раздел
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'))]": {} } } }
Добавьте раздел
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" }
Сохраните шаблон.
В определениях переменных в main.bicepдобавьте:
var deploymentScriptName = 'CopyConfigScript'
В разделе определений ресурсов добавьте:
resource deploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = { name: deploymentScriptName location: resourceGroup().location kind: 'AzurePowerShell' identity: { type: 'UserAssigned' userAssignedIdentities: { '${userAssignedIdentity.id}': {} } } dependsOn: [ roleAssignment blobContainer ] }
Добавьте раздел
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' }
Сохраните шаблон.
Добавление выходных данных шаблона
Теперь, когда сценарий развертывания отправляет файл в службу хранилища 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 установлены.
В меню Терминал выберите Новый терминал. Окно терминала обычно открывается в нижней половине экрана.
Если окно терминала отображает bash справа , это означает, что правильная оболочка уже открыта. Кроме того, если вы видите значок оболочки Bash справа, его можно выбрать для запуска оболочки.
Если появится оболочка, отличной от bash , выберите стрелку раскрывающегося списка оболочки и выберите Git Bash.
Перейдите в терминале в каталог, где сохранили свой шаблон. Например, если вы сохранили его в папке templates, можно использовать следующую команду:
cd templates
Вход в Azure с помощью Azure CLI
В окне терминала Visual Studio Code войдите в Azure, выполнив следующую команду:
az login
В открывшемся браузере войдите в свою учетную запись Azure.
Терминал Visual Studio Code отобразит список подписок, связанных с данной учетной записью.
В списке найдите подписку, которую вы хотите использовать для этого упражнения.
Если вы пропустили список при входе, можно использовать следующий фрагмент кода для повторного составления списка подписок.
az account list --output table
Установите подписку по умолчанию для всех команд Azure CLI, которые выполняются во время этого сеанса:
az account set --subscription "Your Subscription Name or ID"
Чтобы развернуть этот шаблон в Azure, необходимо войти в свою учетную запись Azure из терминала Visual Studio Code. Убедитесь, что средства Azure CLI установлены.
В меню Терминал выберите Новый терминал. Окно терминала обычно открывается в нижней половине экрана.
Если окно терминала отображает bash справа , это означает, что правильная оболочка уже открыта. Кроме того, если вы видите значок оболочки Bash справа, его можно выбрать для запуска оболочки.
Если появится оболочка, отличной от bash , выберите стрелку раскрывающегося списка оболочки и выберите Git Bash.
Перейдите в терминале в каталог, где сохранили свой шаблон. Например, если вы сохранили его в папке templates, можно использовать следующую команду:
cd templates
Установка Bicep
Выполните следующую команду, чтобы убедиться, что у вас установлена последняя версия Bicep:
az bicep install && az bicep upgrade
Вход в Azure с помощью Azure CLI
В окне терминала Visual Studio Code войдите в Azure, выполнив следующую команду:
az login
В открывшемся браузере войдите в свою учетную запись Azure.
Терминал Visual Studio Code отобразит список подписок, связанных с данной учетной записью.
В списке найдите подписку, которую вы хотите использовать для этого упражнения.
Если вы пропустили список при входе, можно использовать следующий фрагмент кода для повторного составления списка подписок.
az account list --output table
Установите подписку по умолчанию для всех команд Azure CLI, которые выполняются во время этого сеанса:
az account set --subscription "Your Subscription Name or ID"
Чтобы развернуть этот шаблон в Azure, войдите в свою учетную запись Azure из терминала Visual Studio Code. Убедитесь, что вы установили Azure PowerShell, и войдите в ту же учетную запись, которая активировала песочницу.
В меню Терминал выберите Новый терминал. Окно терминала обычно открывается в нижней половине экрана.
Если окно терминала отображает pwsh или powershell справа, это означает, что правильная оболочка уже открыта. Кроме того, если вы видите значок оболочки PowerShell справа, его можно выбрать для запуска оболочки.
Если появится оболочка, отличной от pwsh или PowerShell , выберите стрелку раскрывающегося списка оболочки и выберите PowerShell.
Перейдите в терминале в каталог, где сохранили свой шаблон. Например, если вы сохранили его в папке templates, можно использовать следующую команду:
Set-Location -Path templates
Вход в Azure с помощью Azure PowerShell
В окне терминала Visual Studio Code войдите в Azure, выполнив следующую команду:
Connect-AzAccount
В открывшемся браузере войдите в свою учетную запись Azure.
Получите идентификатор подписки, которую вы хотите использовать для этого упражнения, выполнив следующую команду:
Get-AzSubscription
Идентификатор подписки находится во втором столбце. Скопируйте второй столбец. Он выглядит примерно так, как aaaa0a0a-bb1b-cc2c-dd3d-eeee4e4e4e4e4e4e4e.
Установите подписку по умолчанию для всех команд Azure PowerShell, которые вы выполняете в этом сеансе:
Set-AzContext -SubscriptionId {Your subscription ID}
Чтобы развернуть этот шаблон в Azure, войдите в свою учетную запись Azure из терминала Visual Studio Code. Убедитесь, что Azure PowerShell установлено.
В меню Терминал выберите Новый терминал. Окно терминала обычно открывается в нижней половине экрана.
Если окно терминала отображает pwsh или powershell справа, это означает, что правильная оболочка уже открыта. Кроме того, если вы видите значок оболочки PowerShell справа, его можно выбрать для запуска оболочки.
Если появится оболочка, отличной от pwsh или PowerShell , выберите стрелку раскрывающегося списка оболочки и выберите PowerShell.
Перейдите в терминале в каталог, где сохранили свой шаблон. Например, если вы сохранили его в папке templates, можно использовать следующую команду:
Set-Location -Path templates
Установите Bicep CLI
Чтобы использовать Bicep из Azure PowerShell, установите Bicep CLI.
Вход в Azure с помощью Azure PowerShell
В окне терминала Visual Studio Code войдите в Azure, выполнив следующую команду:
Connect-AzAccount
В открывшемся браузере войдите в свою учетную запись Azure.
Получите идентификатор подписки, которую вы хотите использовать для этого упражнения, выполнив следующую команду:
Get-AzSubscription
Идентификатор подписки находится во втором столбце. Скопируйте второй столбец. Он выглядит примерно так, как aaaa0a0a-bb1b-cc2c-dd3d-eeee4e4e4e4e4e4e4e.
Установите подписку по умолчанию для всех команд 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-объектов.
Извлеките этот файл, используя выходные данные 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" } }
Кроме того, можно просмотреть журналы (и другие сведения о развертывании) на портале Azure или использовать для этого следующую команду.
az deployment-scripts show-log --resource-group $resourceGroupName --name CopyConfigScript
Извлеките этот файл, используя выходные данные 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}
Кроме того, можно просмотреть журналы (и другие сведения о развертывании) на портале Azure или использовать для этого следующую командную строку.
Get-AzDeploymentScriptLog -ResourceGroupName $resourceGroupName -Name CopyConfigScript
Очистка группы ресурсов
После успешного развертывания шаблона ARM с помощью сценария развертывания можно удалить группу ресурсов, которая содержит все созданные ресурсы и назначения ролей.
az group delete --name $resourceGroupName
Remove-AzResourceGroup -Name $resourceGroupName