如何创建本地存储的ARM链接模板?能否从VS/命令行部署本地ARM模板?
1. 如何创建存储在本地的ARM链接模板?
要创建本地存储的链接模板,核心是在主模板中使用相对路径来引用链接模板,而非绝对路径或云端URI。举个实际的例子:
假设你的主模板(main-template.json)和链接模板(linked-resources.json)在同一个项目目录下,主模板里的部署资源可以这样写:
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "resources": [ { "type": "Microsoft.Resources/deployments", "apiVersion": "2021-04-01", "name": "deployLinkedResources", "properties": { "mode": "Incremental", "templateLink": { "uri": "./linked-resources.json", "contentVersion": "1.0.0.0" } } } ] }
这个相对路径的写法能让本地部署工具识别到链接模板的位置,但要注意:Azure Resource Manager(ARM)服务本身无法直接访问你的本地文件,必须依靠部署工具来处理本地文件的传递工作。
2. 能否从VS或命令行部署本地存储的所有模板?
关于Visual Studio的默认部署问题
你遇到的报错"The language expression property 'templateLink' doesn't exist...",本质原因是VS默认的ARM部署流程是直接把主模板提交给ARM服务,而ARM无法访问你本地的链接模板——它只能识别公开的云端URI(比如存储账户、GitHub仓库地址)。所以直接用VS自带的「部署到Azure」功能,确实没法直接部署本地的链接模板组合。
但这不代表VS完全没法实现本地流程,你可以通过两种方式绕开限制:
- 在VS中添加PowerShell或Azure CLI脚本任务,用本地部署命令执行部署(下面会讲命令行的具体方法),替代VS自带的部署任务。
- 把链接模板转换成内嵌模板:把链接模板的完整JSON内容直接复制到主模板的
template属性中,替换原来的templateLink。示例如下:
{ "properties": { "mode": "Incremental", "template": { // 直接粘贴链接模板的完整JSON内容 "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "resources": [/* 链接模板的资源定义内容 */] } } }
这样整个模板是单一文件,VS就能直接完成部署了。
命令行部署(无需上传云端)
用Azure CLI或Azure PowerShell可以直接部署本地的主模板和链接模板,工具会自动处理本地文件的临时上传:
Azure CLI 示例
az deployment group create \ --resource-group your-resource-group-name \ --template-file ./main-template.json \ --parameters ./parameters.json
当你用--template-file指定本地主模板时,CLI会自动扫描所有通过相对路径引用的链接模板,把它们打包上传到一个临时的、带SAS授权的存储容器中,ARM服务可以安全访问这些临时文件,部署完成后临时容器会自动被清理。
Azure PowerShell 示例
New-AzResourceGroupDeployment ` -ResourceGroupName your-resource-group-name ` -TemplateFile ./main-template.json ` -TemplateParameterFile ./parameters.json
PowerShell的逻辑和CLI一致,会自动处理本地链接模板的临时上传,不需要你手动把文件上传到云端存储。
总结一下:如果想纯本地流程完成部署,Azure CLI或PowerShell是最直接的方式;如果要在VS里完成,可以通过添加脚本任务或者转换为内嵌模板来实现。
内容的提问来源于stack exchange,提问作者Nicolae Daian

