Last week I had to migrate my dns server and to do stuff properly I also added a couple of slave DNS servers just to make sure. Problem: ~15 domain names that need to be added to a fresh bind installation. The zone files didn’t change too much so that was fine, sed helped me out with the replacing of old IPs. But what about the bind configuration ? I had to add add the following declaration for all the 15 domains and on each of the slave dns server the “slave” equivalent:
zone "example.com" { type master; file "/etc/bind/zones/example.ro/zone.db"; };
I was in the mood for automation but I wanted something light and quick to setup. Obvious answer: bash.
I created a “template” file where and I replaced the domain name with a place holder:
zone \"$domain\" { type master; file \"/etc/bind/zones/$domain/zone.db\"; };
I then wrote a small bash loop that walks the array of domains and feeds them one by one to the template file. The end result was a nice config file with all of the domain names.
#!/bin/sh
for i in `find * -prune -type d`; do
domain=$i
eval "echo \"$(cat db.zones.tmpl)\""
done
The essence here is that the eval function forces bash to do parsing and variable replacement once more on the argument.