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

Ansible中字典部分匹配场景下搜索替换功能异常排查

解决方案

错误原因分析

  1. contains参数顺序颠倒:JMESPath 中 contains(大字符串, 子串) 是判断前者是否包含后者作为子串。你原代码中写的contains(value, '{{ item.os_full }}')是尝试用短前缀列表匹配超长的完整OS字符串,逻辑完全倒置,因此返回空结果。
  2. starts_with报错是因为你直接对数组类型的value(OS字典每个键对应的前缀列表)调用了仅支持字符串入参的starts_with函数,没有遍历数组内的每个前缀字符串做判断。

修正后代码

前缀匹配(完整OS串以前缀开头即命中)

完全符合你要求的「匹配目标字符串前几个字符触发匹配」的需求:

- debug:
    msg: "{{ OS_short }}"
  loop: "{{ store_os }}"
  vars:
    _dict: "{{ OS|dict2items }}"
    query: "[?value[?starts_with($os_full, @)]].key"
    OS_short: "{{ _dict|json_query(query, os_full=item.inventory.os_full) | join('\n') }}"
  when: item.inventory.os_full is defined

子串匹配(前缀出现在完整OS串任意位置即命中)

如果不需要严格匹配开头,只要前缀出现在完整字符串中就算命中,替换query即可:

query: "[?value[?contains($os_full, @)]].key"

逻辑说明

  • 用dict2items将OS字典转换为键值对列表,每个元素的key是OS短名(ios/nxos),value是对应的匹配前缀列表
  • JMESPath内部遍历每个前缀列表的元素,判断传入的完整OS字符串是否满足匹配条件
  • 只要任意一个前缀匹配成功,就返回对应的OS短名

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 11:36:01