Skip to content

Molecule Integration

Complete guide to using Testing Containers with Molecule for Ansible role testing.

Basic Molecule Configuration

molecule.yml

---
dependency:
  name: galaxy

driver:
  name: podman

platforms:
  - name: instance
    image: ghcr.io/jackaltx/testing-containers/debian-ssh:12
    privileged: true
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:rw
    command: /sbin/init
    pre_build_image: true

provisioner:
  name: ansible
  inventory:
    hosts:
      all:
        ansible_user: jackaltx
        ansible_ssh_private_key_file: ~/.ssh/id_ed25519

verifier:
  name: ansible

Multi-Distribution Testing

Test across all three distributions:

platforms:
  - name: debian-12
    image: ghcr.io/jackaltx/testing-containers/debian-ssh:12
    privileged: true
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:rw
    command: /sbin/init
    pre_build_image: true

  - name: rocky-9
    image: ghcr.io/jackaltx/testing-containers/rocky-ssh:9
    privileged: true
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:rw
    command: /sbin/init
    pre_build_image: true

  - name: ubuntu-24
    image: ghcr.io/jackaltx/testing-containers/ubuntu-ssh:24
    privileged: true
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:rw
    command: /sbin/init
    pre_build_image: true

provisioner:
  name: ansible
  inventory:
    hosts:
      all:
        ansible_user: jackaltx
        ansible_ssh_private_key_file: ~/.ssh/id_ed25519

Complete Role Example

# Create role
molecule init role my_role --driver-name podman

# Edit molecule/default/molecule.yml (use config above)

# Edit molecule/default/converge.yml
cat > molecule/default/converge.yml << 'EOF'
---
- name: Converge
  hosts: all
  become: true
  tasks:
    - name: Include role
      include_role:
        name: my_role
EOF

# Edit molecule/default/verify.yml
cat > molecule/default/verify.yml << 'EOF'
---
- name: Verify
  hosts: all
  tasks:
    - name: Check service is running
      service:
        name: myservice
        state: started
      register: result
      failed_when: result.failed
EOF

# Test
molecule test

CI/CD Integration

GitHub Actions

name: Molecule Test
on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        distro: [debian-ssh:12, rocky-ssh:9, ubuntu-ssh:24]

    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: '3.11'

      - name: Install Molecule
        run: pip install molecule molecule-plugins[podman] ansible

      - name: Run Molecule
        run: molecule test
        env:
          MOLECULE_DISTRO: ghcr.io/jackaltx/testing-containers/${{ matrix.distro }}

Common Patterns

Pattern 1: Service Testing

# molecule/default/verify.yml
---
- name: Verify
  hosts: all
  tasks:
    - name: Check service status
      systemd:
        name: nginx
        state: started
      register: result

    - name: Verify port listening
      wait_for:
        port: 80
        timeout: 10

Pattern 2: Package Installation

# molecule/default/verify.yml
---
- name: Verify
  hosts: all
  tasks:
    - name: Check package installed
      package:
        name: nginx
        state: present
      check_mode: yes
      register: result
      failed_when: result.changed

Pattern 3: Configuration Files

# molecule/default/verify.yml
---
- name: Verify
  hosts: all
  tasks:
    - name: Check config file exists
      stat:
        path: /etc/nginx/nginx.conf
      register: result
      failed_when: not result.stat.exists

    - name: Verify config content
      lineinfile:
        path: /etc/nginx/nginx.conf
        regexp: 'worker_processes'
        state: present
      check_mode: yes
      register: result
      failed_when: result.changed

Troubleshooting

Molecule Can't Connect

# Add to molecule.yml for debugging
provisioner:
  name: ansible
  inventory:
    hosts:
      all:
        ansible_user: jackaltx
        ansible_ssh_private_key_file: ~/.ssh/id_ed25519
        ansible_ssh_common_args: '-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null'
  options:
    vvv: true  # Verbose output

systemd Not Working in Container

Verify platform configuration:

platforms:
  - name: instance
    image: ghcr.io/jackaltx/testing-containers/debian-ssh:12
    privileged: true  # Required
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:rw  # Required
    command: /sbin/init  # Required
    cgroupns_mode: host  # Add if issues persist

Slow Convergence

Use pre_build_image: true:

platforms:
  - name: instance
    image: ghcr.io/jackaltx/testing-containers/debian-ssh:12
    pre_build_image: true  # Skip build step