使用 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.nethttps://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

备注