2017-02-17 45 views
2

我希望能夠通過每個虛擬機具有不同密碼的參數(通過複製實現)來指定VM的數量(例如,secret1用於VM1,secret2用於VM2等) 。)下面是複製VM模板的一個基本的例子:Azure RM模板。從密鑰庫部署具有唯一密鑰的副本虛擬機

{ 
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", 
    "contentVersion": "1.0.0.0", 
    "parameters": { 
    "numberOfVMs": { 
     "type": "int", 
     "defaultValue": 1, 
     "minvalue": 1 
    }, 
    "vmAdminUserName": { 
     "type": "string", 
     "minLength": 1 
    }, 
     "vmAdminPassword": { 
      "type": "securestring" 
     } 
    }, 
    "variables": { 
    "storageAccountName": "[concat('stor567', uniqueString(resourceGroup().id))]", 
    "storageAccountType": "Standard_LRS", 
    "vmWindowsOSVersion": "2016-Datacenter", 
    "vnetPrefix": "10.0.0.0/16", 
    "vnetSubnet1Name": "Subnet-1", 
    "vnetSubnet1Prefix": "10.0.0.0/24", 
    "nicVnetID": "[resourceId('Microsoft.Network/virtualNetworks', 'vnet')]", 
    "nicSubnetRef": "[concat(variables('nicVnetID'), '/subnets/', variables('vnetSubnet1Name'))]", 
    "vmImagePublisher": "MicrosoftWindowsServer", 
    "vmImageOffer": "WindowsServer", 
    "vmVmSize": "Standard_DS1_v2", 
    "vmVnetID": "[resourceId('Microsoft.Network/virtualNetworks', 'vnet')]", 
    "vmSubnetRef": "[concat(variables('vmVnetID'), '/subnets/', variables('vnetSubnet1Name'))]", 
    "vmStorageAccountContainerName": "vhds" 
    }, 
    "resources": [ 
     { 
      "name": "[variables('storageAccountName')]", 
      "type": "Microsoft.Storage/storageAccounts", 
      "location": "[resourceGroup().location]", 
      "apiVersion": "2015-06-15", 
      "dependsOn": [ ], 
     "properties": { 
      "accountType": "[variables('storageAccountType')]" 
     } 
     }, 
     { 
      "name": "vnet", 
      "type": "Microsoft.Network/virtualNetworks", 
      "location": "[resourceGroup().location]", 
      "apiVersion": "2016-03-30", 
      "dependsOn": [ ], 
      "tags": { 
       "displayName": "vnet" 
      }, 
      "properties": { 
       "addressSpace": { 
        "addressPrefixes": [ 
         "[variables('vnetPrefix')]" 
        ] 
       }, 
       "subnets": [ 
        { 
         "name": "[variables('vnetSubnet1Name')]", 
         "properties": { 
          "addressPrefix": "[variables('vnetSubnet1Prefix')]" 
         } 
        } 
       ] 
      } 
     }, 
    { 
     "name": "[concat('NIC',copyindex())]", 
     "type": "Microsoft.Network/networkInterfaces", 
     "location": "[resourceGroup().location]", 
     "copy": { 
     "name": "nicLoop", 
     "count": "[parameters('numberOfVMs')]" 
     }, 
     "apiVersion": "2016-03-30", 
     "dependsOn": [ 
     "[resourceId('Microsoft.Network/virtualNetworks', 'vnet')]" 
     ], 
     "tags": { 
     "displayName": "nic" 
     }, 
     "properties": { 
     "ipConfigurations": [ 
      { 
      "name": "ipconfig1", 
      "properties": { 
       "privateIPAllocationMethod": "Dynamic", 
       "subnet": { 
       "id": "[variables('nicSubnetRef')]" 
       } 
      } 
      } 
     ] 
     } 
    }, 
    { 
     "name": "[concat('VM',copyindex())]", 
     "type": "Microsoft.Compute/virtualMachines", 
     "location": "[resourceGroup().location]", 
     "copy": { 
     "name": "virtualMachineLoop", 
     "count": "[parameters('numberOfVMs')]" 
     }, 
     "apiVersion": "2015-06-15", 
     "dependsOn": [ 
     "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]", 
     "nicLoop" 
     ], 
     "tags": { 
     "displayName": "vm" 
     }, 
     "properties": { 
     "hardwareProfile": { 
      "vmSize": "[variables('vmVmSize')]" 
     }, 
     "osProfile": { 
      "computerName": "[concat('VM',copyindex())]", 
      "adminUsername": "[parameters('vmAdminUsername')]", 
      "adminPassword": "[parameters('vmAdminPassword')]" 
     }, 
     "storageProfile": { 
      "imageReference": { 
      "publisher": "[variables('vmImagePublisher')]", 
      "offer": "[variables('vmImageOffer')]", 
      "sku": "[variables('vmWindowsOSVersion')]", 
      "version": "latest" 
      }, 
      "osDisk": { 
      "name": "vmOSDisk", 
      "vhd": { 
       "uri": "[concat(reference(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2016-01-01').primaryEndpoints.blob, variables('vmStorageAccountContainerName'), '/', 'VM',copyIndex(),'-','OSdisk.vhd')]" 
      }, 
      "caching": "ReadWrite", 
      "createOption": "FromImage" 
      } 
     }, 
     "networkProfile": { 
      "networkInterfaces": [ 
      { 
       "id": "[resourceId('Microsoft.Network/networkInterfaces', concat('NIC',copyindex()))]" 
      } 
      ] 
     } 
     } 
    }], 
    "outputs": {} 
} 

