2016-03-09 15 views
7

Czy istnieje sposób użycia instrukcji warunkowych w szablonach?Korzystanie z warunków w szablonach ARM Azure

Na przykład buduję szablon, który będzie miał vms z dyskami danych na QA i Production, ale nie będzie dysków danych w Dev. Innym scenariuszem byłoby, że niektóre rozszerzenia muszą być zainstalowane tylko w maszynach wirtualnych prod, ale gdzie indziej.

Każda pomoc jest doceniana.

+0

nie jest to prawdą, podczas gdy nie ma bezpośredniego wsparcia dla warunkowych logicznych podobnych rzeczy można zrobić za pomocą obiektów i zmiennych – 4c74356b41

Odpowiedz

4

Kluczowe właściwości do osiągnięcia tego celu są:

  • templateLink że ustawia szablon zostać włączone i nazwy parametrów mają być przekazane do wywoływanego szablonu.

    "templateLink": { 
        "uri": "[variables('sharedTemplateUrl')]", 
        "contentVersion": "1.0.0.0" 
    } 
    
  • newOrExisting na podstawie jego wartości może zdecydujemy się użyć QA porównaniu Productoin jest config.

    "newOrExisting": "new", 
    
    "configHash": { 
        "new": "[concat(parameters('templateBaseUrl'),'partials/QA.json')]", 
        "existing": "[concat(parameters('templateBaseUrl'),'partials/Production.json')]" 
    } 
    
    "configTemplate": "[variables('configHash')[parameters('Settings').newOrExisting]]" 
    

Widać Azure ARM deployments: how to perform conditional deployments która przedstawiła więcej szczegółów.

+2

Znalazłem jeszcze jeden sposób, używając szablonów podrzędnych, jak pokazano w poniższym przykładzie dla hasło Typ uwierzytelniania. https://github.com/Azure/azure-quickstart-templates/blob/master/checkpoint-single-nic/azuredeploy.json#L11 – nitinb

+0

@nitinb oczywiście nie przeszkadza ci, że nie ma zagnieżdżonego \ dziecka szablon użyty w tym przykładzie ... – 4c74356b41

+0

Wydaje się, że działa to tylko w celu dynamicznego zmieniania między szablonami - ale co z tym, kiedy nie chcesz w ogóle tworzyć określonego zasobu, a czasem robisz? Powiedz, aby włączyć autoskalowanie w prod, ale nie w teście. –

7

Możesz wykorzystać nowo opublikowane funkcje porównania, aby zrealizować większość tego.

Oto przykład użycia parametru do określenia, czy konto pamięci masowej powinno zostać wdrożone.

Parametr:

"deployStorage": { 
    "type": "string" 
}, 

zasobów:

{ 
    "condition": "[equals(parameters('deployStorage'),'yes')]", 
    "name": "[variables('storageAccountName')]", 
    "type": "Microsoft.Storage/storageAccounts", 
    "location": "[resourceGroup().location]", 
    "apiVersion": "2017-06-01", 
    "sku": { 
    "name": "[parameters('storageAccountType')]" 
    }, 
    "kind": "Storage" 
} 

Wskazówka nowa nieruchomość w stan zasobu wraz z najnowszą wersją API dla dostawcy pamięci.

referencyjny: https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-template-functions-comparison

+0

Nie wiesz, dlaczego zostałeś odrzucony . to działa przyjemność! – Mike

+0

Używam elementu condition w moich szablonach i oczekuję, że nie będzie oczekiwać parametru storageAccountName, jeśli parametr "deployStorage" nie jest ustawiony na "yes".Występuje jednak błąd z następującą weryfikacją szablonu wdrażania: InvalidTemplate : "Wartość parametru szablonu" name "w wierszu" 166 "i kolumnie" 39 "nie została podana." Czy element warunku jest tutaj poprawny, jeśli chcę, aby Azure nie pytał o parametr zasobu, gdy parametr deployStorage jest ustawiony na "nie"? – ForeverLearner