我需要使用set_fact从下方的JSON输出中获取ipv4Address值。最后出现一些错误。你能给我推荐一些最好的方法吗?
JSON输出:
"result_dns": {
"ansible_facts": {
"azure_dnsrecordset": [
{
"etag": "440922d5-b234-488a-8cbc-97b77f0fef8f",
"id": "2",
"name": "test2",
"properties": {
"ARecords": [
{
"ipv4Address": "10.30.23.5"
}
],
"TTL": 3600,
"fqdn": "test2.testzone.com."
},
"type": "Microsoft.Network/dnszones/A"
我正在使用以下set_fact来检索ipv4Address。
- name: name
set_fact:
host_name: "{{ result_dns.ansible_facts.azure_dnsrecordset map(attribute='ipv4Address') | list }}"
我无法通过上述方法过滤值。您能建议我一些最佳方法来筛选值吗?
答案 0 :(得分:0)
我想您会被'azure_dnsrecordset'包含字典列表这一事实所困扰。只有一个,但是我猜想是在其他情况下可能会有多个。这将满足您的要求,但是一旦您拥有多个记录,您可能会发现自己的要求比这个问题更详细:
# Presumes that you have a 'result_dns' variable set in Ansible containing the JSON
- set_fact:
ip_s: "{{ ( ip_s | default([]) ) + [ item.1.ipv4Address ] }}"
with_subelements:
- "{{ result_dns.ansible_facts.azure_dnsrecordset }}"
- properties.ARecords
- debug:
msg: "{{ ip_s }}"
with_subelements,从词典列表中提取键。
这只会生成IP地址列表,如果您返回了多个记录集,这可能没有用。如果您执行以下操作:
ip_s: "{{ ( ip_s | default([]) ) + [ { 'etag': item.0.etag, 'ip_address': item.1.ipv4Address } ] }}"
这将为您提供包含“ etag”和“ ip_address”键的词典列表,使您可以识别它们来自的记录集。
希望能帮助您入门。