在arm模板中使用条件IF语句来表示属性,

时间:2017-07-31 08:20:47

标签: azure if-statement conditional-statements

我遇到的情况是,如果满足条件,我只想向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')]"
    },

5 个答案:

答案 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": expressionfalse才能生效。 ARM模板中有几个函数可以评估输入并返回truetrue

参考:
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'))]",