基于JSON的变量标记

基于JSON的变量标记,json,azure,azure-resource-manager,arm-template,Json,Azure,Azure Resource Manager,Arm Template,我们使用以下模板通过使用ARM模板部署多个ResourceGroup: "parameters": { "ResourceGroups": { "type": "array", "defaultValue": [ "RG1", "RG2", "RG3" ] } "resources": [ {

我们使用以下模板通过使用ARM模板部署多个ResourceGroup:

"parameters": {
    "ResourceGroups": {
          "type": "array",
          "defaultValue": [
            "RG1",
            "RG2",
            "RG3"
          ]
        }
    "resources": [
          {
            "type": "Microsoft.Resources/resourceGroups",
            "apiVersion": "2018-05-01",
            "location": "[parameters('rgLocation')]",
            "name": "[parameters('ResourceGroups')[copyIndex()])]",
            "copy": {
              "name": "resourcegroupcopy",
              "count": "[length(parameters('ResourceGroups'))]",
              "mode": "serial"
            },
"properties": {},
        "tags": {}
我们还希望为这些资源组上的Azure标记编写脚本。然而,问题是,并非我们创建的所有资源组都需要相同的标记。它们因资源组而异

例如:RG1需要Tag1,RG2需要Tag2,等等

我该如何将其放入脚本中

谁能给我指出正确的方向吗


谢谢

答案是:这取决于您的具体需求,但通常有两种方法:if()函数、对象映射。这两个函数中的任何一个都可以与union()函数组合使用。为所需的每个标记创建一个变量:

"tag1": {
    "something": "bla-bla"
},
"tag2": {
    "somethingElse": "bla-bla-bla"
}
然后,您可以在资源代码中执行以下操作:

"tags": "[if(condition(something goes here, depending on your needs), variable('tag1'), variables('tag2'))]"
可以将更多if语句一个接一个地组合在一起,还可以使用union()函数合并标记(尽管不实用)。联合(变量('tag1')、变量('tag2'))

另一种(比例尺上更易于管理的方式)是使用映射器“计算”标记属性。您希望rg1上有tag1,rg2上有tag2,rg3上有tag3。简而言之:您正在检索一个变量,该变量的名称等于属性的值,而属性的值又等于对象的名称。令人困惑这里有一个例子。创建一个新变量:

"mapper": {
    "rg1": "tag1",
    "rg2": "tag2",
    "rg3": "tag3",
}
然后,在您的资源中,您可以执行以下操作:

"tags": "[variables(variables('mapper')[variables(parameters('ResourceGroups')[copyIndex()]))])]"
          ^         ^                  ^          ^ name of the property would be RG1\RG2\RG3 depending on where you are in the loop. this would return value of the property, so tag1 or tag2 or tag3
          ^         ^                  ^ access properties of the object you get from the previous function (variables('mapper'))
          ^         ^ get variable called 'mapper'. you will get an object
          ^ get variable value called tag1 or tag2 or tag3

答案是:这取决于您的具体需求,但通常有两种方法:if()函数、对象映射。这两个函数中的任何一个都可以与union()函数组合使用。为所需的每个标记创建一个变量:

"tag1": {
    "something": "bla-bla"
},
"tag2": {
    "somethingElse": "bla-bla-bla"
}
然后,您可以在资源代码中执行以下操作:

"tags": "[if(condition(something goes here, depending on your needs), variable('tag1'), variables('tag2'))]"
可以将更多if语句一个接一个地组合在一起,还可以使用union()函数合并标记(尽管不实用)。联合(变量('tag1')、变量('tag2'))

另一种(比例尺上更易于管理的方式)是使用映射器“计算”标记属性。您希望rg1上有tag1,rg2上有tag2,rg3上有tag3。简而言之:您正在检索一个变量,该变量的名称等于属性的值,而属性的值又等于对象的名称。令人困惑这里有一个例子。创建一个新变量:

"mapper": {
    "rg1": "tag1",
    "rg2": "tag2",
    "rg3": "tag3",
}
然后,在您的资源中,您可以执行以下操作:

"tags": "[variables(variables('mapper')[variables(parameters('ResourceGroups')[copyIndex()]))])]"
          ^         ^                  ^          ^ name of the property would be RG1\RG2\RG3 depending on where you are in the loop. this would return value of the property, so tag1 or tag2 or tag3
          ^         ^                  ^ access properties of the object you get from the previous function (variables('mapper'))
          ^         ^ get variable called 'mapper'. you will get an object
          ^ get variable value called tag1 or tag2 or tag3

这就是变量的用途。这就是变量的用途。太棒了,非常感谢!还有两个问题。如果所有资源组都需要相同的标记,但值不同怎么办?这方面有什么最佳实践吗?对于映射器,若rg1同时需要tag1和tag2呢?那个么,您必须从某个地方提取值。由于arm模板并不真正提供集中式存储之类的功能,因此您需要在运行模板并将值作为参数传递之前这样做,或者需要实施一些创建arm模板的策略;)太棒了,非常感谢你!还有两个问题。如果所有资源组都需要相同的标记,但值不同怎么办?这方面有什么最佳实践吗?对于映射器,若rg1同时需要tag1和tag2呢?那个么,您必须从某个地方提取值。由于arm模板并不真正提供集中式存储之类的功能,因此您需要在运行模板并将值作为参数传递之前这样做,或者需要实施一些创建arm模板的策略;)