2017-07-31 74 views
3

我有一種情況,我只想添加一個屬性到虛擬機,如果條件滿足。例如,如果我想將可用性集屬性添加到計算機,那麼執行此操作:在我下面我只有在條件爲TRUE時執行可用性集語句的情況下,您可以在ARM模板中執行此操作嗎?例如,如果一個值是真的,那麼做這一行,如果不跳過?在arm模板中使用條件IF語句的屬性

{ 
    "name": "[parameters('ComputerName')]", 
    "type": "Microsoft.Compute/virtualMachines", 
    "location": "[parameters('location')]", 
    "apiVersion": "2017-03-30", 
    "dependsOn": [ 
    "[resourceId('Microsoft.Network/networkInterfaces', variables('1stNicName'))]", 
    "[resourceId('Microsoft.Network/networkInterfaces', variables('2ndicName'))]" 
    ], 
    "tags": { 
    "displayName": "[parameters('ComputerName')]" 
    }, 

    "properties": 

{ 
"availabilitySet": { 
     "id": "[resourceId('Microsoft.Compute/availabilitySets',variables('availabilitySetName'))]" 
    }, 


"hardwareProfile": { 
     "vmSize": "[parameters('serverVmSize')]" 


}, 
    "osProfile": { 
     "computerName": "[parameters('serverName')]", 
     "adminUsername": "[parameters('adminUsername')]", 
     "adminPassword": "[parameters('adminPassword')]" 
    }, 

回答

0

有這樣做的直接方式。你可以使用條件來選擇一個值,但是你不能設置一個值或者通過null(除非你想爲'屬性'定義2個變量)。

所以你可以定義2個VM資源是除了在有關財產(使availabilitySet)如出一轍。一個會有它,另一個則不會。你會在這兩個資源中使用"condition": expression。條件應該等於falsetrue才能正常工作。 ARM模板中有幾個功能可以評估輸入並返回truefalse

參考:
https://samcogan.com/conditions-in-arm-templates-the-right-way/

+0

所以,僅僅是明確的,沒有辦法只在資源部署本身上對資源的屬性放置條件? – itye1970

+0

是的,確切地說。 @ itye1970,我覺得非常討厭 – 4c74356b41

+0

我會留意引用的博客文章的更新... –

2

截至本週(2017年8月1日)的,ARM模板現在有可用於變量,屬性和資源參數IF函數。它的工作原理像大多數其他ARM功能,具有類似的語法:

[if(condition, true value, false value)] 

example in the documentation做你問什麼,添加(或不添加)的availbility設置爲VM:

"apiVersion": "2016-03-30", 
      "type": "Microsoft.Compute/virtualMachines", 
      "properties": { 
       "availabilitySet": "[if(equals(parameters('availabilitySet'),'yes'), variables('availabilitySet'), json('null'))]", 
       ... 
      } 

請注意,True值(即設置爲使用的可用性)在if語句中作爲變量而不是內聯存儲。

"variables": { 
    ... 
    "availabilitySetName": "availabilitySet1", 
    "availabilitySet": { 
     "id": "[resourceId('Microsoft.Compute/availabilitySets',variables('availabilitySetName'))]" 
    } 
}, 
+0

這很棒,非常有用...會嘗試。很多感謝 – itye1970

+0

我不認爲這個工具已經更新了,但它不會導致你運行它的任何問題,我當然沒有遇到任何問題。如果您在運行時遇到錯誤,那麼它可能尚未推出到您所在的地區,然後在美國西部中心進行測試,因爲它絕對存在。 –

0

當我嘗試了負載均衡器後端池同我得到的錯誤:

12:21:49 - [錯誤] 「消息」:「不能反序列化JSON當前對象(例如

(錯誤){\「name \」:\「value \」})輸入'Microsoft.WindowsAzure.Networking.Nrp.Frontend

12:21:49 - [ERROR] .Contract .Csm.Public.ResourceReferenceHashSet`2 [Microsoft.WindowsAzure.Networki

12點21分49秒 - [ERROR] ng.Nrp.Frontend.Contract.Csm.Public.LoadBalancerBackendAddressPool,Microsoft.Wi

12點21分49秒 - [ERROR] ndowsAzure.Networking.Nrp.Frontend.Contract .Csm.Public.NetworkInterfaceIpConfig

12時21分49秒 - [ERROR] uration]」,因爲類型要求JSON陣列(例如[1,2,3]),以反序列化

12時21分49秒 - [ERROR]正確\ r \ n要解決這個錯誤或者改變JSON到JSON陣列(例如

12點21: 49 - [ERROR] [1,2,3]),或改變它的反序列化類型,以便它是一個正常的.NET類型

12時21分49秒 - [ERROR](例如不是像整數這樣的原始類型,也不是像數組那樣的集合類型

12:21:49 - [ERROR]或List)可以從JSON對象反序列化。 JsonObjectAttribute

十二時21分49秒 - [ERROR]也可以添加到該類型迫使它從JSON反序列化

變量

「availabilitySet」:{ 「ID」:「[ resourceId('Microsoft.Compute/availabilitySets',parameters('availabilitySetName'))] } ))]「 },

「loadBalancerBackendAddressPools」: 「[IF(等於(參數( 'DeployavailabilitySet'), '是'),變量( 'loadBalancerBackendAddressPools'),JSON( '空'))」,