2017-12-11 3 views
0

Ich versuche, eine ARM-Vorlage zu erstellen, die einen App Service Plan und einen App Service enthält, aber nur den App Service Plan erstellt, wenn ein optionaler Parameter mit Bezug auf Ein vorhandener App Service Plan ist nicht festgelegt.Azure ARM Bereitstellen von App Service Plan basierend auf Eingabeparametern

Daher sollte der ARM entweder einen App Service Plan für den App Service erstellen, den vorhandenen App Service Plan einfach verwenden, der als Parameter angegeben wird.

Wie ist das möglich?

SOLUTION

Hier ist die finale ARM-Vorlage, die

{ 
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", 
    "contentVersion": "1.0.0.0", 
    "parameters": { 
    "currentServiceplanId": { 
     "type": "string", 
     "defaultValue": "", 
     "metadata": { 
     "description": "Optional. Use an existing serviceplan for deployment" 
     } 
    }, 
    "serviceplanSkuName": { 
     "type": "string", 
     "defaultValue": "B1", 
     "allowedValues": [ 
     "B1", 
     "B2", 
     "B3", 
     "S1", 
     "S2", 
     "S3", 
     "P1", 
     "P2", 
     "P3", 
     "P4" 
     ], 
     "metadata": { 
     "description": "Describes plan's pricing tier and capacity. Check details at https://azure.microsoft.com/en-us/pricing/details/app-service/" 
     } 
    } 
    }, 
    "variables": { 
    "prefix": "setup05", 
    "serviceplanName": "[concat(variables('prefix'), 'serviceplan')]", 
    "serviceplanId": "[variables('serviceplanIdSelector')[string(equals(length(parameters('currentServiceplanId')), 0))]]", 
    "serviceplanIdSelector": { 
     "true": "[resourceId('Microsoft.Web/serverfarms', variables('serviceplanName'))]", 
     "false": "[parameters('currentServiceplanId')]" 
    }, 
    "api-appName": "[concat(variables('prefix'), 'api-app')]" 
    }, 
    "resources": [ 
    { 
     "name": "[variables('serviceplanName')]", 
     "condition": "[equals(length(parameters('currentServiceplanId')), 0)]", 
     "type": "Microsoft.Web/serverfarms", 
     "location": "[resourceGroup().location]", 
     "apiVersion": "2015-08-01", 
     "sku": { 
     "name": "[parameters('serviceplanSkuName')]" 
     }, 
     "properties": { 
     "name": "[variables('serviceplanName')]", 
     "numberOfWorkers": 1 
     } 
    }, 
    { 
     "name": "[variables('api-appName')]", 
     "type": "Microsoft.Web/sites", 
     "location": "[resourceGroup().location]", 
     "apiVersion": "2015-08-01", 
     "dependsOn": [ 
     "[resourceId('Microsoft.Web/serverfarms', variables('serviceplanName'))]" 
     ], 
     "properties": { 
     "name": "[variables('api-appName')]", 
     "serverFarmId": "[variables('serviceplanId')]" 
     } 
    } 
    ], 
    "outputs": { 
    "ApiDefaultHostname": { 
     "value": "[reference(variables('api-appName')).defaultHostName]", 
     "type": "string" 
    }, 
    "ApiAppName": { 
     "value": "[variables('api-appName')]", 
     "type": "string" 
    } 
    } 
} 
+0

Hier ist ein Beispiel für das, was ich versucht habe: https://pastebin.com/PnH6ehf6 - aber das Problem in dieser Vorlage ist, wenn ich möchte, dass ein neuer Service-Plan erstellt wird - der App-Service wartet auf den App-Service Plan erstellt werden - aber ich bin nicht in der Lage, eine Dependon zu setzen. irgendwelche Vorschläge? – pajzo

+0

Ich denke, dass Sie ** templatelink ** verwenden können, um zwei Vorlagen zu verwenden. Eine für die Erstellung von App-Service-Plan, die andere für die Verwendung vorhandener Service-Plan. Bei dieser Methode sollten Sie bereits Tow-Vorlagen mit einem bestimmten Namen vorbereiten. Ich bin mir nicht sicher, ob Sie das verstehen können. Aber diese Methode sollte funktionieren. Sie können auf diese Vorlage verweisen, um ** templatelink ** zu verwenden: https: //github.com/rjmax/ArmExamples/blob/master/NewOrExistingTemplate.json –

+0

Hallo, @ pajzo, die Vorlagen in Ihrer Lösung funktionierten nicht für mich . Ich habe gerade die Bereitstellung fehlgeschlagen. –

Antwort

3

In Ihrem Fall funktioniert sollten Sie eine dependsOn Eigenschaft auf den webApp hinzufügen:

dependsOn: [ 
    "[variables('serviceplanName')]" 
] 

Auf diese Weise wird es warte, bis es fertig ist, wenn es erstellt werden muss.

+0

Das funktioniert nicht, ich denke - weil es dann fehlschlägt, wenn ich eine vorhandene Service-Plan-ID als Parameter gebe - hängt nur von Ressourcen ab, die in der Vorlage – pajzo

+0

implementiert sind Ressource in der Vorlage, ich sehe nicht, warum es nicht funktioniert, depends kümmert sich nicht, was Sie an die Ressourceneigenschaften übergeben. es interessiert nur die Reihenfolge der Ausführung. das wird beibehalten – 4c74356b41

+0

Ja, aber die 'serviceplanName' Ressource wird nicht immer bereitgestellt. Also ich bin mir ziemlich sicher, es wird nicht funktionieren, aber ich werde versuchen – pajzo

Verwandte Themen