Run your own DNS servers and manage your zones easily with Git.
This piece of free software gives you the ability to describe your zone files in a simple DSL (Domain Specific Language) with templates and store everything in a Git repository.
Every time you push your changes, a hook generates all zone files and, if necessary, increases serial numbers. This has been inspired by LuaDNS.
DNS Git has been tested with version 4.1.1 of the PowerDNS Authoritative Server.
DNS Git supports two PowerDNS backends: BIND and SQLite3.
You need to have Git and a recent version of Ruby (>= v2.4) installed on
your server. If you want to use the SQLite backend, you'll also need
development packages for Ruby and libsqlite3, plus a C compiler (on
Debian-based OS, ruby-dev
, libsqlite3-dev
and build-essential
should
suffice).
First, clone the repository (on the machine your PowerDNS server runs on):
$ ssh [email protected]
# git clone git://github.com/digineo/dnsgit /opt/dnsgit
# cd /opt/dnsgit
Then install the required libraries using bundler.
Depending on whether or not you have PowerDNS configured with
launch=bind
or launch=gsqlite3
, you need to execute one of these
commands:
# bundle install --without=sqlite
# bundle install --with=sqlite
Finally, initialize a sample configuration repository:
# bin/init
Please clone and update the configuration:
git clone [email protected]:/opt/dnsgit/data dns-config
Run these steps locally on your own machine:
$ git clone [email protected]:/opt/dnsgit/data dns-config
$ cd dns-config
The first thing you should do after setup is modify the contained
config.yml
and update the values according to your PowerDNS
installation (remove sqlite:
section for launch=bind
or remove
bind:
section for launch=gsqlite3
).
Once that's done, you can update the zones.
Then push your changes back to the server.
$ git add -A
$ git commit -m "my commit message"
$ git push
On error, your commit will be rejected.
Take a look at the lib/example/ and tests folders.
To run tests, simply invoke rake
.
To get a detailed log of what happens on a git push
, modify
bin/hooks/pre-receive
on the server:
# Generate Zones
-ruby -I$basedir/lib $basedir/bin/run.rb
DNSGIT_DEBUG=all ruby -I$basedir/lib $basedir/bin/run.rb
You can reduce the log amount by setting DNSGIT_DEBUG
to a comma-separated
list of (lowercase) class names. Known log-enabled classes include:
bind
- for the BIND backendsqlite
- for the SQLite backendwork
- for details in the SQLite backendzone
- logs effects of your DSL files
The class names of log-enabled classes are printed in magenta in the log output.