1

我正在尝试通过在 copyIndex 循环中转换运行时资源属性来有条件地提供资源属性值。

部署以下 ARM 模板后,我收到错误消息:

无法在第 30 行处理资源“/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Compute/virtualMachines/{vm-name}/extensions/Microsoft.EnterpriseCloud.Monitoring”的模板语言表达式和“10”列。'找不到模板资源'/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Compute/virtualMachines/{vm-name}'。' (代码:无效模板)

"type": "[variables('extensionType')[reference(concat('Microsoft.Compute/virtualMachines/', parameters('virtualMachines')[copyIndex()].name)).storageProfile.osDisk.osType]]",

但是,VM 以其提供的 ID 存在,因此引擎找不到它是没有意义的。如果我对扩展类型进行硬编码,则没有错误,并且扩展安装在具有相同 ID 的 VM 上。

不幸的是,我不知道这是否是 ARM 中的错误,或者我只是做错了什么..

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "workspaceResourceId": { "type": "string" },
        "virtualMachines": { "type": "array" }
    },
    "variables": {
        "extensionType": {
        "Windows": "MicrosoftMonitoringAgent",
        "Linux": "OmsAgentForLinux"
        }
    },
    "resources": [
        {
        "copy": {
            "name": "VMMonitoringExtensionsCopy",
            "count": "[length(parameters('virtualMachines'))]"
        },
        "type": "Microsoft.Compute/virtualMachines/extensions",
        "apiVersion": "2015-05-01-preview",
        "location": "[parameters('virtualMachines')[copyIndex()].location]",
        "name": "[concat(parameters('virtualMachines')[copyIndex()].name, '/Microsoft.EnterpriseCloud.Monitoring')]",
        "properties": {
            "publisher": "Microsoft.EnterpriseCloud.Monitoring",
            "type": "[variables('extensionType')[reference(concat('Microsoft.Compute/virtualMachines/', parameters('virtualMachines')[copyIndex()].name)).storageProfile.osDisk.osType]]",
            "typeHandlerVersion": "1.0",
            "autoUpgradeMinorVersion": true,
            "settings": {
            "workspaceId": "[reference(parameters('workspaceResourceId'), '2015-11-01-preview').customerId]"
            },
            "protectedSettings": {
            "workspaceKey": "[listKeys(parameters('workspaceResourceId'), '2015-11-01-preview').primarySharedKey]"
            }
        }
        }
    ]
}

为 virtualMachines 传入的对象数组如下所示:

[
    { "name": "vm-name", "location": "azure-region" }
]
4

1 回答 1

0

您可以尝试几件事:

1) 假设 VM 未在同一模板中定义,请尝试在参考函数中使用“完整”资源 ID。请参阅此文档中的最后一个示例: https ://azure.microsoft.com/en-us/documentation/articles/resource-group-template-functions/#reference - 似乎错误已经知道完整的resourceId,但它是值得尝试

2)另一个想法是引用函数在运行时被评估,资源提供者不喜欢这个表达式,但这是一个赃物。

我会做更多的戳,看看我们是否不能确定这一点。

于 2016-05-26T14:55:44.460 回答