如何在Ansible中通过json_query过滤排除指定后缀的Grafana告警
解决Grafana告警筛选问题:排除名称以指定字符串结尾的告警
问题分析
你当前的循环过滤逻辑存在核心问题:每次迭代都基于原始的alerts_output.json数据执行过滤,再将两次结果合并,最终得到的是排除one的告警列表 + 排除three的告警列表(包含重复项),而非同时排除两者的交集结果。
解决方案
方法1:一次性构造JSON Query表达式(推荐)
通过动态生成包含所有排除条件的JSON Query,单次过滤即可得到目标结果,效率更高。
步骤1:修正排除列表格式(如果变量是字符串类型)
首先将字符串形式的排除列表转换为实际的列表对象:
- set_fact: grafana_alerts_exclusion_list: "{{ grafana_alerts_exclusion_list | from_json }}"
步骤2:动态生成过滤查询并执行
- set_fact: # 为每个排除项生成对应的过滤条件,再用逻辑与连接 exclude_conditions: "{{ grafana_alerts_exclusion_list | map('regex_replace', '^(.*)$', '!ends_with(name, \\'\\1\\')') | join(' && ') }}" - set_fact: # 执行单次过滤得到最终结果 filtered_alerts: "{{ alerts_output.json | json_query('[?' ~ exclude_conditions ~ ']') }}"
方法2:循环递进过滤
每次迭代都基于上一次过滤后的结果继续筛选,逐步缩小范围:
# 初始化过滤结果为原始告警列表 - set_fact: filtered_alerts: "{{ alerts_output.json }}" # 循环排除每个指定后缀的告警 - set_fact: filtered_alerts: "{{ filtered_alerts | json_query('[?!ends_with(name, \\'' ~ item ~ '\\')]') }}" loop: "{{ grafana_alerts_exclusion_list | from_json }}"
验证结果
基于你提供的示例数据,两种方法最终都会得到以下过滤后的告警列表:
[ { "dashboardId": 238, "evalData": { "noData": true }, "evalDate": "0001-01-01T00:00:00Z", "executionError": "", "id": 93, "name": "Something two", "newStateDate": "2022-08-09T14:48:28Z", "panelId": 3, "state": "no_data" }, { "dashboardId": 238, "evalData": { "noData": true }, "evalDate": "0001-01-01T00:00:00Z", "executionError": "", "id": 96, "name": "Something four", "newStateDate": "2022-08-09T14:48:16Z", "panelId": 10, "state": "no_data" } ]
内容的提问来源于stack exchange,提问作者João Amaro
相关产品推荐
相关产品推荐

