diff --git a/.kitchen.yml b/.kitchen.yml deleted file mode 100644 index 9941a75..0000000 --- a/.kitchen.yml +++ /dev/null @@ -1,165 +0,0 @@ ---- -driver: - name: docker - -driver_config: - use_sudo: false - privileged: true - provision_command: mkdir -p /run/sshd - run_command: /lib/systemd/systemd - -platforms: - - name: debian-8 - - name: debian-9 - - name: ubuntu-16.04 - - name: ubuntu-18.04 - - name: fedora-27 - - name: centos-7 - -provisioner: - name: salt_solo - log_level: info - require_chef: false - salt_version: latest - formula: bind - salt_copy_filter: - - .kitchen - - .git - pillars: - top.sls: - base: - '*': - - bind - bind.sls: - bind: - configured_acls: - client1: - - 127.0.0.0/8 - - 10.20.0.0/16 - client2: - - 10.30.0.0/8 - configured_zones: - example.com: - type: master - notify: False - update_policy: - - "grant core_dhcp name dns_entry_allowed_to_update. ANY" - notify: False - example.net: - type: master - notify: False - example.org: - type: slave - notify: False - masters: - - 192.0.2.1 - - 192.0.2.2 - 113.0.203.in-addr.arpa: - type: master - notify: false - 100.51.198.in-addr.arpa: - type: master - notify: False - available_zones: - example.net: - file: example.net - soa: - class: IN - ns: ns1.example.net - contact: hostmaster.example.net - serial: auto - retry: 300 - ttl: 300 - records: - NS: - '@': - - ns1 - A: - ns1: 198.51.100.1 - foo: 198.51.100.2 - bar: 198.51.100.3 - baz: 198.51.100.4 - mx1: - - 198.51.100.5 - - 198.51.100.6 - - 198.51.100.7 - CNAME: - mail: mx1.example.net. - smtp: mx1.example.net. - example.com: - file: example.com - soa: - class: IN - ns: ns1.example.com - contact: hostmaster.example.com - serial: 2018073100 - retry: 600 - ttl: 600 - records: - NS: - '@': - - ns1 - A: - ns1: 203.0.113.1 - foo: 203.0.113.2 - bar: 203.0.113.3 - CNAME: - ftp: foo.example.com. - www: bar.example.com. - mail: mx1.example.com. - smtp: mx1.example.com. - TXT: - '@': - - '"some_value"' - 113.0.203.in-addr.arpa: - file: 113.0.203.in-addr.arpa - soa: - class: IN - ns: ns1.example.com - contact: hostmaster.example.com - serial: 2018073100 - retry: 600 - ttl: 600 - records: - NS: - '@': - - ns1.example.com. - PTR: - 1.113.0.203.in-addr.arpa: ns1.example.com. - 2.113.0.203.in-addr.arpa: foo.example.com. - 3.113.0.203.in-addr.arpa: bar.example.com. - 100.51.198.in-addr.arpa: - file: 100.51.198.in-addr.arpa - soa: - class: IN - ns: ns1.example.net - contact: hostmaster.example.net - serial: auto - retry: 600 - ttl: 600 - records: - NS: - '@': - - ns1.example.net. - generate_reverse: - net: 198.51.100.0/24 - for_zones: - - example.net - - -verifier: - name: inspec - sudo: true - reporter: - - cli - inspec_tests: - - path: test/integration/default - -suites: - - name: bind - provisioner: - state_top: - base: - '*': - - bind - - bind.config diff --git a/.travis.yml b/.travis.yml index b5ad4f0..09e5f7d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,9 @@ +stages: + - test + - commitlint + - name: release + if: branch = master AND type != pull_request + sudo: required cache: bundler language: ruby @@ -5,18 +11,62 @@ language: ruby services: - docker -before_install: - - bundle install - +# Make sure the instances listed below match up with +# the `platforms` defined in `kitchen.yml` env: matrix: - - INSTANCE: bind-debian-8 - - INSTANCE: bind-debian-9 - - INSTANCE: bind-ubuntu-1604 - - INSTANCE: bind-ubuntu-1804 - - INSTANCE: bind-fedora-27 - - INSTANCE: bind-centos-7 + - INSTANCE: default-debian-9-2019-2-py3 + - INSTANCE: default-ubuntu-1804-2019-2-py3 + - INSTANCE: default-centos-7-2019-2-py3 + - INSTANCE: default-fedora-29-2019-2-py3 + - INSTANCE: default-opensuse-leap-15-2019-2-py3 + - INSTANCE: default-debian-9-2018-3-py2 + - INSTANCE: default-ubuntu-1604-2018-3-py2 + - INSTANCE: default-centos-7-2018-3-py2 + - INSTANCE: default-fedora-29-2018-3-py2 + # TODO: Use this when fixed instead of `opensuse-leap-42` + # Ref: https://github.com/netmanagers/salt-image-builder/issues/2 + # - INSTANCE: default-opensuse-leap-15-2018-3-py2 + - INSTANCE: default-opensuse-leap-42-2018-3-py2 + - INSTANCE: default-debian-8-2017-7-py2 + - INSTANCE: default-ubuntu-1604-2017-7-py2 + # TODO: Enable after improving the formula to work with other than `systemd` + - INSTANCE: default-centos-6-2017-7-py2 + - INSTANCE: default-fedora-28-2017-7-py2 + - INSTANCE: default-opensuse-leap-42-2017-7-py2 script: - bundle exec kitchen verify ${INSTANCE} +jobs: + include: + # Define the commitlint stage + - stage: commitlint + language: node_js + node_js: lts/* + before_install: skip + script: + - npm install @commitlint/config-conventional -D + - npm install @commitlint/travis-cli -D + - commitlint-travis + # Define the release stage that runs semantic-release + - stage: release + language: node_js + node_js: lts/* + before_install: skip + script: + # Update `AUTHORS.md` + - export MAINTAINER_TOKEN=${GH_TOKEN} + - go get github.com/myii/maintainer + - maintainer contributor + + # Install all dependencies required for `semantic-release` + - npm install @semantic-release/changelog@3 -D + - npm install @semantic-release/exec@3 -D + - npm install @semantic-release/git@7 -D + deploy: + provider: script + skip_cleanup: true + script: + # Run `semantic-release` + - npx semantic-release@15 diff --git a/FORMULA b/FORMULA new file mode 100644 index 0000000..1d0d7fa --- /dev/null +++ b/FORMULA @@ -0,0 +1,9 @@ +name: bind +os: Debian, Ubuntu, Raspbian, RedHat, Fedora, CentOS, Suse, openSUSE +os_family: Debian, RedHat, Suse +version: 1.0.0rc +release: 1 +minimum_version: 2016.11 +summary: Bind formula +description: Formula to install and configure bind +top_level_dir: bind diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 0000000..2f9d1aa --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1,3 @@ +module.exports = { + extends: ['@commitlint/config-conventional'], +}; diff --git a/docs/CONTRIBUTING.rst b/docs/CONTRIBUTING.rst new file mode 100644 index 0000000..b7da8f4 --- /dev/null +++ b/docs/CONTRIBUTING.rst @@ -0,0 +1,159 @@ +.. _contributing: + +How to contribute +================= + +This document will eventually outline all aspects of guidance to make your contributing experience a fruitful and enjoyable one. +What it already contains is information about *commit message formatting* and how that directly affects the numerous automated processes that are used for this repo. +It also covers how to contribute to this *formula's documentation*. + +.. contents:: **Table of Contents** + +Overview +-------- + +Submitting a pull request is more than just code! +To achieve a quality product, the *tests* and *documentation* need to be updated as well. +An excellent pull request will include these in the changes, wherever relevant. + +Commit message formatting +------------------------- + +Since every type of change requires making Git commits, +we will start by covering the importance of ensuring that all of your commit +messages are in the correct format. + +Automation of multiple processes +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This formula uses `semantic-release `_ for automating numerous processes such as bumping the version number appropriately, creating new tags/releases and updating the changelog. +The entire process relies on the structure of commit messages to determine the version bump, which is then used for the rest of the automation. + +Full details are available in the upstream docs regarding the `Angular Commit Message Conventions `_. +The key factor is that the first line of the commit message must follow this format: + +.. code-block:: + + type(scope): subject + + +* E.g. ``docs(contributing): add commit message formatting instructions``. + +Besides the version bump, the changelog and release notes are formatted accordingly. +So based on the example above: + +.. + + .. raw:: html + +

