使用模板函数为 Azure 资源管理器模板添加灵活性

已完成

在此方案中,你希望尽可能轻松地将 Azure 资源管理器 (ARM) 模板部署到不同环境。 争用的其中一个领域是由于 Azure 存储帐户的唯一名称所致。

为了解决此问题,你决定通过使用 ARM 模板函数创建表达式。

什么是 ARM 模板函数?

ARM 模板函数通过在部署期间动态获取值来增加 ARM 模板的灵活性。

若要了解函数,首先需要了解表达式。 表达式是在部署模板时计算的值。 它们以方括号 ([]) 开头和结尾,并且可以返回字符串、整数、布尔、数组或对象。

在此学习路径的上一个模块中,你已经在资源管理器模板中使用过表达式。 例如,你使用了以下项:

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

表达式是 defaultValue: 特性的值 。 请注意,此表达式包含 ARM 模板函数 resourceGroup()。 此函数返回有关此模板要部署到的资源组的信息。 .location 从该函数返回的对象中检索一个属性。 函数允许动态构造所需的值。

如何使用 ARM 模板函数?

使用函数时,请遵循以下规则:

  • 将字符串值传递给函数时,请使用单引号。 下面是一个示例:concat('storage',uniqueString(resourceGroup().id))。 该函数为 concat,传递给该函数的字符串则为 'storage'

  • 若要在模板函数中使用文本值,则需要转义字符。 转义字符根据要转义的内容而有所不同。

  • 若要将属性设置为 null,可使用 null[json('null')]。 当你提供 null 作为参数时,JSON 函数将返回一个空对象。

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

资源管理器为你提供了多个 ARM 模板函数。 这些函数根据其类型分组列出:

  • 数组函数,用于处理数组。 例如 firstlast
  • 比较函数,用于在模板中进行比较。 例如 equalsgreater
  • 日期函数,用于处理日期。 例如 utcNowdateTimeAdd
  • 部署值函数,用于获取模板各部分中的值以及与部署相关的值。 例如 environmentparameters
  • 逻辑函数,用于处理逻辑条件。 例如 ifnot
  • 数字函数,用于处理整数。 例如 maxmod
  • 对象函数,用于处理对象。 例如 containslength
  • 资源函数,用于获取资源值。 例如 resourceGroupsubscription
  • 字符串函数,用于处理字符串。 例如 lengthstartsWith

如何在一个表达式中使用多个函数?

可以结合使用多个模板函数来创建自己的表达式。 在此方案中,需要创建一个表达式,该表达式通过组合前缀输入与资源组 ID 的哈希,为每个资源组创建唯一的名称。 该表达式将生成 dev2hu6fktr577whstaging5his8hgr67tt5 等存储帐户名称。 可使用四个函数来构造此字符串值。 例如:

"[toLower(concat('Storage',uniqueString(resourceGroup().id)))]"

让我们演练一下此表达式。

concat 开始,此函数可采用任意数量的参数,并可接受字符串或数组作为参数。 这里使用文本字符串 "Storage",并将其与另一个函数 (uniqueString) 的结果连接起来。 uniqueString 函数根据参数创建确定性的哈希字符串。 在该表达式中,你将使用另一个函数 (resourceGroup) 来创建当前资源组 ID 的哈希。

以下是到目前为止我们讨论得出的结果:

字符串的图片,该字符串是通过将单词 Storage 与包含大小写形式的 13 个字符的哈希连接起来而创建的。

为遵守命名约定,需要将此字符串全部转换为小写。 此处,将 toLower 函数作为外围函数添加。

生成的字符串如下所示:

字符串的图片,该字符串是通过将单词 Storage 与 13 个字符的哈希连接起来,然后将所有字母转换为小写创建而成。