json_query
需要 Python 对象(dict)作为输入,如果你用字符串提供它,它会给出空字符串作为结果。
由于 Ansible 模板引擎的棘手工作,您会得到不同的结果。
我绝对应该在我的网站上写一篇关于它的文章......
在评估 jijna2 表达式之后,Ansible 尝试将复杂类型转换为 Python 对象(例如 dict 或 list)。看我的other https://stackoverflow.com/a/41147661/2795592 answer.
在你的情况下:
1.
- set_fact:
from_lookup_with_from_json: "{{ lookup('file','test.json') | from_json }}"
from_lookup_with_from_json
是一个字典,因为您手动将 JSON 字符串从文件转换为字典from_json
filter.
2.
- set_fact:
from_lookup_without_from_json: "{{ lookup('file','test.json') }}"
from_lookup_with_from_json
变成 dict,因为当 jinja2 表达式以以下结尾时 Ansible 会转换它}}
. So from_json
实际上是不必要的the last链式过滤器。
3.
debug: msg="{{ lookup('file','test.json') | from_json | json_query(query) }}"
同样,您可以在此处手动转换 JSON 字符串。所以json_query
获取 dict 作为输入。
4.
debug: msg="{{ lookup('file','test.json') | json_query(query) }}"
在这种情况下,您将 JSON 字符串(而不是字典)作为输入提供给json_query
筛选。由于所有事情都发生在一个 jinja2 表达式内,因此 Ansible 不会尝试转换两者之间的任何内容。
您还可以通过以下方式使用变量获取空字符串结果:
- set_fact:
from_lookup_force_string: "{{ lookup('file','test.json') | string }}"
在这种情况下from_lookup_force_string
不会被 Ansible 临时引擎转换,并且json_query
会给你空的答复。