0Pricing
Azure Fundamentals · 课时

编写 ARM 模板

使用 JSON 构建参数化 ARM 模板来部署存储帐户和 VM,并使用模板函数和变量使模板可复用。

编写 ARM 模板 是 CoddyKit 上的免费 Azure Fundamentals 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Azure Fundamentals 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Azure Fundamentals 课程共包含 4 节课。

为什么使用 ARM 模板?

ARM 模板让您能够以 JSON 格式将 Azure 基础结构定义为代码。这样,您就可以执行可重复且一致的部署,并将模板与应用程序代码一起进行版本控制。模板具有幂等性——多次运行同一个模板会产生相同的结果,因此更改后可以安全地重新应用。

模板框架和架构

每个 ARM 模板都以 $schema 属性开头,该属性指向模板架构 URL,后面是一个 contentVersion 字符串。架构会告知 Azure 门户和编辑器扩展如何验证模板,以及如何为模板提供 IntelliSense。接下来的五个主要部分是 parameters、variables、functions、resources 和 outputs。

{
  '$schema': 'https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#',
  'contentVersion': '1.0.0.0',
  'parameters': {},
  'variables': {},
  'functions': [],
  'resources': [],
  'outputs': {}
}

定义参数

参数通过在部署时接受输入,使模板可以重复使用。每个参数都有一个 type(string、int、bool、object、array 或 secureString)、一个可选的 defaultValue,以及用于验证的可选 allowedValues。对密码使用 secureString 可以确保该值不会记录在部署历史中。

"parameters": {
  "storageAccountName": {
    "type": "string",
    "minLength": 3,
    "maxLength": 24,
    "metadata": { "description": "Globally unique storage account name" }
  },
  "sku": {
    "type": "string",
    "defaultValue": "Standard_LRS",
    "allowedValues": ["Standard_LRS", "Standard_GRS", "Premium_LRS"]
  }
}

使用变量存储计算值

变量存储根据参数或模板函数计算出的值,可以减少重复并使模板更易于维护。变量只计算一次,并通过 [variables('name')] 表达式在 resources 部分中反复引用。一个常见模式是将参数与唯一后缀连接起来构建资源名称。

"variables": {
  "uniqueStorageName": "[concat(parameters('storageAccountName'), uniqueString(resourceGroup().id))]",
  "location": "[resourceGroup().location]"
}

定义资源

resources 数组是 ARM 模板的核心。每个元素描述一个 Azure 资源,并包含以下必需字段:type、apiVersion、name 和 location。apiVersion 固定了资源提供程序架构的版本——请始终使用最新的稳定版本,以访问最新功能并避免使用已弃用的属性。

"resources": [
  {
    "type": "Microsoft.Storage/storageAccounts",
    "apiVersion": "2023-01-01",
    "name": "[variables('uniqueStorageName')]",
    "location": "[variables('location')]",
    "sku": { "name": "[parameters('sku')]" },
    "kind": "StorageV2",
    "properties": {
      "supportsHttpsTrafficOnly": true,
      "minimumTlsVersion": "TLS1_2"
    }
  }
]

模板函数和表达式

ARM 模板表达式使用方括号 [...] 包裹,并支持用于处理字符串、数组、对象和资源 ID 的内置函数。常用函数包括 concat()、resourceGroup()、resourceId()、uniqueString() 和 parameters()。这些函数由 ARM 在部署时在服务器端计算,而不是在本地计算。

// Reference a resource ID inside a template
"subnetId": "[resourceId('Microsoft.Network/virtualNetworks/subnets', 'myVNet', 'mySubnet')]"

// Build a unique, deterministic name
"name": "[concat('storage', uniqueString(resourceGroup().id))]"

// Conditionally include a resource
"condition": "[equals(parameters('deployStorage'), true)]"

Outputs:返回值

outputs 部分定义 ARM 在部署成功后返回的值。Outputs 对于串联模板至关重要——您可以部署网络模板并输出子网资源 ID,然后将其作为参数传递给 VM 模板。Outputs 可以引用任何表达式,包括部署中的资源属性。

"outputs": {
  "storageAccountName": {
    "type": "string",
    "value": "[variables('uniqueStorageName')]"
  },
  "blobEndpoint": {
    "type": "string",
    "value": "[reference(variables('uniqueStorageName')).primaryEndpoints.blob]"
  }
}

链接模板和嵌套模板

对于复杂的架构,ARM 支持链接模板(引用外部模板 URL)和嵌套模板(使用类型 Microsoft.Resources/deployments 将模板嵌入 resources 数组)。这样,您就可以将大型基础结构部署拆分为模块化、可重复使用的部分,同时保留一个作为入口点的统一编排模板。

{
  "type": "Microsoft.Resources/deployments",
  "apiVersion": "2021-04-01",
  "name": "networkDeploy",
  "properties": {
    "mode": "Incremental",
    "templateLink": {
      "uri": "https://raw.githubusercontent.com/contoso/templates/main/network.json",
      "contentVersion": "1.0.0.0"
    },
    "parameters": {
      "vnetName": { "value": "[parameters('vnetName')]" }
    }
  }
}

参数文件

您不必在命令行中传递参数,而可以将参数存储在单独的参数文件中——这是一个包含 parameters 对象的 JSON 文件,其中存放名称-值对。参数文件可以针对不同环境分别设置(例如 dev.parameters.json、prod.parameters.json),并提交到源代码管理中,同时将敏感值保存在 Azure Key Vault 引用中,而不是明文保存。

// dev.parameters.json
{
  '$schema': 'https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#',
  'contentVersion': '1.0.0.0',
  'parameters': {
    'storageAccountName': { 'value': 'devstorageacct' },
    'sku': { 'value': 'Standard_LRS' }
  }
}

// Deploy with parameters file
// az deployment group create -g MyRG -f azuredeploy.json -p dev.parameters.json

部署和验证模板

使用 Azure CLI 命令 az deployment group create 将模板部署到资源组。在部署到生产环境之前,请运行 az deployment group validate 以发现架构和逻辑错误,并运行 az deployment group what-if 预览资源更改。这三个命令构成了安全的部署流程:验证、预览、部署。

# Step 1: Validate the template syntax
az deployment group validate \
  --resource-group MyRG \
  --template-file azuredeploy.json \
  --parameters @dev.parameters.json

# Step 2: Preview changes
az deployment group what-if \
  --resource-group MyRG \
  --template-file azuredeploy.json \
  --parameters @dev.parameters.json

# Step 3: Deploy
az deployment group create \
  --resource-group MyRG \
  --template-file azuredeploy.json \
  --parameters @dev.parameters.json

ARM 模板最佳实践

请遵循以下 ARM 模板最佳实践:对环境特定的值使用参数,使用变量避免重复,将API 版本固定为稳定版本,对密码使用 secureString,为参数添加元数据说明,并将大型模板拆分为链接模块。将模板存储在 Git 仓库中,并通过 CI/CD 流程部署,以便进行审计。

快速检查

测试您对本课 Microsoft Azure Fundamentals(AZ-900)概念的理解。

课程回顾

本课介绍了:ARM 模板是以声明式方式定义 Azure 基础结构的 JSON 文档;参数和变量使模板可重复使用且易于维护;validate、what-if、deploy 工作流支持安全且可重复的部署。接下来,我们将学习 Bicep——一种基于 ARM JSON 构建的现代抽象语言。

常见问题解答

「编写 ARM 模板」课时是免费的吗?

是的 — 「编写 ARM 模板」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Azure Fundamentals 课程的其余内容,请升级到 CoddyKit PRO。 Azure Fundamentals 课程共包含 4 节课。

「编写 ARM 模板」这节课中我会学到什么?

使用 JSON 构建参数化 ARM 模板来部署存储帐户和 VM,并使用模板函数和变量使模板可复用。 你通过在浏览器中直接运行的动手代码来练习 Azure Fundamentals,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Azure Fundamentals 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Azure Fundamentals 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「编写 ARM 模板」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Azure Fundamentals 课中编写并运行代码吗?

能。每节 Azure Fundamentals 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. Azure 资源管理器的工作原理
  2. 编写 ARM 模板
  3. Bicep:现代 Azure IaC
  4. Azure 上的 Terraform
← 返回 Azure Fundamentals