在我的ansible剧本中,我试图过滤json结果,但目前无法正常工作。
1 /剧本
在我的ansible剧本下面,用于查询和过滤结果:
tasks:
- name: "Query Attributes"
...
...
register: query_result
- name: Display Result
debug:
var: query_result
- name: Display Filtered Result
debug:
msg: "{{ query_result.current| json_query('[].context.attributes[?name==`prod`].name') }}"
也许是我的json_query过滤器内部存在问题?
任何想法 ?
2 /过滤后的Query_result输出
TASK [Display Result] ***************************************************
"query_result": {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"current": [
{
"context": {
"attributes": {
"name": "prod",
"uid": "11756"
}
}
},
{
....
}
}
},
{
"context": {
"attributes": {
"name": "dev",
"uid": "14424"
}
}
}
],
"failed": false
}
}
*****************************
3 /过滤的结果为空
不幸的是,我的结果是空的。
TASK [Display Filtered Result] **********************************************************
{
"msg": []
}
谢谢
答案 0 :(得分:0)
首先,单引号和双引号在jmespath expressions specification中很重要。您用于搜索的文字字符串需要用单引号引起来。
第二,您的过滤器将不匹配。您要么必须在流处理中将过滤器移到更高的级别,要么要通过管道传递表达式。
下面是一些说明上述建议并得出相同结果的示例
---
- name: Filter with jmespath
hosts: localhost
gather_facts: false
vars:
query_result: {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"current": [
{
"context": {
"attributes": {
"name": "prod",
"uid": "11756"
}
}
},
{
"context": {
"attributes": {
"name": "dev",
"uid": "14424"
}
}
}
],
"failed": false
}
tasks:
- name: Display original result
debug: var=query_result
- name: Display Filtered Result - One expression - one liner
debug:
msg: "{{ query_result.current | json_query(\"[?context.attributes.name=='prod'].context.attributes.name[]\") }}"
- name: Display Filtered Result - One expression - Query in block var
vars:
query: >-
[?context.attributes.name=='prod'].context.attributes.name[]
debug:
msg: "{{ query_result.current | json_query(query) }}"
- name: Display Filtered Result - Pipe expressions - Query in block var
vars:
query: >-
[].context.attributes[] | [?name=='prod'].name[]
debug:
msg: "{{ query_result.current | json_query(query) }}"
对于下一个问题,请阅读帮助部分,并考虑直接在您的问题中提供full MVCE(就像我在此答案中所做的那样)。