This guide deploys DNSControl using Docker Compose with Ansible automation for DNS-as-code workflows.
[dnscontrol_docker]
dns.example.com ansible_host=192.168.1.50
- name: Deploy DNSControl with Docker
hosts: dnscontrol_docker
become: true
vars:
dnscontrol_project_dir: /opt/dnscontrol
dnscontrol_version: "4.13.0"
tasks:
- name: Install Docker (Debian/Ubuntu)
ansible.builtin.apt:
update_cache: true
name:
- docker.io
- docker-compose
state: present
when: ansible_os_family == "Debian"
- name: Install Docker (RHEL)
ansible.builtin.dnf:
name:
- docker
- docker-compose
state: present
when: ansible_os_family == "RedHat"
- name: Create DNSControl project directory
ansible.builtin.file:
path: "{{ dnscontrol_project_dir }}"
state: directory
mode: "0755"
- name: Create config directory
ansible.builtin.file:
path: "{{ dnscontrol_project_dir }}/config"
state: directory
mode: "0755"
- name: Deploy docker-compose.yml
ansible.builtin.copy:
dest: "{{ dnscontrol_project_dir }}/docker-compose.yml"
mode: "0644"
content: |
version: '3.8'
services:
dnscontrol:
image: stackexchange/dnscontrol:{{ dnscontrol_version }}
volumes:
- ./config:/config
working_dir: /config
- name: Deploy example dnsconfig.js
ansible.builtin.copy:
dest: "{{ dnscontrol_project_dir }}/config/dnsconfig.js"
mode: "0640"
force: false
content: |
var REG_NONE = NewRegistrar("none");
var DSP_BIND = NewDnsProvider("bind");
D("example.com", REG_NONE, DnsProvider(DSP_BIND));
- name: Deploy example creds.json
ansible.builtin.copy:
dest: "{{ dnscontrol_project_dir }}/config/creds.json"
mode: "0600"
force: false
content: |
{
"bind": {
"TYPE": "BIND",
"directory": "/config/zones"
}
}
ansible-playbook -i inventory.ini dnscontrol-docker-install.yml
cd /opt/dnscontrol
docker compose run --rm dnscontrol preview
docker compose run --rm dnscontrol push
Need help with DNSControl container deployments? We provide consulting for DNS-as-code implementations and CI/CD integration. Contact office@linux-server-admin.com or visit our contact page.