JSON_QUERY滤波器中的Jmespatherror:未知功能:Regex_Search()

发布于 2025-02-11 19:33:44 字数 1519 浏览 3 评论 0原文

这是我的剧本:

- 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:
     - set_fact: 
            var1: "{{result|json_query(jquery)}}"
       vars:
            jquery: "[].{vlan_view: _ref|regex_search('(?<=:)[^/]*'), vlan_id: id, vlan_name: name}"
     - debug: msg={{var1}}

哪些错误的错误:

致命:[Localhost]:失败! =&gt; {“ msg”:“ json_query filter插件中的jmespatherror:\ nunknown函数:regex_search()”}

我所需的输出

[
    {
        "vlan_view": LAB1,
        "vlan_id": 11,
        "vlan_name": "test1"
    },
    {
        "vlan_id": 11,
        "vlan_name": "test1",
        "vlan_view": "LAB2"
    }
]

Here is my 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:
     - set_fact: 
            var1: "{{result|json_query(jquery)}}"
       vars:
            jquery: "[].{vlan_view: _ref|regex_search('(?<=:)[^/]*'), vlan_id: id, vlan_name: name}"
     - debug: msg={{var1}}

Which errors with:

fatal: [localhost]: FAILED! => {"msg": "JMESPathError in json_query filter plugin:\nUnknown function: regex_search()"}

My desired output

[
    {
        "vlan_view": LAB1,
        "vlan_id": 11,
        "vlan_name": "test1"
    },
    {
        "vlan_id": 11,
        "vlan_name": "test1",
        "vlan_view": "LAB2"
    }
]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

情域 2025-02-18 19:33:44

您不能在jmespath中进行正则操作,按照他们的跟踪器上的这个问题,

而且您肯定不能将Jinja过滤器用作JMespath函数,因为错误正在指出。

因此,您将不得不仅用Jinja过滤器和Ansible Ansible来实现这一目标。
而且,有了一个循环,绝对可以创建与您所需输出相对应的列表:

- set_fact:
    var1: "{{ var1 | default([]) + [_vlan] }}"
  loop: "{{ result }}"
  loop_control:
    label: "{{ item.id }}"
  vars:
    _vlan:
      vlan_id: "{{ item.name }}"
      vlan_name: "{{ item.id }}"
      vlan_view: >-
        {{ 
          item.parent._ref 
          | regex_search(':(.*?)\/', '\1') 
          | first 
        }}

给定两个任务:

- set_fact:
    var1: "{{ var1 | default([]) + [_vlan] }}"
  loop: "{{ result }}"
  loop_control:
    label: "{{ item.id }}"
  vars:
    _vlan:
      vlan_id: "{{ item.name }}"
      vlan_name: "{{ item.id }}"
      vlan_view: >-
        {{ 
          item.parent._ref 
          | regex_search(':(.*?)\/', '\1') 
          | first 
        }}

- debug:
    var: var1

这将产生:

TASK [set_fact] ***************************************************************
ok: [localhost] => (item=11)
ok: [localhost] => (item=11)

TASK [debug] ******************************************************************
ok: [localhost] => 
  var1:
  - vlan_id: test1
    vlan_name: '11'
    vlan_view: LAB1
  - vlan_id: test1
    vlan_name: '11'
    vlan_view: LAB2

You cannot do regex operation in JMESPath, as per this issue on their tracker.

And you surely cannot use a Jinja filter as a JMESPath function, as the error is pointing out.

So, you will have to achieve this with Jinja filters and Ansible alone.
And with a loop, it is definitely possible to create a list corresponding to your desired output:

- set_fact:
    var1: "{{ var1 | default([]) + [_vlan] }}"
  loop: "{{ result }}"
  loop_control:
    label: "{{ item.id }}"
  vars:
    _vlan:
      vlan_id: "{{ item.name }}"
      vlan_name: "{{ item.id }}"
      vlan_view: >-
        {{ 
          item.parent._ref 
          | regex_search(':(.*?)\/', '\1') 
          | first 
        }}

Given the two tasks:

