Skip to main content

Azure资源管理模板介绍(ARM Template)

分类:  Azure指南 标签:  #Azure #基础 #Azure Cloud Architecting #Azure入门 发布于: 2023-05-28 10:02:05

在迁移到云的过程中,许多团队都采用了敏捷开发方法。 这些团队的工作快速迭代。 他们需要反复将其解决方案部署到云,并需要知道其基础结构处于一种可靠的状态。 随着基础结构成为迭代过程的一部分,运营与开发之间的划分已经消失。 团队需要通过统一的过程来管理基础结构和应用程序代码。

为了解决这些难题,可将部署自动化,并运用基础结构即代码。 在代码中定义需要部署的基础结构。 基础结构代码将成为项目的一部分。 与应用程序代码一样,可将基础结构代码存储在源存储库中,并控制其版本。 团队中的任何人都可以运行该代码并部署类似的环境。

若要针对 Azure 解决方案实现基础结构即代码,请使用 Azure 资源管理器模板(ARM 模板)。 该模板是一个定义项目基础结构和配置的Json文件。 该模板使用声明性语法,使你可以指明要部署的内容,而不需要编写一系列编程命令来创建内容。 在该模板中,指定要部署的资源以及这些资源的属性。

我们引入了一种名为“Bicep”的新语言,用于开发 ARM 模板 JSON。 Bicep 文件和 JSON 模板提供的功能相同。 你可以在两种语言之间转换模板。 Bicep 提供的语法更容易用于创建模板。 下一章我们学习什么是Bicep。

为什么选择ARM?

