Упражнение. Добавление условной логики в шаблон ARM
В предыдущих упражнениях вы работали с виртуальными машинами Linux. Здесь мы перейдем на несколько экранов и займемся управлением учетными записями хранения.
Предположим, что у вас есть три среды, которые необходимо развернуть в следующих средах: разработка, промежуточное развертывание и рабочая среда.
- Среда Dev — это первое место, где собрано все необходимое для вашего приложения. Эта среда может содержать веб-серверы, подсистему балансировки нагрузки и базу данных.
- Среда Staging — это место окончательного тестирования перед выпуском новых функций приложения для конечных пользователей.
- Среда Production — это место, где конечные пользователи получают доступ к приложению.
При переходе со среды Dev к Production требуется дополнительная инфраструктура. Например, в среде Production требуется дополнительная учетная запись хранения, которая не нужна в предыдущих средах.
Здесь вы используете условие для управления подготовкой учетной записи хранения. Это позволит поддерживать каждую из сред инфраструктуры из одного и того же шаблона ARM.
Создание шаблона ARM
Здесь вы создаете шаблон Azure Resource Manager (ARM), который определяет ресурс учетной записи хранения.
Шаблон также определяет два параметра.
environment
: имя текущей среды.storageAccountName
: имя учетной записи хранения.
environment
может принимать одно из трех значений: dev
, staging
или production
. Условие подготавливает учетную запись хранения, только если environment
равно production
.
В Visual Studio Code создайте файл с именем condition.json в том же каталоге, который содержит azuredeploy.json.
Добавьте это содержимое в файл condition.json:
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "environment": { "type": "string", "defaultValue": "dev", "allowedValues": [ "dev", "staging", "production" ], "metadata": { "description": "a value that represents the current environment" } }, "storageAccountName": { "type": "string", "metadata": { "description": "a name for the account" } } }, "functions": [], "variables": {}, "resources": [ { "condition": "[equals(parameters('environment'),'production')]", "name": "[parameters('storageAccountName')]", "type": "Microsoft.Storage/storageAccounts", "apiVersion": "2019-06-01", "tags": { "displayName": "[parameters('storageAccountName')]" }, "location": "[resourceGroup().location]", "kind": "StorageV2", "sku": { "name": "Premium_LRS", "tier": "Premium" } } ], "outputs": {} }
Здесь вы развернете шаблон ARM с конструкцией condition, используя PowerShell и модуль Az.
Подготовка среды "Dev"
Здесь шаблон ARM развертывается в среде Dev. Это можно сделать, задав для параметра шаблона environment
значение dev
.
Так как условие подготавливает учетную запись хранения только в том случае, если environment
имеет значение production
, шаблон не будет подготавливать учетную запись хранения. Иными словами, предполагается, что развертывание содержит нулевые ресурсы.
Создайте переменную PowerShell, содержащую имя учетной записи хранения.
$STORAGE_ACCT_NAME="tailwindsa"+ (Get-Random -COUNT 1 -Maximum 9999999 )
Имена учетных записей хранения должны быть уникальными. Часть
Get-Random
гарантирует, что имя учетной записи хранения заканчивается случайной серией цифр.Выполните следующую
New-AzResourceGroupDeployment
команду, чтобы развернуть шаблон в среде разработки:New-AzResourceGroupDeployment ` -TemplateFile "./condition.json" ` -storageAccountName $STORAGE_ACCT_NAME ` -environment dev
Проверка развертывания типа "Dev"
Помните, что шаблон не должен подготавливать учетную запись хранения.
Выполните команду Get-AzStorageAccount
, чтобы проверить, используется ли уже имя учетной записи хранения.
Выполните команду Get-AzStorageAccount
.
Get-AzStorageAccount -Name $STORAGE_ACCT_NAME -ResourceGroupName <rgn>sandbox resource group</rgn>
Результат будет примерно таким:
Get-AzStorageAccount: The Resource 'Microsoft.Storage/storageAccounts/tailwindsa4736629' under resource group '<rgn>name of resource group</rgn>' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix
Это указывает, что учетная запись хранения еще не подготовлена. Это необходимо, так как вы еще не развернули среду "Production".
Подготовка среды "Production"
Здесь шаблон ARM развертывается в среде Production, аналогично тому, как это делалось для среды Dev.
Напомним, как выглядит условие в шаблоне:
"condition": "[equals(parameters('environment'),'production')]"
Чтобы активировать это условие, задайте для параметра шаблона environment
значение production
.
Выполните следующую New-AzResourceGroupDeployment
команду, чтобы развернуть шаблон в рабочей среде:
New-AzResourceGroupDeployment `
-TemplateFile "./condition.json" `
-storageAccountName $STORAGE_ACCT_NAME `
-environment production
Проверка развертывания в среде Production
Теперь шаблон уже должен подготавливать учетную запись хранения.
Выполните команду Get-AzStorageAccount
еще раз, чтобы убедиться в том, что имя учетной записи хранения используется.
Выполните следующую команду Get-AzStorageAccount
.
Get-AzStorageAccount -Name $STORAGE_ACCT_NAME -ResourceGroupName <rgn>sandbox resource group</rgn>
На этот раз вы получите другие выходные данные. Вместо сообщения об ошибке отображается эта таблица, в которой содержатся сведения о ресурсе учетной записи хранения.
Результат будет примерно таким:
Location Name Type Kind
-------- ---- ---- ----
westus tailwindsa4736629 Microsoft.Storage/storageAccounts StorageV2
Эти значения показывают, что учетная запись хранения подготовлена в соответствии с ожиданиями.
Несмотря на простоту примера, вы уже знаете, как выполнить развертывание на основе условия.
На практике среды Dev, Staging и Production будут содержать дополнительные ресурсы Azure для поддержки вычислительных, сетевых возможностей и задач хранения. Каждая среда, скорее всего, будет управляться через собственную группу ресурсов, чтобы ее можно было подготавливать и рассматривать как единое целое.
Создание шаблона ARM
Здесь вы создаете шаблон Azure Resource Manager (ARM), который определяет ресурс учетной записи хранения.
Шаблон также определяет два параметра.
environment
: имя текущей среды.storageAccountName
: имя учетной записи хранения.
environment
может принимать одно из трех значений: dev
, staging
или production
. Условие подготавливает учетную запись хранения, только если environment
равно production
.
В Visual Studio Code создайте файл с именем condition.json в том же каталоге, который содержит azuredeploy.json.
Добавьте это содержимое в файл condition.json:
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "environment": { "type": "string", "defaultValue": "dev", "allowedValues": [ "dev", "staging", "production" ], "metadata": { "description": "a value that represents the current environment" } }, "storageAccountName": { "type": "string", "metadata": { "description": "a name for the account" } } }, "functions": [], "variables": {}, "resources": [ { "condition": "[equals(parameters('environment'),'production')]", "name": "[parameters('storageAccountName')]", "type": "Microsoft.Storage/storageAccounts", "apiVersion": "2019-06-01", "tags": { "displayName": "[parameters('storageAccountName')]" }, "location": "[resourceGroup().location]", "kind": "StorageV2", "sku": { "name": "Premium_LRS", "tier": "Premium" } } ], "outputs": {} }
Подготовка среды "Dev"
Здесь шаблон ARM развертывается в среде Dev. Это можно сделать, задав для параметра шаблона environment
значение dev
.
Так как условие подготавливает учетную запись хранения только в том случае, если environment
имеет значение production
, шаблон не будет подготавливать учетную запись хранения. Иными словами, предполагается, что развертывание содержит нулевые ресурсы.
Создайте переменную Bash, содержащую имя учетной записи хранения.
STORAGE_ACCT_NAME=tailwindsa$RANDOM
Имена учетных записей хранения должны быть уникальными. Часть
$RANDOM
гарантирует, что имя учетной записи хранения заканчивается случайной серией цифр.Выполните следующую
az deployment group create
команду, чтобы развернуть шаблон в среде разработки:az deployment group create \ --template-file condition.json \ --parameters storageAccountName=$STORAGE_ACCT_NAME environment=dev
Проверка развертывания типа "Dev"
Помните, что шаблон не должен подготавливать учетную запись хранения.
Выполните команду az storage account check-name
, чтобы проверить, используется ли уже имя учетной записи хранения.
Выполните следующую команду az storage account check-name
.
az storage account check-name --name $STORAGE_ACCT_NAME
Вы увидите примерно такой результат.
{
"message": null,
"nameAvailable": true,
"reason": null
}
Параметру nameAvailable
присвоено значение true
. Это означает, что имя учетной записи хранения по-прежнему доступно и еще не подготовлено. Это необходимо, так как вы еще не развернули среду "Production".
Подготовка среды "Production"
Здесь вы развернете шаблон ARM в рабочей среде, аналогично тому, как вы сделали для среды разработки.
Напомним, как выглядит условие в шаблоне:
"condition": "[equals(parameters('environment'),'production')]"
Чтобы активировать это условие, задайте для параметра шаблона environment
значение production
.
Выполните следующую az deployment group create
команду, чтобы развернуть шаблон в рабочей среде:
az deployment group create \
--template-file condition.json \
--parameters storageAccountName=$STORAGE_ACCT_NAME environment=production
Проверка развертывания в среде Production
Теперь шаблон уже должен подготавливать учетную запись хранения.
Выполните команду az storage account check-name
еще раз, чтобы убедиться в том, что имя учетной записи хранения используется.
Выполните следующую команду az storage account check-name
.
az storage account check-name --name $STORAGE_ACCT_NAME
Результат будет примерно таким:
{
"message": "The storage account named tailwindsa32100 is already taken.",
"nameAvailable": false,
"reason": "AlreadyExists"
}
Эти значения показывают, что учетная запись хранения подготовлена в соответствии с ожиданиями.
Несмотря на простоту примера, вы уже знаете, как выполнить развертывание на основе условия.
На практике среды Dev, Staging и Production будут содержать дополнительные ресурсы Azure для поддержки вычислительных, сетевых возможностей и задач хранения. Каждая среда, скорее всего, будет управляться через собственную группу ресурсов, чтобы ее можно было подготавливать и рассматривать как единое целое.