azure - 如何将数组转换为ARM模板中一个对象的属性?

标签 azure azure-resource-manager azure-rm-template

我正在寻找一种将数组(例如字符串)转换为一个对象的方法,其中属性是从数组值生成的。

用例:我想根据资源名称列表生成一个包含资源链接的 tags 对象。我需要这样做,到 link App Service resources to an Application Insights resource .

可以使用参数提供资源列表:

"parameters": {
  "appServices": {
    "type": "array",
    "metadata": {
      "description": "Names of app services to link this application insights resource to via hidden tags"
    }
  }
}

示例输入:

['appName1', 'appName2', 'appName3']

示例输出:

"tags":
{
  "[concat('hidden-link:', resourceId('Microsoft.Web/sites/', 'appName1'))]": "Resource",
  "[concat('hidden-link:', resourceId('Microsoft.Web/sites/', 'appName2'))]": "Resource",
  "[concat('hidden-link:', resourceId('Microsoft.Web/sites/', 'appName3'))]": "Resource"
}

我知道你可以使用copy循环遍历数组,但这将创建一个对象数组并且不是单个对象(这是标签所必需的),例如:

[
{
  "[concat('hidden-link:', resourceId('Microsoft.Web/sites/', 'appName1'))]": "Resource"
},
{
  "[concat('hidden-link:', resourceId('Microsoft.Web/sites/', 'appName2'))]": "Resource"
},
{
  "[concat('hidden-link:', resourceId('Microsoft.Web/sites/', 'appName3'))]": "Resource"
}
]

可以使用 union再次合并这些对象,但该函数要求您对要合并的对象进行硬编码,因此它当您有可变长度的输入时不起作用

我正在寻找一种以动态方式做到这一点的方法。

最佳答案

没有直接选项将数组转换为对象。 但这里有一个技巧可以实现你所需要的。这适用于任何长度的数组。

步骤:

  1. 将隐藏链接文本附加到服务名称
  2. 将数组转换为字符串
  3. 替换必要的符号并使其成为有效的 json 字符串。
  4. 使用 json() 将字符串转换为对象
{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "appServices": {
      "type": "array",
      "metadata": {
        "description": "Names of app services to link this application insights resource to via hidden tags"
      },
      "defaultValue": [ "appName1", "appName2", "appName3" ]
    }
  },
  "functions": [],
  "variables": {
    "copy": [
      {
        "name": "as",
        "count": "[length(parameters('appServices'))]",
        "input": "[concat('hidden-link:', resourceId('Microsoft.Web/sites/', parameters('appServices')[copyIndex('as')]))]"
      }
    ],
    "0": "[string(variables('as'))]",
    "1": "[replace(variables('0'), '[', '{')]",
    "2": "[replace(variables('1'), '\",', '\":\"Resource\",')]",
    "3": "[replace(variables('2'), '\"]', '\":\"Resource\"}')]"
  },
  "resources": [],
  "outputs": {
    "op1": {
      "type": "object",
      "value": "[json(variables('3'))]"
    }
  }
}

enter image description here

关于azure - 如何将数组转换为ARM模板中一个对象的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62714060/

相关文章:

arrays - 尝试为 Azure ARM 模板创建动态依赖于数组

azure - 尝试使用 Selenium Chrome 驱动程序在 Azure 中运行 VS 负载测试并收到错误

VS2015 中的 Azure 调试环境启动时崩溃

azure - 使用 ARM 策略限制用户访问资源组

azure - 从 Azure ARM 模板中检索订阅标签

azure - 为 IoT Edge 部署 Azure 流分析作业

azure - 如何配置每月只需启动并运行几天的应用服务

c# - Azure API(图形或 REST)中的 AAD 用户默认权限 (UserSettings) 位于何处?

.net - 如何将 Azure 联合与 WWF 持久性表 ( SqlWorkflowInstanceStore ) 结合使用?

azure - 如何在 Azure 资源管理器模板中为 Azure 函数配置应用服务托管证书?