使用 json_query 从 ansible 中的 jinja2 变量中提取数据
extract data with json_query from jinja2 variable in ansible
我在清单中有一个包含 JSON 格式数据的变量。
我想用json_query
提取数据的特定部分。
该变量包含具有相关 IP 地址的域列表(JSON 有效):
DOMAIN={"domain1.net": {"addr": ["10.10.10.10", "10.10.10.20"]}, "domain2.net": {"addr": ["172.16.10.1", "172.16.20.1", "172.16.30.1"]}}
使用 ansible-playbook,使用 json_query
,我只想提取 domain2.net
个 IP 地址。
我已经使用 https://api.gopipeline.io/jmespath-tester 来验证 JMESPath 查询。
使用此过滤器:"domain2.net".addr
在 jmespath-tester 中,我得到以下(预期)输出:
[
"172.16.10.1",
"172.16.20.1",
"172.16.30.1"
]
当我对这个 ansible-playbook 应用相同的 json_query 时,我没有输出:
任务
---
- name: Extract addr for domain2.net
tags: test
debug: msg="{{ DOMAIN | to_json | from_json | json_query("domain2.net".addr) }}"
输出:
ok: [domain-lab-1] => {
"msg": ""
}
我还测试了另一个查询,通过在 JMESPath 在线测试器中仅过滤 domain2.net
:
https://api.gopipeline.io/jmespath-tester 我得到这个 预期输出 :
{
"addr": [
"172.16.10.1",
"172.16.20.1",
"172.16.30.1"
]
}
但是,当我尝试在 Ansible 剧本中执行相同操作时,仍然没有输出:
任务
---
- name: Extract addr for domain2.net
tags: test
debug: msg="{{ DOMAIN | to_json | from_json | json_query("domain2.net") }}"
输出:
ok: [domain-lab-1] => {
"msg": ""
}
如果我尝试只打印 DOMAIN
var,我可以看到整个 JSON 输出。
所以,变量被正确读取了。
我正在使用 ansible 2.9.14。
我从这里读到to json|from json
:
我不确定我的情况是否需要,无论如何添加或删除它们没有任何区别。
您不需要 json_query。只需引用该属性。您不能使用点表示法,因为属性 domain2.net 不是 Ansible 中变量的有效名称。而是将其放入括号中。例如
- name: Extract addr for domain2.net
debug:
msg: "{{ DOMAIN['domain2.net'].addr }}"
给予
msg:
- 172.16.10.1
- 172.16.20.1
- 172.16.30.1
备注
-
任何字符串都是 YAML dictionary(mapping) 中的有效键。
Ansible variable name 只能包含字母、数字和下划线。
我在清单中有一个包含 JSON 格式数据的变量。
我想用json_query
提取数据的特定部分。
该变量包含具有相关 IP 地址的域列表(JSON 有效):
DOMAIN={"domain1.net": {"addr": ["10.10.10.10", "10.10.10.20"]}, "domain2.net": {"addr": ["172.16.10.1", "172.16.20.1", "172.16.30.1"]}}
使用 ansible-playbook,使用 json_query
,我只想提取 domain2.net
个 IP 地址。
我已经使用 https://api.gopipeline.io/jmespath-tester 来验证 JMESPath 查询。
使用此过滤器:"domain2.net".addr
在 jmespath-tester 中,我得到以下(预期)输出:
[
"172.16.10.1",
"172.16.20.1",
"172.16.30.1"
]
当我对这个 ansible-playbook 应用相同的 json_query 时,我没有输出:
任务
---
- name: Extract addr for domain2.net
tags: test
debug: msg="{{ DOMAIN | to_json | from_json | json_query("domain2.net".addr) }}"
输出:
ok: [domain-lab-1] => {
"msg": ""
}
我还测试了另一个查询,通过在 JMESPath 在线测试器中仅过滤 domain2.net
:
https://api.gopipeline.io/jmespath-tester 我得到这个 预期输出 :
{
"addr": [
"172.16.10.1",
"172.16.20.1",
"172.16.30.1"
]
}
但是,当我尝试在 Ansible 剧本中执行相同操作时,仍然没有输出: 任务
---
- name: Extract addr for domain2.net
tags: test
debug: msg="{{ DOMAIN | to_json | from_json | json_query("domain2.net") }}"
输出:
ok: [domain-lab-1] => {
"msg": ""
}
如果我尝试只打印 DOMAIN
var,我可以看到整个 JSON 输出。
所以,变量被正确读取了。
我正在使用 ansible 2.9.14。
我从这里读到to json|from json
:
我不确定我的情况是否需要,无论如何添加或删除它们没有任何区别。
您不需要 json_query。只需引用该属性。您不能使用点表示法,因为属性 domain2.net 不是 Ansible 中变量的有效名称。而是将其放入括号中。例如
- name: Extract addr for domain2.net
debug:
msg: "{{ DOMAIN['domain2.net'].addr }}"
给予
msg:
- 172.16.10.1
- 172.16.20.1
- 172.16.30.1
备注
任何字符串都是 YAML dictionary(mapping) 中的有效键。
Ansible variable name 只能包含字母、数字和下划线。