链接的 ARM 模板导致模板无效
Linked ARM templates result in Invalid Template
让我们从我想要完成的事情开始。
我想做的是创建一个 ARM 模板,我在其中从 Azure Key Vault 检索机密,而无需在特定 Key Vault 上指定太多细节。听起来很简单,而且可能在每个生产系统中都实现了。
快速搜索后我发现了 the syntax for such a thing is the following。
"parameters": {
"adminPassword": {
"reference": {
"keyVault": {
"id": "[resourceId(subscription().subscriptionId, parameters('vaultResourceGroup'), 'Microsoft.KeyVault/vaults', parameters('vaultName'))]"
},
"secretName": "[parameters('secretName')]"
}
},
据我所知,您需要将其添加到外部模板中,因为所使用的方法不能在 'main' 方法中使用。
所以我开始创建一个 'main' ARM 模板和一个名为 appservice.json
的新模板,其中包含我的应用服务所需的所有内容,包括需要来自 Key Vault 的秘密。
在我的主模板中,我完成了以下操作,as described in the documentation。
{
"apiVersion": "2017-05-10",
"name": "linkedTemplate",
"type": "Microsoft.Resources/deployments",
"properties": {
"mode": "Incremental",
"templateLink": {
"uri": "[uri(deployment().properties.templateLink.uri, 'appservice.json')]",
"contentVersion": "1.0.0.0"
},
但是,在部署时我遇到了以下错误。
"error": {
"code": "InvalidTemplate",
"message": "Unable to process template language expressions for resource '/subscriptions/ba49bae7-2b37-4504-914b-441763a2bcd3/resourceGroups/cfpexchange-jan-test/providers/Microsoft.Resources/deployments/linkedTemplate' at line '1' and column '1526'. 'The language expression property 'templateLink' doesn't exist, available properties are 'name, properties'.'"
}
我也尝试了以下方法,因为我注意到 Visual Studio 中的 IntelliSense 告诉我 properties
没有退出,我应该直接使用 templateLink
。
{
"apiVersion": "2017-05-10",
"name": "linkedTemplate",
"type": "Microsoft.Resources/deployments",
"properties": {
"mode": "Incremental",
"templateLink": {
"uri": "[uri(deployment().templateLink.uri, 'appservice.json')]",
"contentVersion": "1.0.0.0"
},
这当然也不对。
"error": {
"code": "InvalidTemplate",
"message": "Unable to process template language expressions for resource '/subscriptions/ba49bae7-2b37-4504-914b-441763a2bcd3/resourceGroups/cfpexchange-jan-test/providers/Microsoft.Resources/deployments/linkedTemplate' at line '1' and column '1526'. 'The language expression property 'templateLink' doesn't exist, available properties are 'name, properties'.'"
}
并且在将其用作变量时,如文档中所述
"variables": {
"sharedTemplateUrl": "[uri(deployment().properties.templateLink.uri, 'shared-resources.json')]"
},
...
"properties": {
"mode": "Incremental",
"templateLink": {
"uri": "[variables('sharedTemplateUrl')]",
"contentVersion": "1.0.0.0"
},
我也遇到了错误。
2018-07-04T19:14:34.4204720Z ##[error]Deployment template validation failed: 'The template variable 'sharedTemplateUrl' is not valid: The language expression property 'templateLink' doesn't exist, available properties are 'template, parameters, mode, debugSetting, provisioningState'.. Please see https://aka.ms/arm-template-expressions for usage details.'.
此时我有点迷茫。从我从文档中了解到的情况来看,我做的一切都是正确的。显然我不是。关于如何继续这个有什么想法吗?
为了完整起见,我此时使用的两个实际文件:
已经对其进行了多次迭代以尝试修复它,但正如所提到的,到目前为止似乎是有效的。
首先,this 是您应该如何在嵌套模板中使用 KV。管理员密码示例:
"adminPassword": {
"reference": {
"keyVault": {
"id": "kv_resource_id"
},
"secretName": "[concat('secret', copyindex(1))]"
}
},
当您调用它时,该部分应该位于嵌套模板参数中(只需查看示例 link)。
您的错误似乎在变量中。所以 templateLink 属性 仅在您从 url 部署主模板时可用,如果您使用本地文件部署主模板,它将不起作用。
将此与远程模板执行进行比较:
New-AzureRmResourceGroupDeployment -ResourceGroupName xxx -TemplateUri 'https://paste.ee/d/XI1Rc/0'
因为这是一个遥控器 url,它应该会向您显示相同的输出,但这次带有 templateLink
属性.
Name Type Value
=============== ========================= ==========
test Object {
"name": "theDeploymentName",
"properties": {
"templateLink": {
"uri": "theRemoteTemplateUri"
},
"template": {
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {},
"variables": {},
"resources": [],
"outputs": {
"test": {
"type": "Object",
"value": "[deployment()]"
}
}
},
"parameters": {},
"mode": "Incremental",
"provisioningState": "Accepted"
}
}
让我们从我想要完成的事情开始。
我想做的是创建一个 ARM 模板,我在其中从 Azure Key Vault 检索机密,而无需在特定 Key Vault 上指定太多细节。听起来很简单,而且可能在每个生产系统中都实现了。
快速搜索后我发现了 the syntax for such a thing is the following。
"parameters": {
"adminPassword": {
"reference": {
"keyVault": {
"id": "[resourceId(subscription().subscriptionId, parameters('vaultResourceGroup'), 'Microsoft.KeyVault/vaults', parameters('vaultName'))]"
},
"secretName": "[parameters('secretName')]"
}
},
据我所知,您需要将其添加到外部模板中,因为所使用的方法不能在 'main' 方法中使用。
所以我开始创建一个 'main' ARM 模板和一个名为 appservice.json
的新模板,其中包含我的应用服务所需的所有内容,包括需要来自 Key Vault 的秘密。
在我的主模板中,我完成了以下操作,as described in the documentation。
{
"apiVersion": "2017-05-10",
"name": "linkedTemplate",
"type": "Microsoft.Resources/deployments",
"properties": {
"mode": "Incremental",
"templateLink": {
"uri": "[uri(deployment().properties.templateLink.uri, 'appservice.json')]",
"contentVersion": "1.0.0.0"
},
但是,在部署时我遇到了以下错误。
"error": {
"code": "InvalidTemplate",
"message": "Unable to process template language expressions for resource '/subscriptions/ba49bae7-2b37-4504-914b-441763a2bcd3/resourceGroups/cfpexchange-jan-test/providers/Microsoft.Resources/deployments/linkedTemplate' at line '1' and column '1526'. 'The language expression property 'templateLink' doesn't exist, available properties are 'name, properties'.'"
}
我也尝试了以下方法,因为我注意到 Visual Studio 中的 IntelliSense 告诉我 properties
没有退出,我应该直接使用 templateLink
。
{
"apiVersion": "2017-05-10",
"name": "linkedTemplate",
"type": "Microsoft.Resources/deployments",
"properties": {
"mode": "Incremental",
"templateLink": {
"uri": "[uri(deployment().templateLink.uri, 'appservice.json')]",
"contentVersion": "1.0.0.0"
},
这当然也不对。
"error": {
"code": "InvalidTemplate",
"message": "Unable to process template language expressions for resource '/subscriptions/ba49bae7-2b37-4504-914b-441763a2bcd3/resourceGroups/cfpexchange-jan-test/providers/Microsoft.Resources/deployments/linkedTemplate' at line '1' and column '1526'. 'The language expression property 'templateLink' doesn't exist, available properties are 'name, properties'.'"
}
并且在将其用作变量时,如文档中所述
"variables": {
"sharedTemplateUrl": "[uri(deployment().properties.templateLink.uri, 'shared-resources.json')]"
},
...
"properties": {
"mode": "Incremental",
"templateLink": {
"uri": "[variables('sharedTemplateUrl')]",
"contentVersion": "1.0.0.0"
},
我也遇到了错误。
2018-07-04T19:14:34.4204720Z ##[error]Deployment template validation failed: 'The template variable 'sharedTemplateUrl' is not valid: The language expression property 'templateLink' doesn't exist, available properties are 'template, parameters, mode, debugSetting, provisioningState'.. Please see https://aka.ms/arm-template-expressions for usage details.'.
此时我有点迷茫。从我从文档中了解到的情况来看,我做的一切都是正确的。显然我不是。关于如何继续这个有什么想法吗?
为了完整起见,我此时使用的两个实际文件:
已经对其进行了多次迭代以尝试修复它,但正如所提到的,到目前为止似乎是有效的。
首先,this 是您应该如何在嵌套模板中使用 KV。管理员密码示例:
"adminPassword": {
"reference": {
"keyVault": {
"id": "kv_resource_id"
},
"secretName": "[concat('secret', copyindex(1))]"
}
},
当您调用它时,该部分应该位于嵌套模板参数中(只需查看示例 link)。
您的错误似乎在变量中。所以 templateLink 属性 仅在您从 url 部署主模板时可用,如果您使用本地文件部署主模板,它将不起作用。
将此与远程模板执行进行比较:
New-AzureRmResourceGroupDeployment -ResourceGroupName xxx -TemplateUri 'https://paste.ee/d/XI1Rc/0'
因为这是一个遥控器 url,它应该会向您显示相同的输出,但这次带有 templateLink
属性.
Name Type Value
=============== ========================= ==========
test Object {
"name": "theDeploymentName",
"properties": {
"templateLink": {
"uri": "theRemoteTemplateUri"
},
"template": {
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {},
"variables": {},
"resources": [],
"outputs": {
"test": {
"type": "Object",
"value": "[deployment()]"
}
}
},
"parameters": {},
"mode": "Incremental",
"provisioningState": "Accepted"
}
}