Ansible json_query调用regex_search报未知函数错误如何解决
报错根因
json_query过滤器基于JMESPath语法实现,原生不支持Ansible Jinja2环境的regex_search过滤器,直接在JMESPath查询表达式里调用就会抛出Unknown function: regex_search()错误。另外你原始playbook中第二个列表项的name字段值缺少闭合双引号,属于YAML语法错误,运行前需要先修正。
解决方案
不要在JMESPath表达式内混用Ansible自有过滤器,把字符串截取逻辑放在Jinja2层处理即可,这里用字符串分割的方式比正则更易读易维护:_ref字段固定为[前缀]:[目标vlan_view]/[其他路径]结构,先按冒号分割取最后一段,再按斜杠分割取第一段就能拿到需要的vlan_view值。
以下是可直接运行的修正版playbook,采用循环处理的写法可读性更高,方便后续调整逻辑:
- hosts: localhost vars: result: - _ref: "vlan/ZG5zLnZsYW4kLmNvbS5pbmZvYmxveC5kbnMudmxhbl92aWV3JElORlJBTEFCLjEuNDA5NC4xMQ:LAB1/test1/11" id: 11 name: "test1" parent: _ref: "vlanview/ZG5zLnZsYW5fdmlldyRJTkZSQUxBQi4xLjQwOTQ:LAB1/1/4094" - _ref: "vlan/ZG5zLnZsYW4kLmNvbS5pbmZvYmxveC5kbnMudmxhbl92aWV3JFNDTEFCLU9PQi4xLjQwOTQuMTE:LAB2/test1/11" id: 11 name: "test1" parent: _ref: "vlanview/ZG5zLnZsYW5fdmlldyRTQ0xBQi1PT0IuMS40MDk0:LAB2/1/4094" tasks: - name: 组装目标结构数据 set_fact: vlan_data: "{{ vlan_data | default([]) + [ { 'vlan_view': item._ref.split(':') | last | split('/') | first, 'vlan_id': item.id, 'vlan_name': item.name } ] }}" loop: "{{ result }}" - debug: var: vlan_data
运行后输出结果完全匹配预期结构:
[ { "vlan_view": "LAB1", "vlan_id": 11, "vlan_name": "test1" }, { "vlan_view": "LAB2", "vlan_id": 11, "vlan_name": "test1" } ]
如果习惯用正则匹配,把vlan_view的取值逻辑替换为item._ref | regex_search('(?<=:)[^/]*')即可,在Jinja2层调用Ansible过滤器不会触发JMESPath的函数识别错误。
内容的提问来源于stack exchange,提问作者netv
相关产品推荐
相关产品推荐

