From 9b579894309ed0e5889f773e70b28bcc375fdc74 Mon Sep 17 00:00:00 2001 From: Markus Pesch Date: Sat, 24 Oct 2026 16:19:23 +0200 Subject: [PATCH] test(bind9): add Molecule scenario Co-authored-by: Copilot --- molecule/default/Dockerfile | 17 ++++++++++++ molecule/default/collections.yml | 4 +++ molecule/default/converge.yml | 12 +++++++++ molecule/default/create.yml | 44 +++++++++++++++++++++++++++++++ molecule/default/destroy.yml | 27 +++++++++++++++++++ molecule/default/molecule.yml | 36 +++++++++++++++++++++++++ molecule/default/prepare.yml | 12 +++++++++ molecule/default/requirements.yml | 4 +++ molecule/default/verify.yml | 29 ++++++++++++++++++++ 9 files changed, 185 insertions(+) create mode 100644 molecule/default/Dockerfile create mode 100644 molecule/default/collections.yml create mode 100644 molecule/default/converge.yml create mode 100644 molecule/default/create.yml create mode 100644 molecule/default/destroy.yml create mode 100644 molecule/default/molecule.yml create mode 100644 molecule/default/prepare.yml create mode 100644 molecule/default/requirements.yml create mode 100644 molecule/default/verify.yml diff --git a/molecule/default/Dockerfile b/molecule/default/Dockerfile new file mode 100644 index 0000000..a250dcc --- /dev/null +++ b/molecule/default/Dockerfile @@ -0,0 +1,17 @@ +ARG BASE_IMAGE +FROM ${BASE_IMAGE} + +ENV container=docker + +RUN if command -v pacman > /dev/null; then \ + pacman --sync --refresh --noconfirm systemd systemd-sysvcompat python; \ + elif command -v apt-get > /dev/null; then \ + apt-get update && \ + DEBIAN_FRONTEND=noninteractive apt-get install --yes systemd systemd-sysv python3 python3-apt; \ + else \ + dnf install --assumeyes systemd python3 python3-libdnf5 && \ + dnf clean all; \ + fi + +STOPSIGNAL SIGRTMIN+3 +CMD ["/sbin/init"] \ No newline at end of file diff --git a/molecule/default/collections.yml b/molecule/default/collections.yml new file mode 100644 index 0000000..d43570a --- /dev/null +++ b/molecule/default/collections.yml @@ -0,0 +1,4 @@ +--- + +collections: +- name: community.docker diff --git a/molecule/default/converge.yml b/molecule/default/converge.yml new file mode 100644 index 0000000..2067404 --- /dev/null +++ b/molecule/default/converge.yml @@ -0,0 +1,12 @@ +--- + +- name: Converge + hosts: all + vars: + bind9_systemd_dropin: | + [Service] + Environment=MOLECULE_BIND9_DROPIN=present + tasks: + - name: Include the role bind9 + ansible.builtin.include_role: + name: bind9 diff --git a/molecule/default/create.yml b/molecule/default/create.yml new file mode 100644 index 0000000..cf8ebc4 --- /dev/null +++ b/molecule/default/create.yml @@ -0,0 +1,44 @@ +--- + +- name: Create + hosts: localhost + gather_facts: false + tasks: + - name: Build systemd-enabled test images + community.docker.docker_image: + name: "bind9-molecule-{{ item.name }}:latest" + source: build + build: + path: "{{ molecule_scenario_directory }}" + args: + BASE_IMAGE: "{{ item.image }}" + loop: "{{ molecule_yml.platforms }}" + loop_control: + label: "{{ item.name }}" + + - name: Start a systemd container per platform + community.docker.docker_container: + name: "{{ item.name }}" + image: "bind9-molecule-{{ item.name }}:latest" + command: /sbin/init + state: started + privileged: true + cgroupns_mode: host + tmpfs: + - /run + - /run/lock + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:rw + loop: "{{ molecule_yml.platforms }}" + loop_control: + label: "{{ item.name }}" + + - name: Write the instance config + ansible.builtin.copy: + content: | + {% for platform in molecule_yml.platforms %} + - instance: {{ platform.name }} + connection: community.docker.docker + {% endfor %} + dest: "{{ molecule_instance_config }}" + mode: "0600" diff --git a/molecule/default/destroy.yml b/molecule/default/destroy.yml new file mode 100644 index 0000000..8fad8a4 --- /dev/null +++ b/molecule/default/destroy.yml @@ -0,0 +1,27 @@ +--- + +- name: Destroy + hosts: localhost + gather_facts: false + tasks: + - name: Remove the container of every platform + community.docker.docker_container: + name: "{{ item.name }}" + state: absent + loop: "{{ molecule_yml.platforms }}" + loop_control: + label: "{{ item.name }}" + + - name: Remove the test image of every platform + community.docker.docker_image: + name: "bind9-molecule-{{ item.name }}:latest" + state: absent + loop: "{{ molecule_yml.platforms }}" + loop_control: + label: "{{ item.name }}" + + - name: Empty the instance config + ansible.builtin.copy: + content: "[]" + dest: "{{ molecule_instance_config }}" + mode: "0600" diff --git a/molecule/default/molecule.yml b/molecule/default/molecule.yml new file mode 100644 index 0000000..702a590 --- /dev/null +++ b/molecule/default/molecule.yml @@ -0,0 +1,36 @@ +--- + +driver: + name: default + options: + managed: true + login_cmd_template: "docker exec --interactive --tty {instance} bash" + +platforms: +- name: bind9-archlinux + image: docker.io/library/archlinux:base +- name: bind9-debian + image: docker.io/library/debian:13 +- name: bind9-fedora + image: registry.fedoraproject.org/fedora:43 + +provisioner: + name: ansible + env: + ANSIBLE_ROLES_PATH: "${MOLECULE_PROJECT_DIRECTORY}/.." + config_options: + defaults: + interpreter_python: auto_silent + +scenario: + test_sequence: + - dependency + - cleanup + - destroy + - syntax + - create + - prepare + - converge + - verify + - cleanup + - destroy diff --git a/molecule/default/prepare.yml b/molecule/default/prepare.yml new file mode 100644 index 0000000..bcaaf97 --- /dev/null +++ b/molecule/default/prepare.yml @@ -0,0 +1,12 @@ +--- + +- name: Prepare + hosts: all + tasks: + - name: Create the parent directory for DNSSEC keys + ansible.builtin.file: + path: /var/named + owner: root + group: root + mode: "0755" + state: directory diff --git a/molecule/default/requirements.yml b/molecule/default/requirements.yml new file mode 100644 index 0000000..86b874d --- /dev/null +++ b/molecule/default/requirements.yml @@ -0,0 +1,4 @@ +--- + +# The role has no role dependencies, but molecule warns about the missing file. +roles: [] diff --git a/molecule/default/verify.yml b/molecule/default/verify.yml new file mode 100644 index 0000000..38a6cb8 --- /dev/null +++ b/molecule/default/verify.yml @@ -0,0 +1,29 @@ +--- + +- name: Verify + hosts: all + tasks: + - name: Validate the generated BIND configuration + ansible.builtin.command: + argv: + - named-checkconf + - "{{ '/etc/bind/named.conf' if ansible_facts['os_family'] == 'Debian' else '/etc/named.conf' }}" + changed_when: false + + - name: Gather service states + ansible.builtin.service_facts: + + - name: Assert that named is active + ansible.builtin.assert: + that: + - ansible_facts.services['named.service'].state == 'running' + + - name: Read the systemd drop-in + ansible.builtin.slurp: + src: /etc/systemd/system/named.service.d/override.conf + register: _bind9_systemd_dropin + + - name: Assert that the configured systemd drop-in was installed + ansible.builtin.assert: + that: + - "'Environment=MOLECULE_BIND9_DROPIN=present' in (_bind9_systemd_dropin.content | b64decode)"