Merge pull request #5 from horakmar/auto_zones
Automatic records, LGTM
diff --git a/README.rst b/README.rst
index 21a0f8b..ad60407 100644
--- a/README.rst
+++ b/README.rst
@@ -39,11 +39,18 @@
ttl: 86400
root: "hostmaster@domain.com"
type: master
+ ns: zone.name.server.
+ refresh: 43200
+ retry: 180
+ expire: 1209600
+ nxttl: 10
records:
- name: @
type: A
ttl: 7200
value: 192.168.0.5
+ # Allow autoload of host records from salt mine.
+ auto_records: true
1.168.192.in-addr.arpa:
type: master
notify: false
diff --git a/bind/files/db.zone b/bind/files/db.zone
index 9c263f1..1183350 100644
--- a/bind/files/db.zone
+++ b/bind/files/db.zone
@@ -1,24 +1,31 @@
{%- from "bind/map.jinja" import server with context -%}
-{%- for name, zone in server.zone.iteritems() if name == zone_name %}
-$ORIGIN {{ name }}
-$TTL {{ zone.get('ttl', '86400') }}
+{%- set zone = server.zone.get(zone_name, {}) -%}
+$ORIGIN {{ zone_name }}.
+$TTL {{ zone.get('ttl', '300') }}
-{{ name }} IN SOA {{ name }}. {{ zone.get('root', 'hostmaster.'+name)|replace('@', '.') }}. (
- {{ zone.get('serial', 1) }}
- {{ zone.get('refresh', 604800) }}
- {{ zone.get('retry', 86400) }}
- {{ zone.get('expire', 2419200) }}
- {{ zone.get('minimum', 86400) }}
+@ IN SOA {{ zone.get('ns', zone_name) }} {{ zone.get('root', 'hostmaster.'+zone_name)|replace('@', '.') }}. (
+ {{ salt['grains.get']('dnsserial', 1) }}
+ {{ zone.get('refresh', 43200) }}
+ {{ zone.get('retry', 180) }}
+ {{ zone.get('expire', 1209600) }}
+ {{ zone.get('nxttl', 10) }}
)
{%- for record in zone.get('records', []) %}
-{{ record.get('name', '@') }} {{ record.get('ttl', '') }}
-{%- for type in record.get('type', []) %}
-{{ type }} {% if type in ['TXT', 'SPF'] %}"{{ record.get('value', []) }}"{% else %}{{ record.get('value', []) }}{% endif %}
+{%- set type = record.get('type', 'A') %}
+{{ record.get('name', '@') }} {{ record.get('ttl', '') }} IN {{ type }} {% if type in ['TXT', 'SPF'] %}"{{ record.get('value', []) }}"{% else %}{{ record.get('value', []) }}{% endif %}
+{%- endfor %}
+{#- Automatic records from salt mine #}
+{%- if zone.get('auto_records', False) %}
+{%- for grains in salt['mine.get']('*', 'grains.items').values() %}
+{%- for record in grains.get('dns_records', []) %}
+{%- for name in record.get('names', []) if '.' in name and name.split('.',1)[1] == zone_name %}
+{{ name.split('.',1)[0] }} IN A {{ record.get('address', '127.0.0.1') }}
{%- endfor %}
{%- endfor %}
{%- endfor %}
+{%- endif %}
{#-
- vim: syntax=jinja
-#}
\ No newline at end of file
+ vim: ft=jinja
+#}
diff --git a/bind/files/named.conf.Debian b/bind/files/named.conf.Debian
index 5134e55..76bec99 100644
--- a/bind/files/named.conf.Debian
+++ b/bind/files/named.conf.Debian
@@ -8,4 +8,4 @@
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
-include "/etc/bind/named.conf.default-zones";
\ No newline at end of file
+include "/etc/bind/named.conf.default-zones";
diff --git a/bind/files/named.conf.local b/bind/files/named.conf.local
index 9f3e0c1..42cfd64 100644
--- a/bind/files/named.conf.local
+++ b/bind/files/named.conf.local
@@ -24,6 +24,11 @@
{{ transfer }};
{%- endfor %}
};
+{%- if zone.get('auto_records', False) %}
+ allow-update {
+ localhost;
+ };
+{%- endif %}
};
{%- endfor %}
diff --git a/bind/files/reload.conf b/bind/files/reload.conf
new file mode 100644
index 0000000..993203b
--- /dev/null
+++ b/bind/files/reload.conf
@@ -0,0 +1,3 @@
+[Service]
+ExecReload=
+ExecReload=/usr/sbin/rndc -c /etc/rndc.conf reload
diff --git a/bind/files/rndc.conf b/bind/files/rndc.conf
index f61d832..685505b 100644
--- a/bind/files/rndc.conf
+++ b/bind/files/rndc.conf
@@ -1,5 +1,5 @@
{%- from "bind/map.jinja" import client with context -%}
-{%- if client.get('rndc_key') %}
+{%- if client.get('rndc_key') -%}
include "{{ client.rndc_key }}";
{%- endif %}
@@ -20,5 +20,5 @@
{%- include "bind/files/_servers.conf" %}
{#-
- vim: syntax=jinja
+ vim: ft=jinja
#}
diff --git a/bind/map.jinja b/bind/map.jinja
index b072011..d73b772 100644
--- a/bind/map.jinja
+++ b/bind/map.jinja
@@ -1,4 +1,3 @@
-
{%- set server = salt['grains.filter_by']({
'Debian': {
'pkgs': ['bind9', 'bind9utils'],
@@ -23,9 +22,12 @@
}, merge=salt['pillar.get']('bind:server')) %}
{%- set client = salt['grains.filter_by']({
+ 'defaults': {
+ 'ddns_ttl': 300
+ },
'Debian': {
'pkgs': ['bind9utils'],
'rndc_config': '/etc/rndc.conf',
'rndc_key': '/etc/bind/rndc.key',
},
-}, merge=salt['pillar.get']('bind:client')) %}
+}, merge=salt['pillar.get']('bind:client'), base='defaults') %}
diff --git a/bind/reactor/node_register.sls b/bind/reactor/node_register.sls
new file mode 100644
index 0000000..6c9b613
--- /dev/null
+++ b/bind/reactor/node_register.sls
@@ -0,0 +1,17 @@
+{%- from "bind/map.jinja" import client with context %}
+{%- for record in data.data.grains.get('dns_records', []) %}
+{%- for name in record.get('names', []) if '.' in name %}
+{%- set hostname, domain = name.split('.',1) %}
+
+bind_node_register_{{ name }}:
+ local.ddns.add_host:
+ - tgt: bind:server:zone:{{ domain }}:type:master
+ - tgt_type: pillar
+ - args:
+ - zone: {{ domain }}
+ - name: {{ hostname }}
+ - ttl: {{ client.get('ddns_ttl', 300) }}
+ - ip: {{ record.get('address', '127.0.0.127') }}
+
+{%- endfor %}
+{%- endfor %}
diff --git a/bind/register.sls b/bind/register.sls
new file mode 100644
index 0000000..ac6292b
--- /dev/null
+++ b/bind/register.sls
@@ -0,0 +1,5 @@
+send_register_event:
+ event.send:
+ - name: dns/node/register
+ - with_grains:
+ - dns_records
diff --git a/bind/server/init.sls b/bind/server/init.sls
index 5dd28e2..843e6e6 100644
--- a/bind/server/init.sls
+++ b/bind/server/init.sls
@@ -2,4 +2,4 @@
- bind.server.service
{%- if pillar.bind.server.zone is defined %}
- bind.server.zone
-{%- endif %}
\ No newline at end of file
+{%- endif %}
diff --git a/bind/server/service.sls b/bind/server/service.sls
index 69d5f32..67ca7f7 100644
--- a/bind/server/service.sls
+++ b/bind/server/service.sls
@@ -62,8 +62,20 @@
service.running:
- name: {{ server.service }}
- enable: true
- - reload: true
- require:
- pkg: bind_packages
+bind_service_reload:
+ file.managed:
+ - name: /etc/systemd/system/bind9.service.d/reload.conf
+ - source: 'salt://bind/files/reload.conf'
+ - user: root
+ - group: root
+ - mode: 644
+ - makedirs: True
+ module.run:
+ - name: service.systemctl_reload
+ - onchanges:
+ - file: bind_service_reload
+
{%- endif %}
diff --git a/bind/server/zone.sls b/bind/server/zone.sls
index e1a63b6..c81164b 100644
--- a/bind/server/zone.sls
+++ b/bind/server/zone.sls
@@ -11,9 +11,24 @@
- require:
- file: named_directory
+dnsserial_increment:
+ grains.present:
+ - name: dnsserial
+ - value: {{ salt['grains.get']('dnsserial', 1) + 1000 }}
+
+bind_service_stop:
+ service.dead:
+ - name: {{ server.service }}
+
{%- for name, zone in server.zone.iteritems() %}
{%- if zone.get('type', 'master') == 'master' %}
-{# Slave zone files will be created by bind #}
+{#- Slave zone files will be created by bind #}
+
+bind_zone_{{ name }}_jnl:
+ file.absent:
+ - name: {{ server.zones_dir }}/db.{{ name }}.jnl
+ - require:
+ - service: bind_service_stop
bind_zone_{{ name }}:
file.managed:
@@ -25,12 +40,14 @@
- mode: 640
- require:
- file: zones_directory
- - watch_in:
- - service: bind_service
- defaults:
zone_name: {{ name }}
{%- endif %}
{%- endfor %}
+bind_service_start:
+ service.running:
+ - name: {{ server.service }}
+
{%- endif %}
diff --git a/metadata/service/register.yml b/metadata/service/register.yml
new file mode 100644
index 0000000..942e606
--- /dev/null
+++ b/metadata/service/register.yml
@@ -0,0 +1,2 @@
+applications:
+- bind.register