ARM 模板开发

本文中的 “Azure 市场”作用范围均指中国大陆。

Azure 资源管理器是 Azure 的部署和管理服务。 它提供一致的管理层用于在 Azure 订阅中创建、更新和删除资源。 部署后,可以使用其访问控制、审核和标记功能来保护与组织资源。

1. 快速构建 ARM 模板

1.1 了解 ARM的基本概念

ARM 的概要信息请参考 Azure 资源管理器概述

1.2 快速入门

2. ARM 模板 参考实例

2.1 ARM 模板中的资源 API 语法

请参考 Define resources in Azure Resource Manager templates,可以在下图中查看 Reference 节点的资源 API 信息。

请注意以上的资源信息是以 Global Azure 为基准,对于 Azure 中国来说,资源的种类和具体定义会稍微有些不同。由于资源 API 版本会处于动态更新过程中,一般我们需要用其最新版本,可以人工在 Azure 中国入口中(所有服务->资源浏览器)查看资源版本号,如下图所示。

同时,我们推荐使用资源函数的方式动态获取最新 API Version 信息,参见 用于 Azure Resource Manager 模板的 providers 资源函数。例如,对于存储账号的API version,可以采用如下方法获得:

"apiVersion": "[providers('Microsoft.Storage','storageAccounts').apiVersions[0]]"

另外,也请参考 Azure 中国可用服务

2.2 大量的 ARM 模板参考样例

Azure 快速启动模板样例 以及 Azure 快速启动模板样例文档

请注意,从网站下载到本地的 PowerShell 脚本如果不能执行,可能的原因是由于 Windows 安全隔离导致,可以在脚本文件的属性页中,选择“unblock”,将文件解锁,然后再执行。

2.3 ARM 模板最佳实践

请参考 ARM 模板最佳实践指南

3. ARM 开发注意事项

3.1 虚拟机登录认证方式

除了支持虚拟机登录的用户名密码方式,强烈建议同时支持证书或 SSH 密钥登录的方式。请参考 Azure 虚拟机规模集常见问题解答 中的证书以及 osProfile 部分以及案例 101-vm-sshkey GitHub 快速入门模板

3.2 资源依赖关系

由于 ARM 模板是以资源为中心进行组织的,所以需要特别注意资源之间具有依赖关系,并理解这些资源产生的过程先后顺序,例如下例中对于 Azure 中建立 WebSite 的 ARM (参考 Azure Portal 中用例 Wordpress ARM 模板):

  • 连接测试过程(type "config") dependsOn php配置(type “config”);

  • php 配置 dependsOn php 软件安装(type "extensions");

  • php 软件安装依赖于 Web 站点(type "Microsoft.Web/sites/") 。

    以上用例如果没有严格的资源依赖的关系定义,WebSite 的创建有时候也能成功,但并不稳定并且经常会失败,且难以查找原因。

    依赖关系如何使用参见 定义在 Azure Resource Manager 模板中部署资源的顺序

3.3 Extensions 问题

ARM 中经常需要用到 Extensions 脚本,Extensions 脚本由于是在虚拟机创建时得到执行,因此脚本通常需要通过网络下载并执行;如果脚本放在外网(例如 Github),实践中经常容易出现下载失败或缓慢的情况。因此我们建议将脚本放到 Azure 云平台。

3.4 VHD 镜像引用

如果在 ARM 模板中需要引用 VHD 镜像,首先需要先在 Azure 市场发布平台发布这个镜像(隐藏发布,相对正常的镜像发布,您只需要在发布镜像的 SKU 时设置 “隐藏此 SKU”,这样镜像虽然发布了但并不在 Azure 入口和 Azure 市场中显示),镜像发布成功后,需要向 Azure 市场支持人员获取已发布的镜像信息,或者通过如下 PowerShell 命令确认镜像已经发布:

  • 获取 Azure 市场所有的发布者: Get-AzureRmVMImagePublisher

  • 获取发布者发布的 Offer: Get-AzureRmVMImageOffer

  • 获取一个 Offer 所有的 SKU: Get-AzureRmVMImageSku

  • 获取 SKU 镜像的所有版本: Get-AzureRmVMImage

  • 例如:

      Get-AzureRmVMImage `
      -Location "china north" `
      -PublisherName "redcore" `
      -offer "endome" `
      -skus "standard"
    

ARM 模板中需要包含如下四项:

"storageProfile": {
    "imageReference": {
        "publisher": "abcpublisher",
        "offer": "abcimage",
        "sku": "standard",
        "version": "latest"
    }
}

3.5. ARM 模板从 Global Azure 向 Azure 中国的移植

由于 Global Azure 和 Azure 中国云计算中心相互独立运营,所以 ARM 模板的开发在 Global 和中国虽然基本相同,但有少数资源支持不完全相同,需要做兼容性测试,并特别注意以下几点。

 第二节中,某些 ARM 模板中的资源目前在 Azure 中国并不支持,
 具体请参考第二节中的 Azure 中国入口中的(所有服务->资源浏览器)。

 第二节中,针对 VHD 的引用,除了的"imageReference",Azure 中国目前并不支持"plan"字段,
 在 ARM 模板中引用 Azure 中国市场的镜像也不需要“plan”字段。

后续步骤

反馈