【问题标题】:Is it possible to have conditional property in ARM templateARM模板中是否可以有条件属性
【发布时间】:2018-12-20 21:46:51
【问题描述】:

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

我想知道是否可以只为 Windows 图像包含此属性,同时保持模板相同?

【问题讨论】:

    标签: azure-resource-manager


    【解决方案1】:

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

    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') ))]"
    

    【讨论】:

    • 这需要将 VirtualMachine 的所有属性定义为 variable 才能工作,对吧?
    • 没必要,你可以在任何级别应用这个,你只是不能定义一半的对象和计算的一半
    • licenseType 属性 VirtualMachine 的顶级属性,所以为了使这种方法起作用,我还需要计算其余属性吗?
    • 如果是直接在属性下,是的。您可以尝试的一件事是:"licenseType": "[json('null')]"
    【解决方案2】:

    这是我根据之前的答案和 cmets 最终做的事情

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

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

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

    【讨论】:

    • 但是对于 Linux VM,您仍然有一个 licenseType 属性,只是具有空值,对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多