Ansible経由でDNSゾーンを構築したいのですが。ユーザーは、前方参照ゾーンの変数を1つだけ維持する必要があります(例: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は、辞書のリストである「ホスト」と呼ばれるキーを含むことができる辞書のリストです。
私の現在の方法は次のようになります:
- 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とそのHostエントリを二重にループします。これは非常に非効率的で低速です。私はこれがより賢く解決できると確信しています:D
基本的には、すべてのゾーンのすべてのIPのリストが必要です。 json_query()およびselectattr()フィルターを試しましたが、すべてのHostエントリーにIPv4またはIPv6アドレスが定義されているわけではないという事実に苦労しています。また、no_ptr_record:true変数が定義されている場合(falseまたは定義されていない場合も可)、IPを含めたくありません。
上記のスニペットから、リストにはipv4_networksのみが含まれます。
['10.180.0.200','11.180.0.200']
Json_queryを適切に使用する方法を理解しました。
- debug:
msg: "{{ dns_zone_config | json_query(_query) }}"
vars:
_query: "[].hosts[?!no_ptr_record][].[ip,ipv6][]"
結果:
TASK [debug] ***********************************************************************************
ok: [localhost] => {
"msg": [
"10.180.0.200",
"fe80::1",
"11.180.0.200"
]
}
ダブルループでは〜30秒ではなく、1〜2秒で十分です:)