Ansible中字典部分匹配场景下搜索替换功能异常排查
解决方案
错误原因分析
contains参数顺序颠倒:JMESPath 中contains(大字符串, 子串)是判断前者是否包含后者作为子串。你原代码中写的contains(value, '{{ item.os_full }}')是尝试用短前缀列表匹配超长的完整OS字符串,逻辑完全倒置,因此返回空结果。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
相关产品推荐
相关产品推荐