如果要尝试在使用 ARM 模板和其他基础结构即代码服务之间做出选择,请考虑使用模板的以下优点:

  • 声明性语法:ARM 模板允许以声明方式创建和部署整个 Azure 基础结构。 例如,你不仅可以部署虚拟机,还可以部署网络基础结构、存储系统和可能需要的任何其他资源。
  • 可反复效果:在整个开发生命周期内反复部署基础结构,并确保以一致的方式部署资源。 模板是幂等的,这意味着,可以多次部署同一模板,并获得处于相同状态的相同资源类型。 可以开发一个模板来表示所需的状态,而无需开发大量的独立模板来表示更新。
  • 业务流程:无需担心有序操作的复杂性。 资源管理器会协调相互依赖的资源的部署,以按正确的顺序创建这些资源。 在可能的情况下,资源管理器将会并行部署资源,因此,其完成速度比串行部署更快。 通过一个命令部署模板,而无需使用多个强制性命令。

  • 模块化文件:可将模板分解为较小的可重用组件,并在部署时将其链接到一起。 还可以在一个模板中嵌套另一个模板。
  • 创建任何 Azure 资源:可以立即在模板中使用新的 Azure 服务和功能。 一旦资源提供程序引入了新资源,你就可以通过模板立即部署这些资源。 在使用新服务之前,无需等待工具或模块完成更新。
  • 扩展性:使用 部署脚本时,可以将 PowerShell 或 Bash 脚本添加到模板。 使用部署脚本可扩展在部署过程中设置资源的功能。 脚本可以包含在模板中,也可存储在外部源中并在模板中引用。 使用部署脚本可以在单个 ARM 模板中完成端到端环境设置。
  • 测试:可以使用 ARM 模板工具包 (arm-ttk) 对模板进行测试,确保模板符合建议的准则。 此测试工具包是一个 PowerShell 脚本,可从 GitHub 下载。 使用此工具包,可以更轻松地使用模板语言开发专门技术。
  • 预览更改:可以使用 模拟操作在部署模板前预览更改。 通过 What-if,你可查看将创建、更新或删除的资源,以及将更改的任何资源属性。 模拟操作会检查环境的当前状态,因此无需管理状态。
  • 内置验证:只有在通过验证后才会部署模板。 资源管理器在开始部署之前会检查模板,以确保部署成功。 部署不太可能会在半完成状态时停止。
  • 受跟踪的部署:在 Azure 门户中,可以查看部署历史记录并获取有关模板部署的信息。 可以查看已部署的模板、已传入的参数值,以及任何输出值。 其他基础结构即代码服务不是通过门户跟踪的。

  • 策略即代码:Azure Policy 是一个用于自动化监管的策略即代码框架。 如果使用 Azure 策略,在通过模板进行部署时,将会针对不合规的资源执行策略修正。
  • 部署蓝图:你可以利用 Microsoft 提供的 蓝图来达到监管和合规性标准。 这些蓝图包括各种体系结构的预生成模板。
  • CI/CD 集成:可以将模板集成到持续集成和持续部署 (CI/CD) 工具中,这些工具可以自动执行发布管道,以实现快速可靠的应用程序和基础结构更新。 通过 Azure DevOps 和资源管理器模板任务,可以使用 Azure Pipelines 持续生成和部署 ARM 模板项目。 若要了解详细信息,请参阅使用管道的 VS 项目和教程:使用 Azure Pipelines 持续集成 Azure 资源管理器模板。
  • 可导出的代码:可以通过导出资源组的当前状态或查看特定部署所用的模板,来获取现有资源组的模板。 查看导出的模板是了解模板语法的有用方法。
  • 创作工具:可以使用 Visual Studio Code 和模板工具扩展来创作模板。 你将获得 Intellisense、语法突出显示、内联帮助以及其他许多语言功能。 除了 Visual Studio Code 以外,还可以使用 Visual Studio。
  • 模板文件

    在模板中,可以编写模板表达式来扩展 JSON 的功能。 这些表达式使用资源管理器提供的函数。
    模板包含以下节:

    • 参数 - 在部署过程中提供值,以便可将同一模板用于不同的环境。
    • 变量 - 定义在模板中重复使用的值。 可以从参数值构造变量。
    • 用户定义的函数 - 创建自定义函数用于简化模板。
    • 资源 - 指定要部署的资源。
    • 输出 - 从已部署的资源返回值。

    模板部署过程

    部署模板时,资源管理器会将模板转换为 REST API 操作。 例如,当资源管理器收到具有以下资源定义的模板:

    "resources": [
      {
        "type": "Microsoft.Storage/storageAccounts",
        "apiVersion": "2019-04-01",
        "name": "mystorageaccount",
        "location": "westus",
        "sku": {
          "name": "Standard_LRS"
        },
        "kind": "StorageV2",
        "properties": {}
      }
    ]
    

    它会将该定义转换为以下 REST API 操作,然后,该操作将发送到 Microsoft.Storage 资源提供程序:

    PUT
    https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/mystorageaccount?api-version=2019-04-01
    REQUEST BODY
    {
      "location": "westus",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "StorageV2",
      "properties": {}
    }
    

    请注意,在资源模板中设置的 apiVersion 将用作 REST 操作的 API 版本。 你可以重复部署模板并可以相信它会继续工作。 通过使用相同的 API 版本,你就无需担心可能在更高版本中引入的中断性变更。

    若要部署模板,请使用以下任一选项:

    • Azure 门户
    • Azure CLI
    • PowerShell
    • REST API
    • GitHub 存储库中的按钮
    • Azure Cloud Shell

    模板设计

    模板和资源组的定义方式全由你决定,解决方案的管理方式也是如此。 例如,可以通过单个模板在单个资源组中部署三层式应用程序。


    但无需在单个模板中定义整个基础结构。 通常,合理的做法是将部署要求划分成一组有针对性的模板。 可以轻松地将这些模板重复用于不同的解决方案。 若要部署特定的解决方案,请创建链接所有所需模板的主模板。 下图显示如何通过包含三个嵌套模板的父模板部署三层式解决方案。


    如果希望层具有不同的生命周期,可将这三个层部署到不同的资源组。 请注意,资源仍可链接到其他资源组中的资源。


    有关嵌套模板的信息,请参阅: https://docs.microsoft.com/zh-cn/azure/azure-resource-manager/templates/linked-templates