使用参数文件提供值

已完成

在以前的单元中,你会在创建部署时在命令行上提供参数值。 当你编写和测试 Bicep 文件时,可以选择这种方法,但当你有许多参数或需要自动执行部署时,此方法将不适用。 在本单元中,你将了解可以指定参数值的不同方法。

注意

本单元中显示的命令用于说明概念。 请暂时不要运行这些命令。 稍后你将练习在此处学到的知识。

创建参数文件

使用参数文件,可以轻松地将参数值指定为一个集合。 在参数文件中,为 Bicep 文件中的参数提供值。 参数文件是通过使用 JavaScript 对象表示法 (JSON) 语言创建的。 部署 Bicep 模板时,可以提供参数文件。 参数文件如下所示:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "appServicePlanInstanceCount": {
      "value": 3
    },
    "appServicePlanSku": {
      "value": {
        "name": "P1v3",
        "tier": "PremiumV3"
      }
    },
    "cosmosDBAccountLocations": {
      "value": [
        {
          "locationName": "australiaeast"
        },
        {
          "locationName": "southcentralus"
        },
        {
          "locationName": "westeurope"
        }
      ]
    }
  }
}

让我们更详细地了解参数文件的每个部分:

  • $schema 有助于 Azure 资源管理器了解此文件是参数文件。
  • contentVersion 是一个属性,可用于在需要时跟踪参数文件中的重大更改。 通常情况下,它设置为其默认值 1.0.0.0
  • parameters 部分列出了每个参数以及要使用的值。 参数值必须指定为对象。 对象具有一个名 value 为的属性,该属性定义要使用的实际参数值。

通常,你将为每个环境创建参数文件。 最好将环境名称包含在参数文件的名称中。 例如,你的开发环境可能有一个名为 main.parameters.dev.js 的参数文件,并且你的生产环境有一个名为 main.parameters.production.js 的参数文件。

备注

请确保仅为 Bicep 模板中存在的参数指定值。 当你创建部署时,Azure 会检查你的参数,如果你尝试为不在 Bicep 文件中的参数指定值,则会提供错误。

在部署时使用参数文件

使用 az deployment group create 命令创建新的部署时,可以指定要与 --parameters 参数一起使用的参数文件的名称:

az deployment group create \
  --template-file main.bicep \
  --parameters main.parameters.json

使用 New-AzResourceGroupDeployment cmdlet 创建新的部署时,可以指定要与 -TemplateParameterFile 参数一起使用的参数文件的名称:

New-AzResourceGroupDeployment `
  -TemplateFile main.bicep `
  -TemplateParameterFile main.parameters.json

覆盖参数值

现在,你已了解了用于指定参数值的三种方法:默认值、命令行和参数文件。 通常使用不同的方法为同一参数指定不同值。 在使用默认值时,你已经看到了这种方法。 当你为参数创建默认值,但随后使用命令行指定其他值时,命令行值优先。 让我们看看参数文件如何适应此优先级顺序。

Diagram that shows the order of precedence for parameter values. Parameter files override default values, and command-line parameter values override parameter files.

你可以看到参数文件会重写默认值,并且命令行参数值重写参数文件。

让我们看看此方法的工作原理。 下面是一个示例 Bicep 文件,它定义三个参数,每个参数都具有默认值:

param location string = resourceGroup().location
param appServicePlanInstanceCount int = 1
param appServicePlanSku object = {
  name: 'F1'
  tier: 'Free'
}

让我们看一个参数文件,它覆盖了两个参数的值,但没有为 location 参数指定值:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "appServicePlanInstanceCount": {
      "value": 3
    },
    "appServicePlanSku": {
      "value": {
        "name": "P1v3",
        "tier": "PremiumV3"
      }
    }
  }
}

在你创建部署时,我们还会重写 appServicePlanInstanceCount 的值。 与参数文件一样,可以使用 --parameters 参数,但需要将要重写的值添加为它自己的值:

az deployment group create \
  --template-file main.bicep \
  --parameters main.parameters.json \
               appServicePlanInstanceCount=5

在你创建部署时,你将重写其中一个参数值。 指定参数名称,就像它是 cmdlet 的参数一样:

New-AzResourceGroupDeployment `
  -TemplateFile main.bicep `
  -TemplateParameterFile main.parameters.json `
  -appServicePlanInstanceCount 5

让我们看一下这些值将是什么。

参数 说明
location 资源组的位置。 Bicep 文件将此参数指定为默认值,并且它不会被重写。
appServicePlanSku 一个对象,其 name 属性设置为 P1v3,而 tier 设置为 PremiumV3 Bicep 文件中的默认值由参数文件重写。
appServicePlanInstanceCount 5 在部署时指定的值将重写默认值和参数文件中的值。

通过混合使用多种方法来指定参数值,可以避免在多个位置重复参数值,同时仍然可以灵活地在需要时进行重写。