从 json 数组中检索值,其中属性等于变量与 Ansible



我正在尝试使用 Ansible 获取 json 数组中的属性值。示例数据:

"domains.json.data": [
{
"axfr_ips": [],
"description": "",
"domain": "mydomain.net",
"expire_sec": 0,
"group": "",
"id": 687088,
},
{
"axfr_ips": [],
"description": "",
"domain": "myotherdomain.net",
"expire_sec": 0,
"group": "",
"id": 687089,
}
]
}

所以我尝试使用 json 查询:

"{{ domains.json.data | json_query("data[?domain=='{{ server_domain }}'].id") }}"

或与:

- set_fact:
domain_id: "{{ domains | json_query(query) | first }}"
vars:
query: "domains.json[?name=='{{ server_domain }}'].id"

也尝试使用selectattrib:

"{{ linode_domains.json.data | selectattr("domain", "{{ server_domain }}") | list }}"

所以我需要的是获取我在 {{ server_domain }} 中获得的域的 ID。

查询无法正常工作,因为字典中没有属性name

query: "domains.json[?name=='{{ server_domain }}'].id"

使用属性domain。例如下面的任务

- debug:
msg: "{{ domains.json.data|json_query(query) }}"
vars:
server_domain: 'mydomain.net'
query: "[?domain=='{{ server_domain }}'].id"

"msg": [
687088
]

笔记

  • json_query返回一个列表。
  • 首先使用筛选器获取列表的第一个元素
msg: "{{ domains.json.data|json_query(query)|first }}"

您可以使用selectattr进行筛选,并使用map获取 id 值。以下是您可以尝试的示例。

- name: Retrieve value from JSON array
debug:
msg: "{{ test.domains | selectattr('domain', 'equalto', server_domain) | map(attribute='id') | join(',') }}"

作为map返回列表,我使用join转换为字符串。

我已将server_domain值设置为 myotherdomain.net进行测试。

下面是命令的输出

TASK [Retrieve value from JSON array] **************************
ok: [localhost] => {
"msg": "687089"
}

编辑: Equalto 是在 Jinja2 的 v2.8 中引入的。如果收到模板运行时错误:没有名为"equalto"的测试,请更新 jinja2。

要检查版本,请使用pip list | grep Jinja2。 要更新,请使用以下命令pip install --upgrade Jinja2

最新更新