Ansible:如何使用 json_query 中的一些分隔符拆分 json 数据

Ansible : How to split json data with some seperator in json_query

我正在制作一些 ansible 剧本来输出 json 数据。

我通过 uri 模块获得了 json 数据。 我将数据保存为变量,甚至设法用 json_query.

提取所需的数组
---
- name: get lti id
  hosts: web
  become: yes

  tasks:
  - name : "get lti"
    
    ...

  - name : "print returned json"
    debug:
            var: data.json

  - name : "write var to file"
    copy:
            content: " {{ data.json | json_query('[*].{id:id, url:url}') | to_nice_json }}"
            dest: "/data/test.json"

我的结果 json 文件低于一个。


 [
    {
        "id": 7,
        "url": "https://template.com/test/lti/admin/policy/red"
    },
    {
        "id": 8,
        "url": "https://template.com/test/lti/admin/blue"
    },
    {
        "id": 10,
        "url": "https://template.com/test/lti/yellow"
    }
]


但我想在这里仅提取 url 的最后一部分。例如)红色,蓝色

所以我试着像这样改变我的剧本

---
- name: get lti id
  hosts: web
  become: yes

  tasks:

    ...

  - name : "print returned json"
    debug:
            var: data.json

  - name : "write var to file"
    copy:
            content: " {{ data.json | json_query('[*].{id:id, url:url}')| url.split('/')[-1] | to_nice_json }}"
            dest: "/data/test.json"

但这会导致致命错误

TASK [将 var 写入文件] *************************************** ****************************************************** ******************* 致命的:[lms-web-template]:失败! => {“msg”:“模板化字符串时出现模板错误:预期标记 'end of print statement',得到 '['。字符串:{{ data.json | json_query('[*].{id :id, url:url}') | url.split('/')[-1] | to_nice_json }}"}

我想得到如下结果。


 [
    {
        "id": 7,
        "url": "red"
    },
    {
        "id": 8,
        "url": "blue"
    },
    {
        "id": 10,
        "url": "yellow"
    }
]

我需要你的帮助...谢谢你:)

在独立任务中修改列表。例如

    - set_fact:
        content2: "{{ content2|default([]) + [item|combine({'url':url})] }}" 
      loop: "{{ content }}"
      vars:
        url: "{{ item.url.split('/')|last }}"
    - copy:
        content: "{{ content2|to_nice_json }}"
        dest: data.json

给予

shell> cat data.json 
[
    {
        "id": "7,",
        "url": "red"
    },
    {
        "id": "8,",
        "url": "blue"
    },
    {
        "id": "10,",
        "url": "yellow"
    }
]

下一个选项是修改Jinja中的数据。例如

    - copy:
        content: |
          {% for item in content %}
          - id: {{ item.id }}
            url: {{ item.url.split('/')|last }}
          {% endfor %}
        dest: data.yml
    - debug:
        msg: "{{ lookup('file', 'data.yml')|from_yaml|to_nice_json }}"

给予

    [
        {
            "id": "7,",
            "url": "red"
        },
        {
            "id": "8,",
            "url": "blue"
        },
        {
            "id": "10,",
            "url": "yellow"
        }
    ]