我想通过 Ansible 构建我们的 DNS 区域。用户应该只为前向查找区域维护一个变量(例如 foo.bar)。反向查找区域 (0.0.10.in-appr.arpa) 应该使用 Ansible 自动生成。
前向查找区域变量应如下所示
dns_zone_config:
- name: "internal.foo.bar"
acl:
- 10.180.0.0/24
- 10.180.8.0/24
hosts:
- name: "fileshare"
ip: 10.180.0.200
- name: "infra.foo.bar"
acl:
- acl-intern
hosts:
- name: "testhost1"
ip: 11.180.0.100
no_ptr_record: true
- name: "testhost2"
ipv6: fe80::1
- name: "testhost3"
ip: 11.180.0.200
- name: "mx.foo.bar"
mx:
- name: "xxxx"
priority: xxxx
target: xxxx
dns_zone_config 是一个字典列表,其中可能包含一个名为“hosts”的键,它又是一个字典列表。
我目前的方式如下:
- name: Collect all networks
include_tasks: 01-networks.yml
loop: "{{ dns_zone_config }}"
when: item_dns_zone_config.hosts is defined
loop_control:
loop_var: item_dns_zone_config
#from 01-networks.yml
- name: Determine IPv4 networks
set_fact:
ipv4_networks: "{{ (ipv4_networks | default([])) + [ item.ip ] }}"
loop: "{{ item_dns_zone_config.hosts }}"
when: item.ip is defined and (item.no_ptr_record is not defined or not item.no_ptr_record)
我对 dns_zone_config 及其主机条目进行了双重循环。这是非常低效和缓慢的。我很确定这可以更聪明地解决:D
基本上我只需要所有区域的所有 IP 列表。我尝试了 json_query() 和 selectattr() 过滤器,但我正在为并非每个主机条目都定义了 IPv4 或 IPv6 地址这一事实而苦苦挣扎。如果定义了 no_ptr_record: true 变量(假或未定义都可以),我不想包含 IP。
从列表上方的片段中,该列表将仅包含:ipv4_networks:
['10.180.0.200','11.180.0.200']
弄清楚如何正确使用 json_query。
结果是:
双循环只需要 1-2 秒,而不是 ~30 秒 :)