你的表达有几个问题:
- 在 jmespath 中,标识符用双引号引起来。单引号用于字符串。请参阅jmespath 规范。
- 您传递给的整个 jmespath 表达式
json_query
应该是一个 yaml/jinja2 字符串。如您所写,.link
将被解释为 jinja2/yaml var 标识符。
- 不得覆盖 jinja2 模板标记 (
{{ X }}
)。此外,在您当前的表达式中,'{{ target }}'
字面上解释为一个字符串,而不是扩展为它的值的变量。
以下剧本演示了一种修复当前剧本并满足您的要求的方法:
---
- hosts: localhost
gather_facts: false
vars:
input:
json: {
"a goo": {
"link": "google.com"
},
"b ms": {
"link": "microsoft.com"
},
"c amz": {
"link": "amazon.com"
}
}
tasks:
- name: Debug the var we want to show
vars:
target: "c amz"
debug:
msg: "{{ input.json | json_query('\"' + target + '\".link') }}"
这使:
$ ansible-playbook play.yml
PLAY [localhost] ***************************************************************************************************************************************************************
TASK [Debug the var we want to show] *******************************************************************************************************************************************
ok: [localhost] => {
"msg": "amazon.com"
}
PLAY RECAP *********************************************************************************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0