2017-02-20 59 views
0

我有一個包含2級嵌套模板的父級模板,azuredeploy.json-> vmReferenceTemplate.json-> datadiskreference.json當我將所需值從第二級傳遞到第三級時,它將部署很好,但是當從第一級到第三級嵌套模板傳遞完全相同的值時,它不起作用。我想從azuredeploy.json numDataDisks值datadiskreference.json我有一個非常複雜的模板,爲了它的工作,我必須傳遞第一級的值。這是條紋的版本,工作。 azuredeploy.json:Azure RM模板。將複數值傳遞到第三級嵌套模板

{ 
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", 
    "parameters": { 
    ,,, 
    "numberOfVMs": { 
     "type": "int", 
     "defaultValue": 8, 
    }, 
    "numberOfDataDisks": { 
     "type": "array", 
     "defaultValue": [ 
     2, 
     1, 
     3, 
     1, 
     1, 
     1, 
     1, 
     1 
     ] 
    }, 
    ... 
    }, 
    "resources": [ 
    { 
     "name": "[concat(parameters('vmName'), copyIndex(1),'-','reference')]", 
     "type": "Microsoft.Resources/deployments", 
     "apiVersion": "2016-09-01", 
     "copy": { 
     "name": "vmReferenceTemplateLoop", 
     "count": "[parameters('numberOfVMs')]" 
     }, 
     "properties": { 
     "mode": "Incremental", 
     "templateLink": { 
      "uri": "[concat(parameters('_artifactsLocation'), '/', variables('vmReferenceTemplateTemplateFolder'), '/', variables('vmReferenceTemplateTemplateFileName'), parameters('_artifactsLocationSasToken'))]", 
      "contentVersion": "1.0.0.0" 
     }, 
     "parameters": { 
      "numDataDisks": { 
      "value": "[parameters('numberOfVMs')]" 
      } 
     } 
     } 
    } 
    ], 
... 

vmReferenceTemplate.json:

{ 
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", 
    "parameters": { 
    ... 
    "numberOfVMs": { 
     "type": "int", 
     "defaultValue": 2 
    }, 
    "numberOfDataDisks": { 
     "type": "array", 
     "defaultValue": [ 
     2, 
     1, 
     3, 
     1, 
     1, 
     1, 
     1, 
     1 
     ] 
    }, 
    ... 
    }, 
    "resources": 
    { 
     "apiVersion": "2016-09-01", 
     "name": "[parameters('dataDisksReferenceTemplateName')]", 
     "type": "Microsoft.Resources/deployments", 
     "copy": { 
     "name": "dataDiskReferenceLoop", 
     "count": "[parameters('copyNestedReference')]" 
     }, 
     "properties": { 
     "mode": "Incremental", 
     "templateLink": { 
      "uri": "[variables('dataDiskReferenceTemplateUri')]", 
      "contentVersion": "1.0.0.0" 
     }, 
     "parameters": { 
      "vmName": { 
      "value": "[parameters('dataDisksVMnameReference')]" 
      }, 
      "storageAccountName": { 
      "value": "[variables('var_storageAccountName')]" 
      }, 
      "numDataDisks": { 
      "value": "[parameters('numberOfDataDisks')[copyIndex()]]" 
      }, 
      "sizeOfEachDataDiskInGB": { 
      "value": "[variables('sizeOfEachDataDiskInGB')]" 
      } 
     } 
     } 
    } 
    ], 
    ... 

這是我怎樣,我想從1級到3級傳遞值,但它失敗,出現錯誤"Deployment template validation failed: 'The provided value for the template parameter 'numDataDisks' at line '36' and column '22' is not valid.'." azuredeploy以.json

{ 
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", 
    "parameters": { 
    ,,, 
    "numberOfVMs": { 
     "type": "int", 
     "defaultValue": 8, 
    }, 
    "numberOfDataDisks": { 
     "type": "array", 
     "defaultValue": [ 
     2, 
     1, 
     3, 
     1, 
     1, 
     1, 
     1, 
     1 
     ] 
    }, 
    ... 
    }, 
    "resources": [ 
    { 
     "name": "[concat(parameters('vmName'), copyIndex(1),'-','reference')]", 
     "type": "Microsoft.Resources/deployments", 
     "apiVersion": "2016-09-01", 
     "copy": { 
     "name": "vmReferenceTemplateLoop", 
     "count": "[parameters('numberOfVMs')]" 
     }, 
     "properties": { 
     "mode": "Incremental", 
     "templateLink": { 
      "uri": "[concat(parameters('_artifactsLocation'), '/', variables('vmReferenceTemplateTemplateFolder'), '/', variables('vmReferenceTemplateTemplateFileName'), parameters('_artifactsLocationSasToken'))]", 
      "contentVersion": "1.0.0.0" 
     }, 
     "parameters": { 
      "numDataDisks": { 
      "value": "[parameters('numberOfDataDisks')[copyIndex()]]" 
      } 
     } 
     } 
    } 
    ] 
... 

vmReferenceTemplate.json:

{ 
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", 
    "parameters": { 
    ,,, 
    "numberOfVMs": { 
     "type": "int", 
     "defaultValue": 2, 
    }, 
    "numberOfDataDisks": { 
     "type": "array", 
     "defaultValue": [ 
     2, 
     1, 
     3, 
     1, 
     1, 
     1, 
     1, 
     1 
     ] 
    }, 
    ... 
    }, 
    "resources": [ 
    { 
     "apiVersion": "2016-09-01", 
     "name": "[parameters('dataDisksReferenceTemplateName')]", 
     "type": "Microsoft.Resources/deployments", 
     "copy": { 
     "name": "dataDiskReferenceLoop", 
     "count": "[parameters('copyNestedReference')]" 
     }, 
     "properties": { 
     "mode": "Incremental", 
     "templateLink": { 
      "uri": "[variables('dataDiskReferenceTemplateUri')]", 
      "contentVersion": "1.0.0.0" 
     }, 
     "parameters": { 
      "vmName": { 
      "value": "[parameters('dataDisksVMnameReference')]" 
      }, 
      "storageAccountName": { 
      "value": "[variables('var_storageAccountName')]" 
      }, 
      "numDataDisks": { 
      "value": "[parameters('numDataDisks')]" 
      }, 
      "sizeOfEachDataDiskInGB": { 
      "value": "[variables('sizeOfEachDataDiskInGB')]" 
      } 
     } 
     } 
    } 
    ] 
... 
+0

你是說你正在傳遞值1> 2> 3,它不能正確地從父母傳播給孩子的孩子?另外,MS建議使用2級模板;)所以你認爲1> 3,輸出3到2?這樣該模板只有2個級別? – 4c74356b41

+0

是1> 2> 3未通過。我擔心2級別不適合我,因爲我將密鑰庫傳遞給了複製虛擬機(只能在複製虛擬機時使用嵌套模板完成),並將可變數量的數據磁盤傳遞給該副本虛擬機(只能是如果是複製虛擬機,也使用嵌套模板完成)。 – Max

+0

我現在沒時間了,但明天我會回到這裏,告訴你我的意思。 – 4c74356b41

回答

3

在這裏,我們走吧,夥計,就像我在評論中所說的,讓我們做一個魔術!讓我們創建一個帶有2個嵌套模板的模板,但是將1個嵌套模板的輸出傳遞給另一個!

"resources": [ 
    { 
     ... 
     "dependsOn": [ 
      "datadiskcopy" << DEPENDS ON ANOTHER TEMPLATE COPY LOOP !!! 
     ], 
     ... 
      "parameters": { 
       "adminPassword": { 
        "reference": { 
         "keyVault": { 
          "id": "/subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.KeyVault/vaults/xxx" 
         }, 
         "secretName": "[concat('secret', copyindex(1))]" 
        } << KEYVAULT REFERENCE YOU NEED !! 
       }, 
       "diskObject": { 
        "value": "[reference(concat('nested-datadisk-', copyIndex())).outputs.result.value]" << REFERENCE ANOTHER NESTED DEPLOYMENT OUTPUT !! 
       } 
      } 
     } 
    }, 
    { 
     "apiVersion": "2016-09-01", 
     "name": "[concat('nested-datadisk-', copyIndex())]", 
     "type": "Microsoft.Resources/deployments", 
     "copy": { 
      "name": "datadiskcopy", 
      "count": "[parameters('LoopCount')]" 
     }, 
     "properties": { 
      "mode": "Incremental", 
      "templateLink": { 
       "uri": "https://raw.githubusercontent.com/4c74356b41/armotron/master/ml-vm-ml-dd-kv-nst-dd", 
       "contentVersion": "1.0.0.0" 
      }, 
      "parameters": { 
       "numDataDisks": { 
        "value": "[parameters('numberOfDataDisksPerVM')[copyIndex()]]" 
       } 
      } 
     } 
    } 

我會更新鏈接不久,我決定重新命名我的模板了一點,但你可以把我的github上的樣品來看看armotron repo了。

這是使用管理的磁盤爲了簡單,但您可以使用非託管(將是鐵桿,你)

PS。您可能會再次遇到緩存問題,請複製不是來自RAW鏈接的數據。只是測試了這個東西,對我有用,你可以進一步擴展它。

+0

這是完美的!正是我在找什麼。我只是意識到我沒有傳遞來自lvl1-> lvl2-> lvl3的值,而是lvl2-> lvl1-> lvl2-> lvl3,這是不可能的,除非我在代碼中的某處代碼搞亂了。這條消息確實回答了我的問題。謝謝,@ 4c74356b41! – Max

1

雖然這不能直接回答你的問題,但它可能會對更好的解決方案提供一些啓示。我們用ARM模板進行了幾輪配置,以配置我們的Azure基礎架構,包括您現在正在執行的嵌套模板。由於以下原因,我們最終放棄了嵌套模板:

  1. 它們最終在重用方面沒有多大價值。每次我們想要重複使用共享模板時,它總是需要對相關特定場景進行一些調整。這意味着會影響版本號,進行調整並在公共互聯網上提供新版本,同時還可以使用舊版本。
  2. 缺少條件結構(是的,你可以將它們入侵,但它使模板不清楚)使得實現可重用模板變得更加困難。

我們的ARM模板目前如下所示:每個資源組在Github帳戶中都有自己的git-repository,並且資源組中的每個資源都有自己的模板。一個資源組的存儲庫看起來像這樣:

my_group 
├── cloud-config.yaml 
├── deploy.ps1 
├── deploy.sh 
└── resources 
    ├── load_balancer.json 
    ├── nsg.json 
    ├── storage_account.json 
    └── virtual_machine.json 

爲每個資源分配模板使維護更容易。 deploy.sh文件目前只是一系列az group deployment create-部署所有文件的命令,與powershell腳本相同。我們不再需要在沒有身份驗證的情況下在公共Internet上使用我們的ARM模板。您還會注意到,由於此ARM模板僅用於組的一個原因,因此我們不再需要參數文件,參數與其餘代碼一起處理。

我相信這個設置比一個巨大的ARM模板提供了更多的靈活性,這取決於嵌套的模板。我們可以孤立地管理我們想要的所有東西(如cloud-config.yaml),並稍後使用腳本生成用於部署的ARM模板。我們目前正在嘗試爲每個部署創建一個git-tag,然後使用git來確定哪些文件自上次部署以來發生了更改。

+0

他的情況有些不同,他需要那些因爲vm和「keyvault」的「隨機」數量的磁盤。但我對ARM模板也有些不滿,他們有些缺乏 – 4c74356b41

+0

沒錯,只是說如果起點是「一個非常複雜的模板」(正如ARM模板往往會出現的那樣),並且他需要處理概念條件或其他基於邏輯的操作符,我會盡可能簡單地創建ARM模板,並將其餘部分留給更適合的腳本語言。 – gogstad

+0

感謝您的輸入。你的設置看起來非常有效。但是,我必須使用嵌套模板,因爲它是實現多個虛擬機的變量數量的唯一方法。 https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-multiple#create-multiple-instances-when-copy-wont-work我也必須使用嵌套模板用於將密鑰保管庫中的機密作爲這些VM的密碼進行引用https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-manager-keyvault-parameter#reference-a-secret-with-dynamic -id – Max