不過,我掙扎着從重點庫在模板中唯一的祕密使用密碼進行整合。如果我使用官方文檔中的示例Reference a secret with static id將爲每個虛擬機創建具有secret1的虛擬機。我不能換Reference a secret with dynamic id到嵌套模板,因爲這會爲虛擬機的每一個數字,我想再次部署和重新部署我的複製虛擬機。請幫我理解,這個挑戰如何解決?

+0

你爲什麼不能做到這一點與嵌套模板和copyloop?我很難理解 – 4c74356b41

+0

因爲它只是不會部署。 http://pastebin.com/w2p8n0te 假設我想創建2個虛擬機(例如),但是嵌套定義爲主模板中的副本,因此ARM會嘗試部署這2個虛擬機,然後立即再次部署它們,但是另一個祕密。 這裏是主模板azuredeploy.json: http://pastebin.com/tSyPp8fH 這裏是嵌套模板nestedTemplate.json: http://pastebin.com/FTrbmrnc – Max

+0

我想,我終於得到了你說的話這個案例看起來很有趣。我會嘗試創建一個解決方案 – 4c74356b41

回答

3

鏈接:ParentNested。 我不確定這是你的意思(因爲我仍然認爲我很難理解你的問題)。

這些模板允許部署可變數量的虛擬機,並使用不同的keyvault密鑰作爲密碼。例如:

2的Windows虛擬機的一個祕密和3 Ubuntu的虛擬機與其他
1的Windows虛擬機有一個祕密和4 Ubuntu的虛擬機與其他

您可以輕鬆地擴展,爲其他圖像,像CentOS的。
正如您在查看模板後可能會看到的,我正在使用arrayscopyindex()來提供它們所屬的適當值。

告訴我,如果那不是你以後的樣子。要小心使用這些時,GitHub的原始鏈接使用某種形式的緩存,從GitHub這樣部署可能會爲你的錯誤不能正常工作,在這種情況下,只要使用我提供的鏈接(不RAW)複製到本地計算機,並上傳到一些像pastebin這樣的服務,並從那裏部署。

+0

你做了什麼樣的不是我一直在尋找,但你的做法給予嵌套模板單獨計數和餵養它數組正是我需要的。一如往常,你的答案是最有幫助的。我相信,你應該得到MVP。有你的模板,一對情侶在嵌套模板錯別字的一對夫婦的問題,如果你部署的嵌套模板多計數,他們可能互相(VNETs和可用性組試圖彼此覆蓋設置)發生衝突,所以它可能是更好地將VNET和可用性集移到父模板。但我對此100%滿意! – Max

+0

拼寫錯誤?你能指出他們嗎?我已經部署了該模板,它的工作完美無瑕,您是否遵循了關於github及其緩存的建議? @Max和感謝的友好的話;) – 4c74356b41

+0

是的,我自己遇到了GitHub緩存問題。有時它會立即給ARM新版本,有時它甚至不會給5分鐘內新生成的文件。 在您的嵌套模板中,我必須在第10行添加逗號, 必須將第45行和第50行替換爲: ''virtualNetworkName「:」concat [參數(「前綴」),'myVNET']「,' ' 「availabilitySetName」: 「CONCAT [參數(」 前綴 「), 'myAvSet']」,' 否則它不會從VS部署我。 – Max