web-dev-qa-db-fra.com

Est-il possible d'avoir une propriété conditionnelle dans le modèle ARM

Je comprends qu'il existe une option pour avoir une sortie conditionnelle pour les valeurs de propriété, mais est-il possible d'avoir une propriété conditionnelle elle-même. Par exemple, j'ai un modèle qui crée Microsoft.Compute/VirtualMachine et c'est le même modèle pour Windows et Linux. Mais pour les fenêtres, je dois spécifier une propriété qui n'existe pas pour Linux ("licenseType": "Windows_Server"). Présence de cette propriété échouera le déploiement avec l'erreur The property 'LicenseType' cannot be used together with property 'linuxConfiguration'

J'essaie de comprendre s'il est possible d'avoir cette propriété incluse uniquement pour les images Windows tout en conservant le même modèle?

7
Gregory Suvalian

oui c'est possible, mais hacky. plusieurs options:

  1. créer 2 VM avec des propriétés différentes, les conditionner pour qu'une seule soit déployée
  2. utiliser la fonction et les variables d'union pour construire l'objet résultant
  3. ajouter la propriété en tant que déploiement séparé (peut ne pas fonctionner avec tous les cas)

permettez-moi de développer un peu le numéro deux:

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

puis dans votre objet vous pouvez faire:

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

Voici ce que je finis par faire sur la base d'une réponse précédente ainsi que des commentaires

  1. La variable définie est que vous traitez avec Windows

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

  1. Dans les propriétés pour VM l'utilise comme ci-dessous. Pas besoin de déploiements imbriqués, etc. "properties": { "licenseType": "[if(variables('isWindowsOS'), 'Windows_Server', json('null'))]",
3
Gregory Suvalian