我遇到的情况是,如果满足条件,我只想向VM添加属性。例如,如果我想将一个可用性集属性添加到计算机,那么执行以下操作:下面我只有在条件为TRUE时执行可用性集语句的内容,是否可以在ARM模板中执行此操作?例如,如果值为true,则执行此行,如果不跳过?
{
"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 :(得分:4)
截至本周(2017年8月1日),ARM模板现在具有IF功能,可用于变量,属性和资源参数。它像大多数其他ARM函数一样工作,语法如下:
[if(condition, true value, false value)]
example in the documentation完全符合您的要求,为虚拟机添加(或不添加)可用性集:
"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'))]"
}
},
答案 1 :(得分:0)
没有直接的方法可以做到这一点。你可以使用条件来选择一个值,但不能设置值或传入PowerMockito.doReturn(system).when(service).getValidatedDto(
Matchers.any(Long.class), Matchers.any(Date.class));
(除非你想为`属性'定义2个变量)。
所以你可以定义两个完全相同的vm资源,除了有问题的属性(所以null
)。一个人会拥有它而另一个人不会。并且您将在两个资源中使用availabilitySet
。条件应该等于"condition": expression
或false
才能生效。 ARM模板中有几个函数可以评估输入并返回true
或true
。
参考:
https://samcogan.com/conditions-in-arm-templates-the-right-way/
答案 2 :(得分:0)
"variables": {
"loadBalancerBackendAddressPools": [
{
"id": "[parameters('lbBackendAddressPool')]"
}
]
},
答案 3 :(得分:0)
相信我已经找到了一种避免为可用性集定义两个完整 VM 定义的可行方法。以下是我自己在使用大量条件控件制作的 arm 模板中进行的测试。
这有效:
"availabilitySet": {
"id": "[resourceId('Microsoft.Compute/availabilitySets',parameters('availabilitySetName'))]"
}
这不会:
"availabilitySet": "[if(equals(parameters('availabilitySet'),'yes'), variables('availabilitySet'), json('null'))]",
由于 ID 为“空”,这也不起作用:
"availabilitySet": {
"id": "[if(equals(parameters('availabilitySet'),'yes'), variables('availabilitySet'), json('null'))]"
}
我添加了以下变量和参数:
"parameters": {
"SpotInstance": {
"type": "bool",
"defaultValue": false,
"allowedValues": [
true,
false
],
"metadata": {
"description": "Should the VM be deployed as a low cost Spot Instance, this will deploy without attaching the Availability Set."
}
}
},
"variables": {
"AvailibilitySet": {
"On":{
"id":"[resourceId('Microsoft.Compute/availabilitySets/',variables('ASName'))]"
},
"Off":"[json('null')]"
}
}
然后在可用性集分配上使用此逻辑:
"availabilitySet": "[if(equals(parameters('SpotInstance'),bool('true')),variables('AvailibilitySet').Off,variables('AvailibilitySet').On)]",
如果您没有将 id 定义为“AvailabilitySet”的属性,则这可以为 null,如果您这样做,则它不能为 null。
答案 4 :(得分:-1)
当我为loadbalancer后端池尝试相同时,我会收到错误:
12:21:49 - [ERROR]" message":"无法反序列化当前的JSON对象(例如
12:21:49 - [ERROR] {\" 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 - [错误]正确。\ r \ n要解决此错误,请将JSON更改为JSON数组(例如
12:21:49 - [ERROR] [1,2,3])或更改反序列化类型,使其成为普通的.NET类型
12:21:49 - [ERROR](例如,不是像整数这样的基本类型,不是像数组一样的集合类型
12:21:49 - [ERROR]或List)可以从JSON对象反序列化。 JsonObjectAttribute
12:21:49 - [ERROR]也可以添加到类型中以强制它从JSON反序列化
变量
" availabilitySet":{ " id":" [resourceId(' Microsoft.Compute / availabilitySets',参数(' availabilitySetName'))]" }, " loadBalancerBackendAddressPools":{ " id":" [resourceId(' Microsoft.Network/loadBalancers' ;,参数(' LoadBalancername'))]" },
" loadBalancerBackendAddressPools":" [if(等于(参数(' DeployavailabilitySet'),' yes'),变量(' loadBalancerBackendAddressPools& #39;),json(' null'))]",