You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 20:54:31