This guide deploys octoDNS using Docker Compose with Ansible automation for DNS-as-code workflows.
[octodns_docker]
dns-automation.example.com ansible_host=192.168.1.50
[octodns_docker:vars]
octodns_project_dir=/opt/octodns
- name: Deploy octoDNS with Docker Compose
hosts: octodns_docker
become: true
vars:
octodns_project_dir: /opt/octodns
octodns_version: "latest"
octodns_plugins:
- octodns
- octodns-route53
- octodns-cloudflare
- octodns-bind
tasks:
- name: Install Docker (Debian/Ubuntu)
ansible.builtin.apt:
update_cache: true
name:
- docker.io
- docker-compose
- git
state: present
when: ansible_os_family == "Debian"
- name: Install Docker (RHEL)
ansible.builtin.dnf:
name:
- docker
- docker-compose
- git
state: present
when: ansible_os_family == "RedHat"
- name: Create octoDNS project directory
ansible.builtin.file:
path: "{{ octodns_project_dir }}"
state: directory
mode: "0755"
- name: Create subdirectories
ansible.builtin.file:
path: "{{ octodns_project_dir }}/{{ item }}"
state: directory
mode: "0755"
loop:
- config
- zones
- name: Deploy Dockerfile
ansible.builtin.copy:
dest: "{{ octodns_project_dir }}/Dockerfile"
mode: "0644"
content: |
FROM python:3.11-slim
WORKDIR /opt/octodns
RUN pip install --no-cache-dir {% for plugin in octodns_plugins %}{{ plugin }} {% endfor %}
RUN mkdir -p /opt/octodns/config /opt/octodns/zones
WORKDIR /opt/octodns
ENTRYPOINT ["octodns-sync"]
- name: Deploy docker-compose.yml
ansible.builtin.copy:
dest: "{{ octodns_project_dir }}/docker-compose.yml"
mode: "0644"
content: |
version: '3.8'
services:
octodns:
build: .
image: octodns:{{ octodns_version }}
volumes:
- ./config:/opt/octodns/config
- ./zones:/opt/octodns/zones
environment:
- AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
- AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
- CLOUDFLARE_TOKEN=${CLOUDFLARE_TOKEN}
- name: Deploy example octoDNS config
ansible.builtin.copy:
dest: "{{ octodns_project_dir }}/config/production.yaml"
mode: "0640"
force: false
content: |
---
providers:
config:
class: octodns.provider.yaml.YamlProvider
directory: /opt/octodns/zones
default_ttl: 3600
enforce_order: true
zones: {}
- name: Build octoDNS Docker image
community.docker.docker_compose:
project_src: "{{ octodns_project_dir }}"
build: true
ansible-playbook -i inventory.ini octodns-docker-install.yml
cd /opt/octodns
docker compose run --rm octodns --config-file=/opt/octodns/config/production.yaml
Need help automating DNS-as-code deployments? We provide consulting for octoDNS Docker deployments, CI/CD integration, and multi-provider DNS management. Contact office@linux-server-admin.com or visit our contact page.