ARM 模板中的语法和表达式

Azure 资源管理器模板(ARM 模板)的基本语法是 JavaScript 对象表示法 (JSON)。 但是,可以使用表达式来扩展模板中可用的 JSON 值。 表达式分别以方括号 [] 开头和结尾。 部署模板时会计算表达式的值。 表达式可以返回字符串、整数、布尔值、数组或对象。

模板表达式不能超过 24,576 个字符。

使用函数

Azure 资源管理器提供了可在模板中使用的函数。 以下示例显示了一个在参数的默认值中使用函数的表达式:

"parameters": {
  "location": {
    "type": "string",
    "defaultValue": "[resourceGroup().location]"
  }
},

在该表达式中,语法 resourceGroup() 调用资源管理器提供的、在模板中使用的某个函数。 在本例中,它是 resourceGroup 函数。 如同在 JavaScript 中一样,函数调用的格式为 functionName(arg1,arg2,arg3)。 语法 .location 从该函数返回的对象中检索一个属性。

模板函数及其参数不区分大小写。 例如,资源管理器将 variables('var1')VARIABLES('VAR1') 解析为相同内容。 在求值时,除非函数明确修改大小写(例如 toUppertoLower),否则函数保留大小写。 某些资源类型可能有独立于函数求值方式的大小写要求。

若要将字符串值作为参数传递给函数,请使用单引号。

"name": "[concat('storage', uniqueString(resourceGroup().id))]"

无论是部署到资源组、订阅、管理组还是租户,大多数函数的工作原理都相同。 以下函数根据范围有限制:

  • resourceGroup - 只能在部署到资源组时使用。
  • resourceId - 可以在任何范围内使用,但有效参数会根据范围而发生变化。
  • subscription - 只能在部署到资源组或订阅时使用。

转义字符

要使文本字符串以左方括号 [ 开头,以右方括号 ] 结尾,但不将其解释为表达式,请添加额外的方括号使字符串以 [[ 开头。 例如,变量:

"demoVar1": "[[test value]"

解析为 [test value]

但是,如果文本字符串没有以方括号结束,则不要转义第一个方括号。 例如,变量:

"demoVar2": "[test] value"

解析为 [test] value

若要转义表达式中的双引号(例如,在模板中添加 JSON 对象),请使用反斜杠。

"tags": {
    "CostCenter": "{\"Dept\":\"Finance\",\"Environment\":\"Production\"}"
},

若要转义 ARM 表达式输出中的单引号,请将单引号重复一次。 以下模板的输出会生成 JSON 值 {"abc":"'quoted'"}

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "resources": [],
  "outputs": {
    "foo": {
      "type": "object",
      "value": "[createObject('abc', '''quoted''')]"
    }
  }
}

在资源定义中,对表达式中的值进行双重转义。 以下模板中的 scriptOutputde'f

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "forceUpdateTag": {
      "type": "string",
      "defaultValue": "[newGuid()]"
    }
  },
  "variables": {
    "deploymentScriptSharedProperties": {
      "forceUpdateTag": "[parameters('forceUpdateTag')]",
      "azPowerShellVersion": "10.1",
      "retentionInterval": "P1D"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "escapingTest",
      "location": "[resourceGroup().location]",
      "kind": "AzurePowerShell",
      "properties": "[union(variables('deploymentScriptSharedProperties'), createObject('scriptContent', '$DeploymentScriptOutputs = @{}; $DeploymentScriptOutputs.escaped = \"de''''f\";'))]"
    }
  ],
  "outputs": {
    "scriptOutput": {
      "type": "string",
      "value": "[reference('escapingTest').outputs.escaped]"
    }
  }
}

使用 languageVersion 2.0 时,不再需要双重转义。 可以将前面的示例编写为以下 JSON 以获取相同的结果 de'f

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "languageVersion": "2.0",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "forceUpdateTag": {
      "type": "string",
      "defaultValue": "[newGuid()]"
    }
  },
  "variables": {
    "deploymentScriptSharedProperties": {
      "forceUpdateTag": "[parameters('forceUpdateTag')]",
      "azPowerShellVersion": "10.1",
      "retentionInterval": "P1D"
    }
  },
  "resources": {
    "escapingTest": {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "escapingTest",
      "location": "[resourceGroup().location]",
      "kind": "AzurePowerShell",
      "properties": "[union(variables('deploymentScriptSharedProperties'), createObject('scriptContent', '$DeploymentScriptOutputs = @{}; $DeploymentScriptOutputs.escaped = \"de''f\";'))]"
    }
  },
  "outputs": {
    "scriptOutput": {
      "type": "string",
      "value": "[reference('escapingTest').outputs.escaped]"
    }
  }
}

传入参数值时,转义字符的使用取决于在何处指定了参数值。 如果在模板中设置默认值,则需要额外的左括号。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "demoParam1": {
      "type": "string",
      "defaultValue": "[[test value]"
    }
  },
  "resources": [],
  "outputs": {
    "exampleOutput": {
      "type": "string",
      "value": "[parameters('demoParam1')]"
    }
  }
}

如果使用默认值,则模板会返回 [test value]

但是,如果通过命令行传入参数值,则将按原义解释这些字符。 使用以下命令部署上一个模板:

New-AzResourceGroupDeployment -ResourceGroupName demoGroup -TemplateFile azuredeploy.json -demoParam1 "[[test value]"

返回 [[test value]。 请改用:

New-AzResourceGroupDeployment -ResourceGroupName demoGroup -TemplateFile azuredeploy.json -demoParam1 "[test value]"

从参数文件传入值时,将应用相同的格式设置。 将按原义解释字符。 与上述模板一起使用时,以下参数文件将返回 [test value]

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "demoParam1": {
      "value": "[test value]"
    }
  }
}

Null 值

若要将属性设置为 null,可使用 null[json('null')]。 将 null 作为参数提供时,json 函数返回空对象。 在这两种情况下,资源管理器模板都会按照属性不存在的情况对其进行处理。

"stringValue": null,
"objectValue": "[json('null')]"

若要完全删除某个元素,可以使用 filter() 函数。 例如:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "deployCaboodle": {
      "type": "bool",
      "defaultValue": false
    }
  },
  "variables": {
    "op": [
      {
        "name": "ODB"
      },
      {
        "name": "ODBRPT"
      },
      {
        "name": "Caboodle"
      }
    ]
  },
  "resources": [],
  "outputs": {
    "backendAddressPools": {
      "type": "array",
      "value": "[if(parameters('deployCaboodle'), variables('op'), filter(variables('op'), lambda('on', not(equals(lambdaVariables('on').name, 'Caboodle')))))]"
    }
  }
}

后续步骤