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

Gre*_*ian 6 azure-resource-manager

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

我试图弄清楚是否有可能仅在Windows映像中包含此属性,同时保持模板不变?

Gre*_*ian 12

这是我根据之前的答案和评论最终所做的

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

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

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

  • 但对于 Linux VM,您仍然有一个“licenseType”属性,只是值为空,对吧? (2认同)

4c7*_*b41 6

是的,这是可能的,但是很客气。几种选择:

  1. 创建2个具有不同属性的VM资源,对其进行条件处理,以便仅部署其中一个
  2. 使用联合函数和变量构造结果对象
  3. 将属性追加为单独的部署(可能不适用于所有情况)

让我扩大第二位:

"variables": {
    "baseObject": {
        "propertyOne": "xxx",
        "propertyTwo": "yyy
    }
    "additionalObject: {
        "optionalProperty": "zzz"
    }
}
Run Code Online (Sandbox Code Playgroud)

然后可以在您的对象中执行以下操作:

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

  • 如果它直接在属性下,是的。你可以尝试做的一件事是:`"licenseType": "[json('null')]"` (2认同)
  • 看看:https://github.com/Azure/azure-quickstart-templates/blob/master/201-vm-custom-script-output/nestedtemplates/vm.json#L166 (2认同)