我怀疑不可能做我想找的事,但是值得一试!
我有一个用于配置Azure日志查询警报规则的管道。各个警报规则定义为ARM参数文件,我使用共享的ARM模板文件进行部署。
这是我的模板文件的精简版,其中大部分参数都省略了。
{
"$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"logQuery": {
"type": "string",
"minLength": 1,
"metadata": {
"description": "Query to execute against the AI resource"
}
}
},
"variables": {
"appInsightsResourceId": "[concat(resourceGroup().id,'/providers/','microsoft.insights/components/', parameters('appInsightsResourceName'))]",
"actionGroupId": "[concat(resourceGroup().id,'/providers/','microsoft.insights/actionGroups/', parameters('actionGroupName'))]",
"linkToAiResource" : "[concat('hidden-link:', variables('appInsightsResourceId'))]"
},
"resources":[{
"name":"[parameters('alertName')]",
"type":"Microsoft.Insights/scheduledQueryRules",
"location": "northeurope",
"apiVersion": "2018-04-16",
"tags": {
"[variables('linkToAiResource')]": "Resource"
},
"properties":{
"description": "[parameters('alertDescription')]",
"enabled": "[parameters('isEnabled')]",
"source": {
"query": "[parameters('logQuery')]",
"dataSourceId": "[variables('appInsightsResourceId')]",
"queryType":"[parameters('logQueryType')]"
},
"schedule":{
"frequencyInMinutes": "[parameters('alertSchedule').Frequency]",
"timeWindowInMinutes": "[parameters('alertSchedule').Time]"
},
"action":{
"odata.type": "Microsoft.WindowsAzure.Management.Monitoring.Alerts.Models.Microsoft.AppInsights.Nexus.DataContracts.Resources.ScheduledQueryRules.AlertingAction",
"severity": "[parameters('alertSeverity')]",
"aznsAction":{
"actionGroup":"[array(variables('actionGroupId'))]"
},
"trigger":{
"thresholdOperator":"[parameters('alertTrigger').Operator]",
"threshold":"[parameters('alertTrigger').Threshold]"
}
}
}
}
]
}
您可以看到我如何将App Insights查询作为参数提供,因此我的参数文件可能类似于:
{
"$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"logQuery": {
"value": "requests | where resultCode >= 500"
}
}
}
但是,当以不间断的JSON字符串查看时,这些查询可能会很长且很难理解。因此,我想将此参数参数化(如果您了解我的意思),以便分别定义和提供关键变量。我正在考虑将参数更改为类似的内容,引入一个新参数,该参数包含用于参数化查询的一系列占位符替换...
{
"$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"logQueryVariables": [
{ "{minCode}": "500" }
],
"logQuery": {
"value": "requests | where resultCode >= {minCode}"
}
}
}
...然后找到一种遍历变量数组并替换logQuery
参数中占位符的方法,我想也许可以使用ARM函数或其他方法。但是我害怕承认我坚持这一部分。是否可以使用copy
语法执行类似的操作?
答案 0 :(得分:0)
取决于最终结果应该是什么样子,您可以采用不同的方式来执行此操作,但是我建议您不要在模板中执行此操作,建议您在模板之外执行此操作并提供结果。如果您确实想实现您所描述的功能,则可以使用嵌套部署做到这一点**。我认为没有其他方法可以遍历数组以在ARM模板中构建字符串。
答案 1 :(得分:0)
这是我能找到的最接近的。我们在powershell中为secretObjects进行输入循环。
{
"type": "Microsoft.KeyVault/vaults/secrets",
“名称”:“ [concat(variables('KeyVaultName'),'/', variables('secretsObject')。secrets [copyIndex()]。secretName)]“,
"apiVersion": "2018-02-14",
"dependsOn": [
"[concat('Microsoft.KeyVault/vaults/', variables('KeyVaultName'))]"
],
"copy": {
"name": "secretsCopy",
"count": "[length(variables('secretsObject').secrets)]"
},
"properties": {
"value": "[variables('secretsObject').secrets[copyIndex()].secretValue]"
}
}