The Problem
Your Ansible role's Molecule tests fail:
ERROR: Container creation failed: docker: Error response from daemon: conflictOr:
ERROR: Scenario 'default' failed: ansible-playbook returned non-zero exit codeOr testinfra verification fails:
FAILED test_myrole.py::test_config_file - AssertionError: File /etc/myapp.conf does not existWhy This Happens
Molecule test failures stem from:
Docker/container issues - Container driver can't create or connect to containers.
Playbook errors in test - Converge playbook has syntax or runtime errors.
Testinfra test failures - Verification tests don't match actual state.
Scenario configuration - molecule.yml has wrong driver or platform settings.
Dependency issues - Role dependencies not installed for tests.
Diagnosing the Issue
Run Molecule with verbose output:
molecule test -vvvCheck specific stages:
molecule create -vv # Container creation
molecule converge -vv # Playbook execution
molecule verify -vv # Testinfra testsCheck container status:
molecule list
docker ps -aInspect molecule.yml:
cat molecule/default/molecule.ymlThe Fix
Fix 1: Fix Docker Driver Issues
Ensure Docker is running:
docker info
docker psPull required images:
docker pull geerlingguy/docker-ubuntu2004-ansible:latest
docker pull geerlingguy/docker-centos8-ansible:latestConfigure molecule.yml properly:
```yaml # molecule/default/molecule.yml driver: name: docker platforms: - name: ubuntu-instance image: geerlingguy/docker-ubuntu2004-ansible:latest pre_build_image: true privileged: true volumes: - /sys/fs/cgroup:/sys/fs/cgroup:ro
- name: centos-instance
- image: geerlingguy/docker-centos8-ansible:latest
- pre_build_image: true
- privileged: true
- volumes:
- - /sys/fs/cgroup:/sys/fs/cgroup:ro
`
Clean up containers:
molecule destroy
docker container pruneFix 2: Fix Converge Playbook Errors
Check converge playbook:
# molecule/default/converge.yml
- name: Converge
hosts: all
become: true
vars:
# Define required variables
myapp_port: 8080
roles:
- role: myrole
# Pass required variablesTest converge separately:
molecule create
molecule converge -vvCheck syntax:
ansible-playbook molecule/default/converge.yml --syntax-checkFix 3: Fix Testinfra Verification Tests
Check test file:
```python # molecule/default/tests/test_myrole.py import os import testinfra.utils.ansible_runner
testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner( os.environ['MOLECULE_INVENTORY_FILE'] ).get_hosts('all')
def test_package_installed(host): pkg = host.package('nginx') assert pkg.is_installed
def test_service_running(host): svc = host.service('nginx') assert svc.is_running assert svc.is_enabled
def test_config_file(host): f = host.file('/etc/nginx/nginx.conf') assert f.exists assert f.is_file assert f.contains('worker_processes') ```
Run tests separately:
molecule verify -vvUse correct assertions:
```python # Common assertions def test_file_exists(host): f = host.file('/path/to/file') assert f.exists assert f.is_file assert f.mode == 0o644 # Note: octal
def test_service(host): s = host.service('servicename') assert s.is_running assert s.is_enabled
def test_package(host): p = host.package('pkgname') assert p.is_installed assert p.version.startswith('1.')
def test_command(host): cmd = host.run('mycommand') assert cmd.rc == 0 assert 'expected output' in cmd.stdout
def test_user(host): u = host.user('myuser') assert u.exists assert u.group == 'mygroup' assert u.home == '/home/myuser' ```
Fix 4: Configure Multiple Scenarios
Create scenario-specific configurations:
molecule init scenario centos
molecule init scenario ubuntuDirectory structure:
molecule/
default/
molecule.yml
converge.yml
verify.yml
centos/
molecule.yml
converge.yml
verify.ymlRun specific scenario:
molecule test -s centos
molecule test -s defaultFix 5: Handle Role Dependencies
Install dependencies for tests:
# molecule/default/create.yml
- name: Create
hosts: localhost
tasks:
- name: Install dependencies
command: ansible-galaxy install -r requirements.ymlOr in molecule.yml:
provisioner:
name: ansible
config_options:
defaults:
roles_path: ../../
inventory:
hosts:
all:
vars:
required_var: value
playbooks:
converge: converge.yml
verify: verify.ymlFix 6: Fix Privilege Issues
Configure become properly:
# molecule.yml
platforms:
- name: instance
image: geerlingguy/docker-ubuntu2004-ansible
privileged: true # Required for systemd services
command: /sbin/init
tmpfs:
- /run
- /tmp
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:roIn converge.yml:
- name: Converge
hosts: all
become: true
roles:
- myroleFix 7: Use Alternative Drivers
For Podman instead of Docker:
driver:
name: podman
platforms:
- name: instance
image: docker.io/geerlingguy/docker-ubuntu2004-ansible
privileged: trueFor Vagrant:
driver:
name: vagrant
provider:
name: virtualbox
platforms:
- name: instance
box: ubuntu/focal64
memory: 1024
cpus: 1Install driver dependencies:
pip install molecule-docker
pip install molecule-podman
pip install molecule-vagrantFix 8: Debug Testinfra Tests
Run testinfra directly:
```bash # Inside container pytest molecule/default/tests/ -v
# From host molecule verify --debug ```
Debug specific test:
```python def test_debug(host): # Print facts print(host.system_info.type) print(host.system_info.release)
# Print file contents f = host.file('/etc/myapp.conf') print(f.content_string)
# Check multiple conditions assert True # Placeholder for debugging ```
Fix 9: Fix Sidecar Issues
For roles needing external services:
```yaml # molecule.yml platforms: - name: application image: geerlingguy/docker-ubuntu2004-ansible groups: - app links: - database:db
- name: database
- image: geerlingguy/docker-centos8-ansible
- groups:
- - db
`
Test connectivity between containers:
def test_db_connection(host):
cmd = host.run('ping -c 1 db')
assert cmd.rc == 0Verifying the Fix
Run full test cycle:
molecule testExpected output:
``
--> Test matrix
│ └── default
├── Scenario default
│ ├── Destroy
│ ├── Create
│ ├── Converge
│ ├── Verify
│ └── Destroy
--> Completed test matrix
Check specific stages:
molecule create
molecule list
molecule converge
molecule verify
molecule destroyPrevention
Add Molecule to CI/CD:
# .github/workflows/molecule.yml
name: Molecule Test
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.9'
- name: Install dependencies
run: |
pip install molecule molecule-docker
pip install -r requirements.txt
- name: Run Molecule tests
run: molecule testInitialize role with Molecule:
molecule init role myrole