如何将数组转换为ARM模板中一个对象的属性?
How to convert an array into properties of one object in an ARM template?
我正在寻找一种将数组(例如字符串数组)转换为一个对象的方法,其中的属性是从数组值生成的。
用例:我想根据资源名称列表生成一个带有资源链接的 tags
对象。我需要这样做,.
可以使用参数提供资源列表:
"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
再次合并这些对象,但该功能需要您对要合并的对象进行硬编码,因此 当您有一个输入可变长度.
我正在寻找一种以动态方式执行此操作的方法。
我不确定这是否是解决此问题的最佳方法。
标签应该是关于特定 object/service 的元数据。 Wouldn't it make more sense to apply a tag (say your system name, environment, etc..) and then run a query against azure on that tag?
这应该会达到撤回所有相关资源的相同结果。
没有将数组转换为对象的直接选项。
但这里有一个 hack 来实现你所需要的。这适用于任何长度的数组。
步骤:
- 将隐藏的-link 文本附加到服务名称
- 将数组转换为字符串
- 替换必要的符号并使其成为有效的 json 字符串。
- 使用 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'))]"
}
}
}
我不知道它是否仍然相关,但是从 2021 年开始可以使用 items()
function
我正在寻找一种将数组(例如字符串数组)转换为一个对象的方法,其中的属性是从数组值生成的。
用例:我想根据资源名称列表生成一个带有资源链接的 tags
对象。我需要这样做,
可以使用参数提供资源列表:
"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
再次合并这些对象,但该功能需要您对要合并的对象进行硬编码,因此 当您有一个输入可变长度.
我正在寻找一种以动态方式执行此操作的方法。
我不确定这是否是解决此问题的最佳方法。
标签应该是关于特定 object/service 的元数据。 Wouldn't it make more sense to apply a tag (say your system name, environment, etc..) and then run a query against azure on that tag?
这应该会达到撤回所有相关资源的相同结果。
没有将数组转换为对象的直接选项。 但这里有一个 hack 来实现你所需要的。这适用于任何长度的数组。
步骤:
- 将隐藏的-link 文本附加到服务名称
- 将数组转换为字符串
- 替换必要的符号并使其成为有效的 json 字符串。
- 使用 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'))]"
}
}
}
我不知道它是否仍然相关,但是从 2021 年开始可以使用 items()
function