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

Ansible json_query使用lower过滤器后无法实现大小写不敏感搜索的问题求助

解决Ansible json_query大小写不敏感搜索的问题

你的问题出在直接对整个info_data使用lower过滤器上——这个操作会把整个JSON结构转换成一个纯字符串,而不是递归地把每个字段的字符串值转小写,导致json_query无法解析原本的层级结构,自然返回空结果。

要实现大小写不敏感的搜索,我们可以利用JMESPath内置的lower()字符串函数,在查询语句中同时处理目标字段和搜索词的大小写,不需要提前修改整个数据结构。

修正后的Playbook

只需要修改print data任务的query变量即可:

- hosts: test_host
  tasks:
    - name: get json
      set_fact:
        info_data: "{{ info_config }}"
      when: info_config is defined
    - name: print data (case-insensitive search)
      debug:
        msg: "{{ info_data | json_query(query) }}"
      vars:
        # 在JMESPath查询中,将source字段和搜索词都转为小写后匹配
        query: "*[].data_info[?contains(lower(source), lower('\\${APP1\\.type'))].destination|[]"

原理说明

  1. JMESPath的lower()函数会把字符串转换为全小写,我们用它处理source字段的值,同时也处理搜索词${APP1.type},这样不管原始数据里的source是大写(${APP1.type})还是小写(${app1.type}),都会和小写后的搜索词匹配。
  2. 这种方法不需要修改原始数据结构,直接在查询时完成大小写统一,效率更高,也更符合JMESPath的使用习惯。

验证结果

执行你提供的Playbook命令后,应该会返回预期的结果:

ok: [10.0.8.218] => msg: ['home_app']

额外说明

如果你的搜索词是通过变量传入的(比如app_search_term: "${APP1.type}"),可以把query写成动态形式:

query: "*[].data_info[?contains(lower(source), lower('{{ app_search_term }}'))].destination|[]"

内容的提问来源于stack exchange,提问作者user63898

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 05:32:34