Deploy MaraDNS using Docker containers orchestrated by Ansible. Since there is no official MaraDNS Docker image, this playbook builds the container from source automatically.
ansible-galaxy collection install community.docker
⚠️ No Official Image: There is no official MaraDNS Docker image. This playbook builds from source automatically.
⚠️ Package Warning: Distribution packages may contain vulnerable version 2.0.13. This playbook uses secure version 3.5.0036 built from source.
This playbook builds MaraDNS from source, creates a Docker image, and deploys it with configuration:
---
- name: Deploy MaraDNS with Docker
hosts: maradns_servers
become: true
gather_facts: true
vars:
maradns_version: "3.5.0036"
maradns_download_url: "https://maradns.samiam.org/download/3.5"
maradns_config_dir: "/opt/maradns"
maradns_container_name: "maradns"
tasks:
- name: Install Docker dependencies
package:
name:
- docker
- docker-compose-plugin
- gcc
- make
- musl-dev
- wget
state: present
when: ansible_os_family == "Debian"
- name: Install Docker dependencies (RedHat)
package:
name:
- docker
- docker-compose-plugin
- gcc
- make
- wget
state: present
when: ansible_os_family == "RedHat"
- name: Ensure Docker service is running
systemd:
name: docker
state: started
enabled: true
- name: Create MaraDNS directories
file:
path: "{{ item }}"
state: directory
mode: '0755'
loop:
- "{{ maradns_config_dir }}"
- "{{ maradns_config_dir }}/config"
- name: Download MaraDNS source
get_url:
url: "{{ maradns_download_url }}/maradns-{{ maradns_version }}.tar.xz"
dest: "{{ maradns_config_dir }}/maradns-{{ maradns_version }}.tar.xz"
mode: "0644"
register: download_result
- name: Extract MaraDNS source
unarchive:
src: "{{ maradns_config_dir }}/maradns-{{ maradns_version }}.tar.xz"
dest: "{{ maradns_config_dir }}"
remote_src: true
when: download_result.changed
- name: Create Dockerfile
copy:
dest: "{{ maradns_config_dir }}/Dockerfile"
mode: '0644'
content: |
FROM alpine:latest
LABEL maintainer="Your Name"
LABEL description="MaraDNS DNS Server"
ARG MARADNS_VERSION={{ maradns_version }}
ARG DOWNLOAD_URL={{ maradns_download_url }}
RUN apk add --no-cache gcc make musl-dev wget \
&& wget ${DOWNLOAD_URL}/maradns-${MARADNS_VERSION}.tar.xz \
&& tar -xJf maradns-${MARADNS_VERSION}.tar.xz \
&& cd maradns-${MARADNS_VERSION} \
&& ./configure && make && make install \
&& cd .. && rm -rf maradns-${MARADNS_VERSION} maradns-${MARADNS_VERSION}.tar.xz \
&& apk del gcc make musl-dev wget
RUN mkdir -p /etc/maradns
EXPOSE 53/udp 53/tcp
CMD ["maradns", "-f", "/etc/maradns/mararc"]
- name: Create Docker Compose file
copy:
dest: "{{ maradns_config_dir }}/docker-compose.yml"
mode: '0644'
content: |
services:
maradns:
build: .
container_name: {{ maradns_container_name }}
ports:
- "53:53/udp"
- "53:53/tcp"
volumes:
- ./config:/etc/maradns
restart: unless-stopped
cap_add:
- NET_BIND_SERVICE
- name: Create minimal MaraDNS configuration
copy:
dest: "{{ maradns_config_dir }}/config/mararc"
mode: '0644'
content: |
# MaraDNS minimal configuration
ipv4_bind_addresses = "0.0.0.0"
chroot_dir = "/etc/maradns"
csv2 = {}
csv2["example.com."] = "db.example.com"
- name: Create example zone file
copy:
dest: "{{ maradns_config_dir }}/config/db.example.com"
mode: '0644'
content: |
example.com. 10.1.2.3
www.example.com. 10.1.2.3
- name: Build MaraDNS Docker image
community.docker.docker_image:
build:
path: "{{ maradns_config_dir }}"
name: "maradns"
tag: "{{ maradns_version }}"
source: build
force_source: true
- name: Start MaraDNS container
community.docker.docker_compose_v2:
project_src: "{{ maradns_config_dir }}"
state: present
- name: Verify MaraDNS is running
command: dig @127.0.0.1 google.com +short
register: dig_result
retries: 5
delay: 3
until: dig_result.rc == 0
changed_when: false
handlers:
- name: Restart MaraDNS
community.docker.docker_compose_v2:
project_src: "{{ maradns_config_dir }}"
state: present
restarted: true
# Run the playbook
ansible-playbook -i inventory.ini maradns-docker.yml
# Verify container is running
docker ps | grep maradns
# Test DNS resolution
dig @127.0.0.1 google.com +short
To deploy custom zone files:
mararc configuration template in the playbookconfig/ directoryread_only: true to the containerBeyond this playbook, we offer:
Contact our automation team: office@linux-server-admin.com | Contact Page