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"
}
]
我正在制作一些 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"
}
]