使用 Azure 资源管理器模板部署 Azure 逻辑应用工作流

已完成

如果已使用 Azure 一段时间,可能听说过 Azure 资源管理器。 让我们回顾一下资源管理器的角色,并规定资源管理器模板的组成部分。

什么是 Azure 资源管理器?

Azure 资源管理器是用于管理和组织云资源的接口。 将资源管理器视为一种部署云资源的方法。

如果你熟悉 Azure 资源组,那么你就知道它们支持将相关资源集视为一个单元。 资源管理器可整理资源组,使你能够在单个操作中同时部署、管理和删除所有资源。

请考虑为分析师运行的财务模型。 要运行模型,可能需要一个或多个 VM,一个数据库用于存储数据,一个虚拟网络实现所有内容之间的连接。 借助资源管理器,可将这些资产部署到相同的资源组,并同时进行管理和监视。 完成后,在一个操作中即可删除资源组中的所有资源。

什么是资源管理器模板?

资源管理器模板可精确定义部署中的所有资源管理器资源。 资源管理器模板可部署到一个资源组中,作为一个操作。

资源管理器模板是 JSON 文件,使模板以声明性自动化形式呈现。 声明性自动化是指用户定义所需资源,而不是定义创建方式。 换句话说,用户定义所需内容,但资源管理器必须确保正确部署该资源。

可将声明性自动化看作类似于 Web 浏览器显示 HTML 文件的方式。 HTML 文件描述页面中显示的元素,而不描述相关显示方式。 “方式”由 Web 浏览器负责。

注意

你可能听到有人将资源管理器模板称为“ARM 模板”。 我们更喜欢全名“Azure 资源管理器模板”或“资源管理器模板”。

为什么使用资源管理器模板?

使用资源管理器模板使部署更快速、更具可重复性。 例如,无需再在门户中创建 VM,等待其完成,然后创建下一个 VM 等等。 资源管理器负责整个部署。

以下是可以获得的其他好处:

  • 模板可提高一致性

    资源管理器模板为你和其他人提供一种通用语言来描述部署。 无论部署模板使用何种工具或 SDK,模板内的结构、格式和表达式都保持不变。

  • 模板有助于表达复杂部署

    利用模板,可以正确的顺序部署多个资源。 例如,你不会想要在创建 OS 磁盘或网络接口之前部署虚拟机。 资源管理器会首先映射每个资源及其依赖的资源,并创建所依赖的资源。 依赖项映射有助于确保按正确的顺序执行部署。

  • 模板可减少手动、易出错的任务

    手动创建和连接资源非常耗时,而且在此过程中容易出错。 资源管理器可确保每次部署都以相同的方式进行。

  • 模板是代码

    模板通过代码表达需求。 将模板视为一种可像其他所有软件一样进行分享、测试和版本控制的“基础结构即代码”。 此外,由于模板是代码,因此可创建可以跟踪的“书面记录”。 模板代码可记录部署。 大多数用户通过某些修订控制(如 Git)维护其模板。 更改模板时,其修订历史记录还会记录模板(和部署)怎样随着时间推移不断变化。

  • 模板有利于重复使用

    模板可包含模板运行时填充的参数。 参数可以定义用户名或密码、域名等等。 模板参数让你可以创建多个版本的基础结构(如暂存和生产),但仍使用相同的模板。

  • 模板可链接

    可以将资源管理器模板链接在一起,使模板本身模块化。 可以编写较小的模板,每个模板定义解决方案的一部分,然后将其合并,创建完整的系统。

财务分析师运行的模型是唯一的,但可在底层基础结构中发现模式。 例如,大多数模型都需要数据库来存储数据。 许多模型都使用相同的编程语言、框架和操作系统来执行详细信息。 可以定义描述每个独立组件(例如计算、存储和网络)的模板。 然后,可以合并这些组件以满足每个分析师的特定需求。

资源管理器模板的内容?

注意

下面将展示几个代码示例,为你介绍每个部分的结构。 如果你看到的东西对你来说不熟悉,请不要担心。 你可以查看其他人的模板,并在获得更多实际操作经验时编写自己的模板。

你可能用过 JavaScript 对象表示法 (JSON) 在服务器和 Web 应用之间发送数据。 JSON 也是一种常用的方法,用于描述应用程序和基础结构的配置方式。

使用 JSON,可以在文本中表达以对象形式(例如虚拟机)存储的数据。 JSON 文档实质上是键值对的集合。 每个键都是一个字符串。 键的值可以是字符串、数字、布尔表达式、值列表或对象(其他键值对的集合)。

资源管理器模板可以包含以下部分:

{
    "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "",
    "parameters": {  },
    "variables": {  },
    "functions": [  ],
    "resources": [  ],
    "outputs": {  }
}

尽管这些部分使用 JSON 表示,但它们与实际 JSON 语言无关。 让我们来详细查看每个部分。

参数

通过本部分,可以在模板运行时指定哪些值可配置。 例如,你可以允许你的模板用户指定用户名、密码或域名。

下面示例演示了两个参数:一个用于 VM 的用户名,另一个用于它的密码。

"parameters": {
  "adminUsername": {
    "type": "string",
    "metadata": {
      "description": "Username for the Virtual Machine."
    }
  },
  "adminPassword": {
    "type": "securestring",
    "metadata": {
      "description": "Password for the Virtual Machine."
    }
  }
}

变量