Documentation

+ + * **contributing:** add commit message formatting instructions + + +* The ``type`` translates into a ``Documentation`` sub-heading. +* The ``(scope):`` will be shown in bold text without the brackets. +* The ``subject`` follows the ``scope`` as standard text. + +Linting commit messages in Travis CI +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This formula uses `commitlint `_ for checking commit messages during CI testing. +This ensures that they are in accordance with the ``semantic-release`` settings. + +For more details about the default settings, refer back to the ``commitlint`` `reference rules `_. + +Relationship between commit type and version bump +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This formula applies some customisations to the defaults, as outlined in the table below, +based upon the `type `_ of the commit: + +.. list-table:: + :name: commit-type-vs-version-bump + :header-rows: 1 + :stub-columns: 0 + :widths: 1,2,3,1,1 + + * - Type + - Heading + - Description + - Bump (default) + - Bump (custom) + * - ``build`` + - Build System + - Changes related to the build system + - – + - + * - ``chore`` + - – + - Changes to the build process or auxiliary tools and libraries such as + documentation generation + - – + - + * - ``ci`` + - Continuous Integration + - Changes to the continuous integration configuration + - – + - + * - ``docs`` + - Documentation + - Documentation only changes + - – + - 0.0.1 + * - ``feat`` + - Features + - A new feature + - 0.1.0 + - + * - ``fix`` + - Bug Fixes + - A bug fix + - 0.0.1 + - + * - ``perf`` + - Performance Improvements + - A code change that improves performance + - 0.0.1 + - + * - ``refactor`` + - Code Refactoring + - A code change that neither fixes a bug nor adds a feature + - – + - 0.0.1 + * - ``revert`` + - Reverts + - A commit used to revert a previous commit + - – + - 0.0.1 + * - ``style`` + - Styles + - Changes that do not affect the meaning of the code (white-space, + formatting, missing semi-colons, etc.) + - – + - 0.0.1 + * - ``test`` + - Tests + - Adding missing or correcting existing tests + - – + - 0.0.1 + +Use ``BREAKING CHANGE`` to trigger a ``major`` version change +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Adding ``BREAKING CHANGE`` to the footer of the extended description of the commit message will **always** trigger a ``major`` version change, no matter which type has been used. +This will be appended to the changelog and release notes as well. +To preserve good formatting of these notes, the following format is prescribed: + +* ``BREAKING CHANGE: .`` + +An example of that: + +.. code-block:: git + + ... + + BREAKING CHANGE: With the removal of all of the `.sls` files under + `template package`, this formula no longer supports the installation of + packages. + diff --git a/README.rst b/docs/README.rst similarity index 66% rename from README.rst rename to docs/README.rst index ed64582..8306cfb 100644 --- a/README.rst +++ b/docs/README.rst @@ -1,27 +1,58 @@ -==== -bind -==== +.. _readme: -Formulas to set up and configure the bind DNS server. - -.. note:: - - See the full `Salt Formulas installation and usage instructions - `_. - -Available states +bind-formula ================ +|img_travis| |img_sr| + +.. |img_travis| image:: https://travis-ci.com/saltstack-formulas/bind-formula.svg?branch=master + :alt: Travis CI Build Status + :scale: 100% + :target: https://travis-ci.com/saltstack-formulas/bind-formula +.. |img_sr| image:: https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg + :alt: Semantic Release + :scale: 100% + :target: https://github.com/semantic-release/semantic-release + +A SaltStack formula that is empty. It has dummy content to help with a quick +start on a new formula and it serves as a style guide. + +.. contents:: **Table of Contents** + +General notes +------------- + +See the full `SaltStack Formulas installation and usage instructions +`_. + +If you are interested in writing or contributing to formulas, please pay attention to the `Writing Formula Section +`_. + +If you want to use this formula, please pay attention to the ``FORMULA`` file and/or ``git tag``, +which contains the currently released version. This formula is versioned according to `Semantic Versioning `_. + +See `Formula Versioning Section `_ for more details. + +Contributing to this repo +------------------------- + +**Commit message formatting is significant!!** + +Please see :ref:`How to contribute ` for more details. + +Available states +---------------- + .. contents:: - :local: + :local: ``bind`` --------- +^^^^^^^^ Install the bind package and start the bind service. ``bind.config`` ---------------- +^^^^^^^^^^^^^^^ Manage the bind configuration file. @@ -180,3 +211,35 @@ Tested with: * Fedora-27 * Ubuntu-16.04 * Ubuntu-18.04 + + +Testing +------- + +Linux testing is done with ``kitchen-salt``. + +``kitchen converge`` +^^^^^^^^^^^^^^^^^^^^ + +Creates the docker instance and runs the ``template`` main state, ready for testing. + +``kitchen verify`` +^^^^^^^^^^^^^^^^^^ + +Runs the ``inspec`` tests on the actual instance. + +``kitchen destroy`` +^^^^^^^^^^^^^^^^^^^ + +Removes the docker instance. + +``kitchen test`` +^^^^^^^^^^^^^^^^ + +Runs all of the stages above in one go: i.e. ``destroy`` + ``converge`` + ``verify`` + ``destroy``. + +``kitchen login`` +^^^^^^^^^^^^^^^^^ + +Gives you SSH access to the instance for manual testing. + diff --git a/kitchen.yml b/kitchen.yml new file mode 100644 index 0000000..8c99fe5 --- /dev/null +++ b/kitchen.yml @@ -0,0 +1,109 @@ +# -*- coding: utf-8 -*- +# vim: ft=yaml +--- +# For help on this file's format, see https://kitchen.ci/ +driver: + name: docker + use_sudo: false + privileged: true + run_command: /lib/systemd/systemd + +# Make sure the platforms listed below match up with +# the `env.matrix` instances defined in `.travis.yml` +platforms: + ## SALT 2019.2 + - name: debian-9-2019-2-py3 + driver: + image: netmanagers/salt-2019.2-py3:debian-9 + - name: ubuntu-1804-2019-2-py3 + driver: + image: netmanagers/salt-2019.2-py3:ubuntu-18.04 + - name: centos-7-2019-2-py3 + driver: + image: netmanagers/salt-2019.2-py3:centos-7 + - name: fedora-29-2019-2-py3 + driver: + image: netmanagers/salt-2019.2-py3:fedora-29 + - name: opensuse-leap-15-2019-2-py3 + driver: + image: netmanagers/salt-2019.2-py3:opensuse-leap-15 + run_command: /usr/lib/systemd/systemd + + ## SALT 2018.3 + - name: debian-9-2018-3-py2 + driver: + image: netmanagers/salt-2018.3-py2:debian-9 + - name: ubuntu-1604-2018-3-py2 + driver: + image: netmanagers/salt-2018.3-py2:ubuntu-16.04 + - name: centos-7-2018-3-py2 + driver: + image: netmanagers/salt-2018.3-py2:centos-7 + - name: fedora-29-2018-3-py2 + driver: + image: netmanagers/salt-2018.3-py2:fedora-29 + # TODO: Use this when fixed instead of `opensuse-leap-42` + # Ref: https://github.com/netmanagers/salt-image-builder/issues/2 + # - name: opensuse-leap-15-2018-3-py2 + # driver: + # image: netmanagers/salt-2018.3-py2:opensuse-leap-15 + # run_command: /usr/lib/systemd/systemd + - name: opensuse-leap-42-2018-3-py2 + driver: + image: netmanagers/salt-2018.3-py2:opensuse-leap-42 + run_command: /usr/lib/systemd/systemd + + ## SALT 2017.7 + - name: debian-8-2017-7-py2 + driver: + image: netmanagers/salt-2017.7-py2:debian-8 + - name: ubuntu-1604-2017-7-py2 + driver: + image: netmanagers/salt-2017.7-py2:ubuntu-16.04 + # TODO: Modify the formula to work for non-`systemd` platforms + - name: centos-6-2017-7-py2 + driver: + image: netmanagers/salt-2017.7-py2:centos-6 + run_command: /sbin/init + - name: fedora-28-2017-7-py2 + driver: + image: netmanagers/salt-2017.7-py2:fedora-28 + - name: opensuse-leap-42-2017-7-py2 + driver: + image: netmanagers/salt-2017.7-py2:opensuse-leap-42 + run_command: /usr/lib/systemd/systemd + +provisioner: + name: salt_solo + log_level: info + salt_install: none + require_chef: false + formula: bind + salt_copy_filter: + - .kitchen + - .git + state_top: + base: + '*': + - bind + - bind.config + pillars: + top.sls: + base: + '*': + - bind + pillars_from_files: + bind.sls: test/salt/pillar/default.sls + +verifier: + # https://www.inspec.io/ + name: inspec + sudo: true + # cli, documentation, html, progress, json, json-min, json-rspec, junit + reporter: + - cli + inspec_tests: + - path: test/integration/default + +suites: + - name: default diff --git a/pre-commit_semantic-release.sh b/pre-commit_semantic-release.sh new file mode 100755 index 0000000..9d34d74 --- /dev/null +++ b/pre-commit_semantic-release.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +############################################################################### +# (A) Update `FORMULA` with `${nextRelease.version}` +############################################################################### +sed -i -e "s_^\(version:\).*_\1 ${1}_" FORMULA + + +############################################################################### +# (B) Use `m2r` to convert automatically produced `.md` docs to `.rst` +############################################################################### + +# Install `m2r` +sudo -H pip install m2r + +# Copy and then convert the `.md` docs +cp *.md docs/ +cd docs/ +m2r --overwrite *.md + +# Change excess `H1` headings to `H2` in converted `CHANGELOG.rst` +sed -i -e '/^=.*$/s/=/-/g' CHANGELOG.rst +sed -i -e '1,4s/-/=/g' CHANGELOG.rst + +# Use for debugging output, when required +# cat AUTHORS.rst +# cat CHANGELOG.rst + +# Return back to the main directory +cd .. diff --git a/release-rules.js b/release-rules.js new file mode 100644 index 0000000..c63c850 --- /dev/null +++ b/release-rules.js @@ -0,0 +1,18 @@ +// No release is triggered for the types commented out below. +// Commits using these types will be incorporated into the next release. +// +// NOTE: Any changes here must be reflected in `CONTRIBUTING.md`. +module.exports = [ + {breaking: true, release: 'major'}, + // {type: 'build', release: 'patch'}, + // {type: 'chore', release: 'patch'}, + // {type: 'ci', release: 'patch'}, + {type: 'docs', release: 'patch'}, + {type: 'feat', release: 'minor'}, + {type: 'fix', release: 'patch'}, + {type: 'perf', release: 'patch'}, + {type: 'refactor', release: 'patch'}, + {type: 'revert', release: 'patch'}, + {type: 'style', release: 'patch'}, + {type: 'test', release: 'patch'}, +]; diff --git a/release.config.js b/release.config.js new file mode 100644 index 0000000..afa0cb1 --- /dev/null +++ b/release.config.js @@ -0,0 +1,106 @@ +module.exports = { + branch: 'master', + plugins: [ + ['@semantic-release/commit-analyzer', { + preset: 'angular', + releaseRules: './release-rules.js', + }], + '@semantic-release/release-notes-generator', + ['@semantic-release/changelog', { + changelogFile: 'CHANGELOG.md', + changelogTitle: '# Changelog', + }], + ['@semantic-release/exec', { + prepareCmd: 'sh ./pre-commit_semantic-release.sh ${nextRelease.version}', + }], + ['@semantic-release/git', { + assets: ['*.md', 'docs/*.rst', 'FORMULA'], + }], + '@semantic-release/github', + ], + generateNotes: { + preset: 'angular', + writerOpts: { + // Required due to upstream bug preventing all types being displayed. + // Bug: https://github.com/conventional-changelog/conventional-changelog/issues/317 + // Fix: https://github.com/conventional-changelog/conventional-changelog/pull/410 + transform: (commit, context) => { + const issues = [] + + commit.notes.forEach(note => { + note.title = `BREAKING CHANGES` + }) + + // NOTE: Any changes here must be reflected in `CONTRIBUTING.md`. + if (commit.type === `feat`) { + commit.type = `Features` + } else if (commit.type === `fix`) { + commit.type = `Bug Fixes` + } else if (commit.type === `perf`) { + commit.type = `Performance Improvements` + } else if (commit.type === `revert`) { + commit.type = `Reverts` + } else if (commit.type === `docs`) { + commit.type = `Documentation` + } else if (commit.type === `style`) { + commit.type = `Styles` + } else if (commit.type === `refactor`) { + commit.type = `Code Refactoring` + } else if (commit.type === `test`) { + commit.type = `Tests` + } else if (commit.type === `build`) { + commit.type = `Build System` + // } else if (commit.type === `chore`) { + // commit.type = `Maintenance` + } else if (commit.type === `ci`) { + commit.type = `Continuous Integration` + } else { + return + } + + if (commit.scope === `*`) { + commit.scope = `` + } + + if (typeof commit.hash === `string`) { + commit.hash = commit.hash.substring(0, 7) + } + + if (typeof commit.subject === `string`) { + let url = context.repository + ? `${context.host}/${context.owner}/${context.repository}` + : context.repoUrl + if (url) { + url = `${url}/issues/` + // Issue URLs. + commit.subject = commit.subject.replace(/#([0-9]+)/g, (_, issue) => { + issues.push(issue) + return `[#${issue}](${url}${issue})` + }) + } + if (context.host) { + // User URLs. + commit.subject = commit.subject.replace(/\B@([a-z0-9](?:-?[a-z0-9/]){0,38})/g, (_, username) => { + if (username.includes('/')) { + return `@${username}` + } + + return `[@${username}](${context.host}/${username})` + }) + } + } + + // remove references that already appear in the subject + commit.references = commit.references.filter(reference => { + if (issues.indexOf(reference.issue) === -1) { + return true + } + + return false + }) + + return commit + }, + }, + }, +}; diff --git a/test/salt/pillar/default.sls b/test/salt/pillar/default.sls new file mode 100644 index 0000000..434e176 --- /dev/null +++ b/test/salt/pillar/default.sls @@ -0,0 +1,114 @@ +bind: + configured_acls: + client1: + - 127.0.0.0/8 + - 10.20.0.0/16 + client2: + - 10.30.0.0/8 + configured_zones: + example.com: + type: master + notify: False + update_policy: + - "grant core_dhcp name dns_entry_allowed_to_update. ANY" + example.net: + type: master + notify: False + example.org: + type: slave + notify: False + masters: + - 192.0.2.1 + - 192.0.2.2 + 113.0.203.in-addr.arpa: + type: master + notify: false + 100.51.198.in-addr.arpa: + type: master + notify: False + available_zones: + example.net: + file: example.net + soa: + class: IN + ns: ns1.example.net + contact: hostmaster.example.net + serial: auto + retry: 300 + ttl: 300 + records: + NS: + '@': + - ns1 + A: + ns1: 198.51.100.1 + foo: 198.51.100.2 + bar: 198.51.100.3 + baz: 198.51.100.4 + mx1: + - 198.51.100.5 + - 198.51.100.6 + - 198.51.100.7 + CNAME: + mail: mx1.example.net. + smtp: mx1.example.net. + example.com: + file: example.com + soa: + class: IN + ns: ns1.example.com + contact: hostmaster.example.com + serial: 2018073100 + retry: 600 + ttl: 600 + records: + NS: + '@': + - ns1 + A: + ns1: 203.0.113.1 + foo: 203.0.113.2 + bar: 203.0.113.3 + CNAME: + ftp: foo.example.com. + www: bar.example.com. + mail: mx1.example.com. + smtp: mx1.example.com. + TXT: + '@': + - '"some_value"' + 113.0.203.in-addr.arpa: + file: 113.0.203.in-addr.arpa + soa: + class: IN + ns: ns1.example.com + contact: hostmaster.example.com + serial: 2018073100 + retry: 600 + ttl: 600 + records: + NS: + '@': + - ns1.example.com. + PTR: + 1.113.0.203.in-addr.arpa: ns1.example.com. + 2.113.0.203.in-addr.arpa: foo.example.com. + 3.113.0.203.in-addr.arpa: bar.example.com. + 100.51.198.in-addr.arpa: + file: 100.51.198.in-addr.arpa + soa: + class: IN + ns: ns1.example.net + contact: hostmaster.example.net + serial: auto + retry: 600 + ttl: 600 + records: + NS: + '@': + - ns1.example.net. + generate_reverse: + net: 198.51.100.0/24 + for_zones: + - example.net +