NSD: first playbook, still rough around the edges (no TSIG support)
This commit is contained in:
commit
adc9f0b18e
32
README
Normal file
32
README
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
NSD role
|
||||||
|
|
||||||
|
It is assumed that all machines host the exact same zones in the same way
|
||||||
|
(i.e. for each zone, they are either all masters, or all slaves).
|
||||||
|
This greatly simplifies configuration, and there is generally no need
|
||||||
|
to have masters and slaves for the same zone handled by Ansible, since
|
||||||
|
Ansible can just push the zone to all machines (so, they can all be masters).
|
||||||
|
|
||||||
|
There are cases where having multiple masters whose zone is pushed by Ansible
|
||||||
|
is not desirable:
|
||||||
|
|
||||||
|
- dynamic DNS records (which isn't supported by NSD anyway)
|
||||||
|
- DNSSEC (you could always generate DNSSEC signatures in ansible, but it's awkward)
|
||||||
|
|
||||||
|
|
||||||
|
You can put key-value pairs in group_vars, under the key "nsd_common_config",
|
||||||
|
they will be used for the NSD configuration on all hosts.
|
||||||
|
A few common configuration entries are in the playbook itself, because they are
|
||||||
|
needed to properly create relevant directories.
|
||||||
|
|
||||||
|
Some machine-specific configuration is also possible, e.g. for the bind IP.
|
||||||
|
Put key-value pairs in host_vars, under the key "nsd_local_config".
|
||||||
|
|
||||||
|
If you want to pass multiple values for a key (e.g. ip-address), just use
|
||||||
|
a list as value, it will automatically be expanded.
|
||||||
|
|
||||||
|
|
||||||
|
The playbook is currently only tested with Debian wheezy.
|
||||||
|
|
||||||
|
When a master zone is updated, the slaves are notified. Obviously, the slaves
|
||||||
|
need to be configured to accept notification from at least one master and pull
|
||||||
|
zones accordingly.
|
7
handlers/main.yml
Normal file
7
handlers/main.yml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
- name: restart nsd3
|
||||||
|
service: name=nsd3 state=restarted
|
||||||
|
|
||||||
|
- name: rebuild nsd3 database
|
||||||
|
command: /usr/sbin/nsdc rebuild
|
65
tasks/main.yml
Normal file
65
tasks/main.yml
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
- name: Install nsd3
|
||||||
|
apt: pkg=nsd3 state=present
|
||||||
|
|
||||||
|
- name: Configure nsd3
|
||||||
|
template: src=config.j2 dest={{ nsd_config_dir }}/nsd.conf owner=root group=root mode=0644
|
||||||
|
notify:
|
||||||
|
- restart nsd3
|
||||||
|
|
||||||
|
|
||||||
|
- name: Create zone configuration directory
|
||||||
|
file: path={{ zones_config_dir }} state=directory owner=root group=root mode=0755
|
||||||
|
|
||||||
|
- name: Create primary zone directory
|
||||||
|
file: path={{ primary_zones_dir }} state=directory owner=root group=root mode=0755
|
||||||
|
|
||||||
|
- name: Create secondary zone directory
|
||||||
|
file: path={{ secondary_zones_dir }} state=directory owner=nsd group=nsd mode=0755
|
||||||
|
|
||||||
|
|
||||||
|
# Unfortunately, nsd doesn't allow to say "include all files in this directory".
|
||||||
|
# The following implements the inclusion logic: the main config file includes
|
||||||
|
# a secondary file, in which we add include statements for each zone.
|
||||||
|
- name: Wipe include file
|
||||||
|
copy: dest={{ zones_include_file }} content="# Generated automatically by Ansible, do not edit by hand.\n"
|
||||||
|
|
||||||
|
- name: Configure primary nsd3 zones
|
||||||
|
template: src=primary_zone_config.j2 dest="{{ zones_config_dir }}/{{ item.zone_name }}.primary.conf" owner=root group=root mode=0644
|
||||||
|
notify:
|
||||||
|
- restart nsd3
|
||||||
|
with_items: "{{ nsd_primary_zones }}"
|
||||||
|
|
||||||
|
- name: Add include lines for primary zones to the include file
|
||||||
|
lineinfile:
|
||||||
|
state: present
|
||||||
|
dest: "{{ zones_include_file }}"
|
||||||
|
regexp: "^include: {{ zones_config_dir }}/{{ item.zone_name }}.primary.conf"
|
||||||
|
line: "include: {{ zones_config_dir }}/{{ item.zone_name }}.primary.conf"
|
||||||
|
with_items: "{{ nsd_primary_zones }}"
|
||||||
|
notify:
|
||||||
|
- restart nsd3
|
||||||
|
|
||||||
|
- name: Copy primary nsd3 zones
|
||||||
|
copy: src="files/nsd/{{ item.zone_filename }}" dest="{{ primary_zones_dir }}/{{ item.zone_filename }}" owner=root group=root mode=0644
|
||||||
|
with_items: "{{ nsd_primary_zones }}"
|
||||||
|
notify:
|
||||||
|
- rebuild nsd3 database
|
||||||
|
|
||||||
|
|
||||||
|
- name: Configure secondary nsd3 zones
|
||||||
|
template: src=secondary_zone_config.j2 dest="{{ zones_config_dir }}/{{ item.zone_name }}.secondary.conf" owner=root group=root mode=0644
|
||||||
|
notify:
|
||||||
|
- restart nsd3
|
||||||
|
with_items: "{{ nsd_secondary_zones }}"
|
||||||
|
|
||||||
|
- name: Add include lines for secondary zones to the include file
|
||||||
|
lineinfile:
|
||||||
|
state: present
|
||||||
|
dest: "{{ zones_include_file }}"
|
||||||
|
regexp: "^include: {{ zones_config_dir }}/{{ item.zone_name }}.secondary.conf"
|
||||||
|
line: "include: {{ zones_config_dir }}/{{ item.zone_name }}.secondary.conf"
|
||||||
|
with_items: "{{ nsd_secondary_zones }}"
|
||||||
|
notify:
|
||||||
|
- restart nsd3
|
30
templates/config.j2
Normal file
30
templates/config.j2
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
# NSD configuration, automatically generated by Ansible.
|
||||||
|
# Do not edit by hand!
|
||||||
|
|
||||||
|
server:
|
||||||
|
# Common configuration
|
||||||
|
{% for key, value in nsd_common_config.iteritems() %}
|
||||||
|
{% if value is string or value is number %}
|
||||||
|
{{ key }}: "{{ value }}"
|
||||||
|
{% else %}
|
||||||
|
{% for subvalue in value %}
|
||||||
|
{{ key }}: "{{ subvalue }}"
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
# Local configuration
|
||||||
|
{% for key, value in nsd_local_config.iteritems() %}
|
||||||
|
{% if value is string or value is number %}
|
||||||
|
{{ key }}: "{{ value }}"
|
||||||
|
{% else %}
|
||||||
|
{% for subvalue in value %}
|
||||||
|
{{ key }}: "{{ subvalue }}"
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
|
||||||
|
# Include zone definitions
|
||||||
|
include: "{{ zones_include_file }}"
|
||||||
|
|
9
templates/primary_zone_config.j2
Normal file
9
templates/primary_zone_config.j2
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# Primary zone definition for {{ item.zone_name }}
|
||||||
|
zone:
|
||||||
|
name: "{{ item.zone_name }}"
|
||||||
|
zonefile: "{{ primary_zones_dir }}/{{ item.zone_filename }}"
|
||||||
|
{% for slave in item.slaves %}
|
||||||
|
notify: {{ slave.ip }} NOKEY
|
||||||
|
provide-xfr: {{ slave.ip }} NOKEY
|
||||||
|
{% endfor %}
|
||||||
|
|
9
templates/secondary_zone_config.j2
Normal file
9
templates/secondary_zone_config.j2
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# Secondary zone definition for {{ item.zone_name }}
|
||||||
|
zone:
|
||||||
|
name: "{{ item.zone_name }}"
|
||||||
|
zonefile: "{{ secondary_zones_dir }}/{{ item.zone_name }}"
|
||||||
|
{% for master in item.masters %}
|
||||||
|
allow-notify: {{ master.ip }} NOKEY
|
||||||
|
request-xfr: AXFR {{ master.ip }} NOKEY
|
||||||
|
{% endfor %}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user