Is it possible to have conditional property in ARM template

Viewed 10052

I understand there is option to have conditional output for property values, but is it possible to have conditional property itself. For example I have template which creates Microsoft.Compute/VirtualMachine and it's the same template for both Windows and Linux. But for windows I need to specify property which do not exist for Linux ("licenseType": "Windows_Server"). Presense of this property will fail deployment with error The property 'LicenseType' cannot be used together with property 'linuxConfiguration'

I'm trying to figure out if it's possible to have this property included only for Windows images while keeping template the same?

2 Answers

yes it is possible, but hacky. several options:

  1. create 2 VM resources with different properties, condition them so that only one gets deployed
  2. use union function and variables to construct resulting object
  3. append property as a separate deployment (might not work with all the cases)

let me expand number two a bit:

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

and then in your object you can do:

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

Here is what I end up doing based on a previous answer as well as comments

  1. Define variable is you are dealing with Windows

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

  1. In properties for VM resource use it as below. No need for nested deployments etc. "properties": { "licenseType": "[if(variables('isWindowsOS'), 'Windows_Server', json('null'))]",
Related