- set_fact:
    var1: "{{ var1 | default([]) + [_vlan] }}"
  loop: "{{ result }}"
  loop_control:
    label: "{{ item.id }}"
  vars:
    _vlan:
      vlan_id: "{{ item.name }}"
      vlan_name: "{{ item.id }}"
      vlan_view: >-
        {{ 
          item.parent._ref 
          | regex_search(':(.*?)\/', '\1') 
          | first 
        }}

- debug:
    var: var1

This will yield:

TASK [set_fact] ***************************************************************
ok: [localhost] => (item=11)
ok: [localhost] => (item=11)

TASK [debug] ******************************************************************
ok: [localhost] => 
  var1:
  - vlan_id: test1
    vlan_name: '11'
    vlan_view: LAB1
  - vlan_id: test1
    vlan_name: '11'
    vlan_view: LAB2
痴梦一场 2025-02-18 19:33:44

获取属性 vlan_view

vlan_view: "{{ result|map(attribute='_ref')|
                      map('split', ':')|map('last')|
                      map('split', '/')|map('first')|
                      map('community.general.dict_kv', 'vlan_view')|
                      list }}"

给出

vlan_view:
  - vlan_view: LAB1
  - vlan_view: LAB2

然后使用 json_query 获取其他属性并组合词典

var1: "{{ result|json_query('[].{vlan_id: id, vlan_name: name}')|
                 zip(vlan_view)|map('combine')|list }}"

预期结果示例(简化用于测试)

var1:
  - vlan_id: 11
    vlan_name: test1
    vlan_view: LAB1
  - vlan_id: 11
    vlan_name: test1
    vlan_view: LAB2

给出了完整剧本的

- hosts: localhost
  
  vars:

    result:
      - _ref: vlan/ZG5z...4xMQ:LAB1/test1/11
        id: 11
        name: test1
        parent:
          _ref: vlanview/ZG5zL...wOTQ:LAB1/1/4094
      - _ref: vlan/ZG5zL...uMTE:LAB2/test1/11
        id: 11
        name: test1
        parent:
          _ref: vlanview/ZG5zL...MDk0:LAB2/1/4094

    vlan_view: "{{ result|map(attribute='_ref')|
                          map('split', ':')|map('last')|
                          map('split', '/')|map('first')|
                          map('community.general.dict_kv', 'vlan_view')|
                          list }}"

    var1: "{{ result|json_query('[].{vlan_id: id, vlan_name: name}')|
                     zip(vlan_view)|map('combine')|list }}"

  tasks:
    - debug:
        var: vlan_view
    - debug:
        var: var1

Get the attributes vlan_view

vlan_view: "{{ result|map(attribute='_ref')|
                      map('split', ':')|map('last')|
                      map('split', '/')|map('first')|
                      map('community.general.dict_kv', 'vlan_view')|
                      list }}"

gives

vlan_view:
  - vlan_view: LAB1
  - vlan_view: LAB2

Then use json_query to get the other attributes and combine the dictionaries

var1: "{{ result|json_query('[].{vlan_id: id, vlan_name: name}')|
                 zip(vlan_view)|map('combine')|list }}"

gives the expected result

var1:
  - vlan_id: 11
    vlan_name: test1
    vlan_view: LAB1
  - vlan_id: 11
    vlan_name: test1
    vlan_view: LAB2

Example of a complete playbook (simplified for testing)

- hosts: localhost
  
  vars:

    result:
      - _ref: vlan/ZG5z...4xMQ:LAB1/test1/11
        id: 11
        name: test1
        parent:
          _ref: vlanview/ZG5zL...wOTQ:LAB1/1/4094
      - _ref: vlan/ZG5zL...uMTE:LAB2/test1/11
        id: 11
        name: test1
        parent:
          _ref: vlanview/ZG5zL...MDk0:LAB2/1/4094

    vlan_view: "{{ result|map(attribute='_ref')|
                          map('split', ':')|map('last')|
                          map('split', '/')|map('first')|
                          map('community.general.dict_kv', 'vlan_view')|
                          list }}"

    var1: "{{ result|json_query('[].{vlan_id: id, vlan_name: name}')|
                     zip(vlan_view)|map('combine')|list }}"

  tasks:
    - debug:
        var: vlan_view
    - debug:
        var: var1

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文