2017-02-22 106 views
1

我試圖創建一個有條件的資源模板。發展環境並不像生產環境那樣健壯,我大部分都很成功地做到這一點。但是,我似乎無法獲得正確的嵌套資源。沒有模板鏈接的ARM模板條件嵌套資源

下面是從我的ARM模板的代碼段:

"webApp-resources": "[variables(concat('webApp-', parameters('env'), '-resources'))]", 
"webApp-dev-resources": [], 
"webApp-prod-resources": [ 
    { 
    "name": "staging", 
    "type": "Microsoft.Web/sites/slots", 
    "location": "[resourceGroup().location]", 
    "apiVersion": "2015-08-01", 
    "dependsOn": [ 
     "[resourceId('Microsoft.Web/sites', variables('webApp-name'))]" 
    ] 
    } 
], 

的想法很簡單,資源變量使用env參數組成。 env參數可以是devprod,雖然此方法有效,但在嘗試部署此模板時出現以下錯誤。

{ 
    "name": "[variables('webApp-name')]", 
    "type": "Microsoft.Web/sites", 
    ... 
    "resources": "[variables('webApp-resources')]" // <- culprit! 
}, 

請求內容是無效的,不能被反序列化:「錯誤轉換值‘的變量(‘web應用資源’)]’輸入」 Microsoft.WindowsAzure.ResourceStack.Frontdoor.Templates.Schema .TemplateResource []」。 Path'properties.template.resources [1] .resources',line 195,position 64.'

我還試圖移動資源到一個變量,並以類似條件的方式非常相似,我們會怎麼做模板嵌套鏈接,但沒有模板鏈接引用變量。

resources: [ 
    "[variables('webApp-resource')]" // <- this doesn't work! 
] 

這導致了一個類似的錯誤,但如果我正確回想了不同的錯誤。

由此我得出結論,ARM模板語法不是簡單地找到並替換我認爲不好的東西,因爲它確實使得更難推理什麼可行,什麼不可行。因爲如果是這樣,這會產生一個有效的模板。我已通過將正確的值粘貼到資源部分進行了驗證。

有沒有人有類似的問題,你是如何解決這個問題的?

+0

實際上,我甚至不確定我是否回答正確的問題,我不完全瞭解你的問題,你能否詳細說明一下位? – 4c74356b41

+0

部署插槽只支持標準和應用程序服務計劃,開發環境不需要部署插槽,所以我選擇不使用它們。但是,我現在有一個部署模板,需要根據部署到的環境而有所不同。我設法做得很好,但是我一直無法添加部署插槽「staging」,因此此插槽僅存在於* prod *環境中。 * dev *環境使用基本層,但* prod *使用標準層。我的問題中的錯誤描繪了各種(IMAO)直接嘗試實現這一目標的過程。 –

+0

你試圖使用'variable'而不是'resource'嗎?我很肯定你不能那樣做,但是你可以有條件地創建slot – 4c74356b41

回答

3

您應該可以在沒有多個模板文件的情況下執行此操作,但不能使用嵌套的部署。所以,根據你想要避免的情況,試試這個:

{ 
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", 
    "contentVersion": "1.0.0.0", 
    "parameters": { 
    "env": { 
     "type": "string", 
     "allowedValues": [ "dev", "prod" ] 
    } 
    }, 
    "variables": { 
    "resourceArray": "[variables(concat('resources', parameters('env')))]", 
    "resourcesprod": [ 
     { 
      "name": "as", 
      "type": "Microsoft.Compute/availabilitySets", 
      "location": "[resourceGroup().location]", 
      "apiVersion": "2015-06-15", 
      "dependsOn": [], 
      "properties": { 
      } 
     } 
     ], 
    "resourcesdev": [] 
    }, 
    "resources": [ 
     { 
     "name": "nest", 
     "type": "Microsoft.Resources/deployments", 
     "apiVersion": "2016-09-01", 
     "dependsOn": [], 
     "properties": { 
      "mode": "Incremental", 
      "template": { 
      "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", 
      "contentVersion": "1.0.0.0", 
      "resources": "[variables('resourceArray')]" 
      }, 
      "parameters": { 
      } 
     } 
     } 
    ], 
    "outputs": {} 
} 
+0

有趣。我基本上這樣做,但我試圖將嵌套的模板資源直接插入資源數組。是否有必要多次指定'$ schema'和'contentVersion'?如果可能,我想保持文件小而緊湊。 –

+0

有什麼特別的東西應該知道關於嵌套部署。我注意到它們在資源組中顯示爲單獨的部署。任何你知道的陷阱? –

+0

我編輯了原始答案中的代碼 - 可以使它更小一些,模式驗證會引發一些警告,但它應該可以正常工作。回覆:陷阱 - 我想不出與你的OP有關。 –