Skip to content

Commit 6e8652d

Browse files
Merge pull request #84 from nadvornik/serial
Auto-update zone file serial
2 parents 87f046e + 59502ab commit 6e8652d

File tree

3 files changed

+35
-31
lines changed

3 files changed

+35
-31
lines changed

bind/config.sls

Lines changed: 26 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -168,23 +168,30 @@ bind_rndc_client_config:
168168
{%- endif %}
169169
{% endif %}
170170
171-
{% for zone, zone_data in salt['pillar.get']('bind:configured_zones', {}).items() -%}
171+
{%- set views = {False: salt['pillar.get']('bind', {})} %}{# process non-view zones in the same loop #}
172+
{%- do views.update(salt['pillar.get']('bind:configured_views', {})) %}
173+
{%- for view, view_data in views.items() %}
174+
{%- set dash_view = '-' + view if view else '' %}
175+
{% for zone, zone_data in view_data.get('configured_zones', {}).items() -%}
172176
{%- set file = salt['pillar.get']("bind:available_zones:" + zone + ":file", false) %}
173177
{%- set zone_records = salt['pillar.get']('bind:available_zones:' + zone + ':records', {}) %}
174178
{# If we define RRs in pillar, we use the internal template to generate the zone file
175179
otherwise, we fallback to the old behaviour and use the declared file
176180
#}
177181
{%- set zone_source = 'salt://bind/files/zone.jinja' if zone_records != {} else 'salt://' ~ map.zones_source_dir ~ '/' ~ file %}
178-
{% if file and zone_data['type'] == "master" -%}
179-
zones-{{ zone }}:
182+
{%- set serial_auto = salt['pillar.get']('bind:available_zones:' + zone + ':soa:serial', '') == 'auto' %}
183+
{% if file and zone_data['type'] == 'master' -%}
184+
zones{{ dash_view }}-{{ zone }}{{ '.include' if serial_auto else ''}}:
180185
file.managed:
181-
- name: {{ map.named_directory }}/{{ file }}
186+
- name: {{ map.named_directory }}/{{ file }}{{ '.include' if serial_auto else ''}}
182187
- source: {{ zone_source }}
183188
- template: jinja
184189
{% if zone_records != {} %}
185190
- context:
191+
zone: zones{{ dash_view }}-{{ zone }}
186192
soa: {{ salt['pillar.get']("bind:available_zones:" + zone + ":soa") }}
187193
records: {{ zone_records }}
194+
include: False
188195
{% endif %}
189196
- user: {{ salt['pillar.get']('bind:config:user', map.user) }}
190197
- group: {{ salt['pillar.get']('bind:config:group', map.group) }}
@@ -194,36 +201,25 @@ zones-{{ zone }}:
194201
- require:
195202
- file: named_directory
196203
197-
{% if zone_data['dnssec'] is defined and zone_data['dnssec'] -%}
198-
signed-{{ zone }}:
199-
cmd.run:
200-
- cwd: {{ map.named_directory }}
201-
- name: zonesigner -zone {{ zone }} {{ file }}
202-
- prereq:
203-
- file: zones-{{ zone }}
204-
{% endif %}
205-
206-
{% endif %}
207-
{% endfor %}
208-
209-
{%- for view, view_data in salt['pillar.get']('bind:configured_views', {}).items() %}
210-
{% for zone, zone_data in view_data.get('configured_zones', {}).items() -%}
211-
{%- set file = salt['pillar.get']("bind:available_zones:" + zone + ":file", false) %}
212-
{%- set zone_records = salt['pillar.get']('bind:available_zones:' + zone + ':records', {}) %}
213-
{# If we define RRs in pillar, we use the internal template to generate the zone file
214-
otherwise, we fallback to the old behaviour and use the declared file
215-
#}
216-
{%- set zone_source = 'salt://bind/zone.jinja' if zone_records != {} else 'salt://' ~ map.zones_source_dir ~ '/' ~ file %}
217-
{% if file and zone_data['type'] == 'master' -%}
218-
zones-{{ view }}-{{ zone }}:
204+
{% if serial_auto %}
205+
zones{{ dash_view }}-{{ zone }}:
206+
module.wait:
207+
- name: dnsutil.serial
208+
- update: True
209+
- zone: zones{{ dash_view }}-{{ zone }}
210+
- watch:
211+
- file: {{ map.named_directory }}/{{ file }}.include
219212
file.managed:
220213
- name: {{ map.named_directory }}/{{ file }}
214+
- require:
215+
- module: zones{{ dash_view }}-{{ zone }}
221216
- source: {{ zone_source }}
222217
- template: jinja
223218
{% if zone_records != {} %}
224219
- context:
220+
zone: zones{{ dash_view }}-{{ zone }}
225221
soa: {{ salt['pillar.get']("bind:available_zones:" + zone + ":soa") }}
226-
records: {{ zone_records }}
222+
include: {{ file }}.include
227223
{% endif %}
228224
- user: {{ salt['pillar.get']('bind:config:user', map.user) }}
229225
- group: {{ salt['pillar.get']('bind:config:group', map.group) }}
@@ -232,14 +228,14 @@ zones-{{ view }}-{{ zone }}:
232228
- service: bind
233229
- require:
234230
- file: named_directory
235-
231+
{% endif %}
236232
{% if zone_data['dnssec'] is defined and zone_data['dnssec'] -%}
237-
signed-{{ view }}-{{ zone }}:
233+
signed{{ dash_view }}-{{ zone }}:
238234
cmd.run:
239235
- cwd: {{ map.named_directory }}
240236
- name: zonesigner -zone {{ zone }} {{ file }}
241237
- prereq:
242-
- file: zones-{{ view }}-{{ zone }}
238+
- file: zones{{ dash_view }}-{{ zone }}
243239
{% endif %}
244240
245241
{% endif %}

bind/files/zone.jinja

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
; Modify the values passed to the bind pillar instead.
44
;
55
{%- set zone_serial = soa['serial'] %}
6+
{%- set serial_auto = zone_serial == 'auto' %}
67
{%- set zone_ns = soa['ns'] %}
78
{%- set zone_contact = soa['contact'] %}
89
{%- set zone_class = soa['class'] if soa['class'] is defined else 'IN' %}
@@ -11,17 +12,22 @@
1112
{%- set zone_expiry = soa['expiry'] if soa['expiry'] is defined else '2w' %}
1213
{%- set zone_nxdomain = soa['nxdomain'] if soa['nxdomain'] is defined else '1m' %}
1314

15+
{% if not serial_auto or include %}
1416
{% if soa['ttl'] is defined %}
1517
$TTL {{ soa['ttl'] }}
1618
{% endif %}
1719
@ {{ zone_class }} SOA {{ zone_ns }} {{ zone_contact }} (
18-
{{ zone_serial }} ; serial
20+
{{ salt['dnsutil.serial'](zone) if serial_auto else zone_serial }} ; serial
1921
{{ zone_refresh }} ; refresh
2022
{{ zone_retry }} ; retry
2123
{{ zone_expiry }} ; expiry
2224
{{ zone_nxdomain }} ; nxdomain ttl
2325
);
26+
{%- endif %}
2427

28+
{% if include %}
29+
$INCLUDE {{ include }}
30+
{% else %}
2531
{% for type, rrs in records.iteritems() %}
2632
;
2733
; {{ type }} RRs
@@ -36,3 +42,4 @@ $TTL {{ soa['ttl'] }}
3642
{%- endif %}
3743
{%- endfor %}
3844
{% endfor %}
45+
{%- endif %}

pillar.example

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,7 @@ bind:
272272
ns: ns1.example.com # Required
273273
contact: hostmaster.example.com # Required
274274
serial: 2017041001 # Required
275+
# serial: auto # Alternatively, autoupdate serial on each change
275276
class: IN # Optional. Default: IN
276277
refresh: 8600 # Optional. Default: 12h
277278
retry: 900 # Optional. Default: 15m

0 commit comments

Comments
 (0)