通过本部分,可以定义整个模板中使用的值。 变量可以简化模板的维护。 例如,一次可将一个存储帐户名称定义为变量,并在整个模板中使用该变量。 如果存储帐户名称发生更改,则只需要更新变量。

以下示例演示描述 VM 的网络功能的若干变量。

"variables": {
  "nicName": "myVMNic",
  "addressPrefix": "10.0.0.0/16",
  "subnetName": "Subnet",
  "subnetPrefix": "10.0.0.0/24",
  "publicIPAddressName": "myPublicIP",
  "virtualNetworkName": "MyVNET"
}

函数

通过本部分,可以定义整个模板中不想重复的过程。 与变量一样,函数也可简化模板的维护。 下面的示例创建了一个函数,以创建可在创建具有全局唯一命名要求的资源时使用的唯一名称。

"functions": [
  {
    "namespace": "contoso",
    "members": {
      "uniqueName": {
        "parameters": [
          {
            "name": "namePrefix",
            "type": "string"
          }
        ],
        "output": {
          "type": "string",
          "value": "[concat(toLower(parameters('namePrefix')), uniqueString(resourceGroup().id))]"
        }
      }
    }
  }
],

资源

通过本部分,可以定义组成部署的 Azure 资源。

下面的示例将创建一个公共 IP 地址资源。

{
  "type": "Microsoft.Network/publicIPAddresses",
  "name": "[variables('publicIPAddressName')]",
  "location": "[parameters('location')]",
  "apiVersion": "2018-08-01",
  "properties": {
    "publicIPAllocationMethod": "Dynamic",
    "dnsSettings": {
      "domainNameLabel": "[parameters('dnsLabelPrefix')]"
    }
  }
}

此处的资源类型为 Microsoft.Network/publicIPAddresses。 通过变量部分读取其名称,通过参数部分读取其位置(或 Azure 区域)。

由于资源类型可能会随着时间推移而发生变化,因此 apiVersion 指的是要使用的资源类型的版本。 随着资源类型发展变化,你可以修改模板,以便准备就绪后使用最新功能。

输出

通过本部分,可以定义模板运行时希望收到的信息。 例如,你可能希望收到 VM 的 IP 地址或 FQDN,即部署运行前不知道的信息。

以下示例显示了名为 hostname 的输出。 从 VM 的公共 IP 地址设置中读取 FQDN 值。

"outputs": {
  "hostname": {
    "type": "string",
    "value": "[reference(variables('publicIPAddressName')).dnsSettings.fqdn]"
  }
}

如何在模板中部署 Azure 逻辑应用工作流?

Azure 逻辑应用工作流是 Azure 中的资源。 因此,可以将其添加到资源管理器模板的 resources 部分中要部署的资源列表中,从而将其部署到模板中。 为了定义工作流,我们到底要向资源部分添加什么? 我们将相关工作流的 JSON 工作流定义添加到参考资料部分。 实际上,以下 JSON 代码段显示了一个资源管理器模板,用于部署我们在前面单元中描述的基本工作流。 从突出显示中可以看出,资源部分包含完整的工作流定义。

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {},
    "variables": {},
    "resources": [
        {
            "type": "Microsoft.Logic/workflows",
            "apiVersion": "2017-07-01",
            "name": "HelloLogicAppsTemplate",
            "location": "westus2",
            "properties": {
                "state": "Enabled",
                "definition": {
                    "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
                    "contentVersion": "1.0.0.0",
                    "parameters": {},
                    "triggers": {
                        "manual": {
                            "type": "Request",
                            "kind": "Http",
                            "inputs": {
                                "method": "GET",
                                "schema": {}
                            }
                        }
                    },
                    "actions": {
                        "Response": {
                            "runAfter": {},
                            "type": "Response",
                            "kind": "Http",
                            "inputs": {
                                "body": "Hello Logic Apps Template!",
                                "statusCode": 200
                            }
                        }
                    },
                    "outputs": {}
                },
                "parameters": {}
            }
        }
    ],
    "outputs": {
        "logicAppUrl": {
           "type": "string",
           "value": "[listCallbackURL(concat(resourceId('Microsoft.Logic/workflows/', 'HelloLogicAppsTemplate'), '/triggers/manual'), '2017-07-01').value]"
        }
     }
}

我们可以使用以下方法之一部署此模板:

  • 使用 Azure 门户部署
  • 使用 PowerShell Az 模块进行部署
  • 使用 Azure 命令行接口 (CLI) 进行部署。

在此模块中,我们将使用 Azure CLI 和 az deployment group 命令部署模板。

如何编写资源管理器模板?

可通过多种方法编写资源管理器模板。 尽管可以从头开始编写模板,但常见的是从现有模板开始然后进行修改,以满足自己的需求。

下面是获取初学者模板的几种方法:

  • 根据现有资源组中的资源,使用 Azure 门户创建模板。
  • 使用你或你的团队生成的模板(用于类似目的)开始。
  • 通过 Azure 快速启动模板开始。 下一部分中将介绍如何执行该操作。

无论使用何种方法,编写模板都需要使用文本编辑器。 可以使用你自己喜欢的编辑器,但 Visual Studio Code 的 Azure 资源管理器工具扩展专门为创建模板而设计。 可通过此扩展更轻松地控制模板代码,并自动完成许多常见任务。

探索和编写模板时,请查看文档,以了解哪些资源类型可用,以及如何使用它们。

在下一单元中,我们将从 Azure CLI 中检查和部署现有模板。