是否可以在 ARM 模板中有条件 属性

Is it possible to have conditional property in ARM template

我知道有条件输出 属性 值的选项,但是否可以有条件 属性 本身。例如,我有创建 Microsoft.Compute/VirtualMachine 的模板,它是 Windows 和 Linux 的相同模板。但是对于 windows,我需要指定 属性,Linux 不存在("licenseType": "Windows_Server")。此 属性 的存在将导致部署失败并出现错误 The property 'LicenseType' cannot be used together with property 'linuxConfiguration'

我想弄清楚是否可以在保持模板不变的情况下仅将此 属性 包含在 Windows 图像中?

是的,这是可能的,但是很麻烦。几个选项:

  1. 创建 2 个具有不同属性的 VM 资源,调整它们以便只部署一个
  2. 使用联合函数和变量构造结果对象
  3. 附加 属性 作为单独的部署(可能不适用于所有情况)

让我稍微扩展一下第二个:

"variables": {
    "baseObject": {
        "propertyOne": "xxx",
        "propertyTwo": "yyy
    }
    "additionalObject: {
        "optionalProperty": "zzz"
    }
}

然后在你的对象中你可以做:

"property": "[if(something, variables('baseObject'), # new line for readability
    union(variables('baseObject'), variables('additionalObject') ))]"

这是我根据之前的回答和评论最终做的事情

  1. 定义变量是你正在处理的Windows

"isWindowsOS": "[equals(parameters('ImageReferenceOffer'), 'WindowsServer')]"

  1. 在 VM 资源的属性中使用它,如下所示。不需要嵌套部署等。 "properties": { "licenseType": "[if(variables('isWindowsOS'), 'Windows_Server', json('null'))]",