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: