编写 ARM 模板
使用 JSON 构建参数化 ARM 模板来部署存储帐户和 VM,并使用模板函数和变量使模板可复用。
编写 ARM 模板 是 CoddyKit 上的免费 Cloud & IT Cert Prep 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cloud & IT Cert Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cloud & IT Cert Prep 课程共包含 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.jsonARM 模板最佳实践
请遵循以下 ARM 模板最佳实践:对环境特定的值使用参数,使用变量避免重复,将API 版本固定为稳定版本,对密码使用 secureString,为参数添加元数据说明,并将大型模板拆分为链接模块。将模板存储在 Git 仓库中,并通过 CI/CD 流程部署,以便进行审计。
快速检查
测试您对本课 Microsoft Azure Fundamentals(AZ-900)概念的理解。
课程回顾
本课介绍了:ARM 模板是以声明式方式定义 Azure 基础结构的 JSON 文档;参数和变量使模板可重复使用且易于维护;validate、what-if、deploy 工作流支持安全且可重复的部署。接下来,我们将学习 Bicep——一种基于 ARM JSON 构建的现代抽象语言。
常见问题解答
「编写 ARM 模板」课时是免费的吗?
是的 — 「编写 ARM 模板」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cloud & IT Cert Prep 课程的其余内容,请升级到 CoddyKit PRO。 Cloud & IT Cert Prep 课程共包含 4 节课。
「编写 ARM 模板」这节课中我会学到什么?
使用 JSON 构建参数化 ARM 模板来部署存储帐户和 VM,并使用模板函数和变量使模板可复用。 你通过在浏览器中直接运行的动手代码来练习 Cloud & IT Cert Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cloud & IT Cert Prep 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cloud & IT Cert Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「编写 ARM 模板」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cloud & IT Cert Prep 课中编写并运行代码吗?
能。每节 Cloud & IT Cert Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。