练习 - 将条件逻辑添加到 ARM 模板

已完成

在上一个练习中,你使用了 Linux 虚拟机。 在这里,你将切换话题并侧重于管理存储帐户。

假设你有三个需要部署到的环境:开发、过渡和生产。

  • 开发环境是集合应用程序所需一切的第一个位置。 此环境可能包括 Web 服务器、负载均衡器和数据库。
  • 过渡环境是在向最终用户发布新应用程序功能之前执行最终测试的位置。
  • 生产环境是最终用户访问应用程序的位置。

从开发迁移到生产时,需要额外的基础结构。 例如,在生产中,你需要其他存储帐户,在之前的环境中不需要该帐户。

在这里,你将使用条件来控制何时预配存储帐户。 这样做可以通过同一 ARM 模板支持每个基础结构环境。

创建 ARM 模板

在这里,你将创建用于定义存储帐户资源的 Azure 资源管理器 (ARM) 模板。

该模板还定义两个参数:

  • environment:当前环境的名称。
  • storageAccountName:存储帐户的名称。

environment 可以具有以下三个值之一:devstagingproduction。 仅当 environment 等于 production 时,条件才会预配存储帐户。

  1. 在 Visual Studio Code 中,在包含 azuredeploy.json 的同一目录中创建一个名为 condition.json 的文件。

  2. 将这些内容添加到 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": {}
    }
    

在这里,你将使用 PowerShell 和 Az 模块部署具有 condition 构造的 ARM 模板。

预配开发环境

在这里,你会将 ARM 模板部署到开发环境。 可以通过将 environment 模板参数设置为 dev 来完成此操作。

由于仅在 environment 等于 production 时条件才会预配存储帐户,因此你希望模板不预配存储帐户。 换句话说,你希望部署包含零个资源。

  1. 创建保留存储帐户名称的 PowerShell 变量。

    $STORAGE_ACCT_NAME="tailwindsa"+ (Get-Random -COUNT 1 -Maximum 9999999 )
    

    存储帐户名称必须唯一。 Get-Random 部分可确保存储帐户名称以一系列随机数字结束。

  2. 运行以下 New-AzResourceGroupDeployment 命令以将模板部署到开发环境:

    New-AzResourceGroupDeployment `
      -TemplateFile "./condition.json" `
      -storageAccountName $STORAGE_ACCT_NAME `
      -environment 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

这表明尚未预配存储帐户。 你希望如此,因为尚未部署到生产环境。

预配生产环境

在这里,需要将 ARM 模板部署到生产环境,类似于对开发环境执行的操作。

下面再次介绍条件在模板中如下所示:

"condition": "[equals(parameters('environment'),'production')]"

若要触发此条件,请将 environment 模板参数设置为 production

运行以下 New-AzResourceGroupDeployment 命令以将模板部署到生产环境:

New-AzResourceGroupDeployment `
  -TemplateFile "./condition.json" `
  -storageAccountName $STORAGE_ACCT_NAME `
  -environment 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

这些值表明已按预期预配了存储帐户。

尽管这是一个基本示例,但你可以看到如何基于条件进行部署。

在实践中,开发、过渡和生产环境将包含其他 Azure 资源,以支持计算、网络和存储需求。 每个环境都有可能通过其自己的资源组进行管理,因此可以进行预配并将其视为单个单元。

创建 ARM 模板

在这里,你将创建用于定义存储帐户资源的 Azure 资源管理器 (ARM) 模板。

该模板还定义两个参数:

  • environment:当前环境的名称。
  • storageAccountName:存储帐户的名称。

environment 可以具有以下三个值之一:devstagingproduction。 仅当 environment 等于 production 时,条件才会预配存储帐户。

  1. 在 Visual Studio Code 中,在包含 azuredeploy.json 的同一目录中创建一个名为 condition.json 的文件。

  2. 将这些内容添加到 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 模板部署到开发环境。 可以通过将 environment 模板参数设置为 dev 来完成此操作。

由于仅在 environment 等于 production 时条件才会预配存储帐户,因此你希望模板不预配存储帐户。 换句话说,你希望部署包含零个资源。

  1. 创建保留存储帐户名称的 Bash 变量。

    STORAGE_ACCT_NAME=tailwindsa$RANDOM
    

    存储帐户名称必须唯一。 $RANDOM 部分可确保存储帐户名称以一系列随机数字结束。

  2. 运行以下 az deployment group create 命令以将模板部署到开发环境:

    az deployment group create \
      --template-file condition.json \
      --parameters storageAccountName=$STORAGE_ACCT_NAME environment=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,这意味着存储帐户名称仍可用且尚未预配。 你希望如此,因为尚未部署到生产环境。

预配生产环境

在这里,需要将 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

验证是否部署到了生产

这次,你希望模板已预配存储帐户。

若要验证这种情况,请再次运行 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"
}

这些值表明已按预期预配了存储帐户。

尽管这是一个基本示例,但你可以看到如何基于条件进行部署。

在实践中,开发、过渡和生产环境将包含其他 Azure 资源,以支持计算、网络和存储需求。 每个环境都有可能通过其自己的资源组进行管理,因此可以进行预配并将其视为单个单元。