Molecule
"Molecule is designed to aid in the development and testing of Ansible roles." - https://molecule.readthedocs.io
Examples
Initialize a new role to be tested in docker
molecule init role ansible-role-whatever --driver-name docker
The above command creates the following directory structure with boilerplate filled in, similar to what you'd expect from cookiecutter.
ansible-role-whatever/.travis.yml
ansible-role-whatever/.yamllint
ansible-role-whatever/README.md
ansible-role-whatever/defaults/main.yml
ansible-role-whatever/handlers/main.yml
ansible-role-whatever/meta/main.yml
ansible-role-whatever/molecule/default/INSTALL.rst
ansible-role-whatever/molecule/default/converge.yml
ansible-role-whatever/molecule/default/molecule.yml
ansible-role-whatever/molecule/default/verify.yml
ansible-role-whatever/tasks/main.yml
ansible-role-whatever/tests/inventory
ansible-role-whatever/tests/test.yml
ansible-role-whatever/vars/main.yml
Note: in newer versions of molecule this command is not available. It was deliberately removed because it can also be done in ansible-galaxy role init blah
, though this doesn't cover the molecule test aspects, which need to be done with molecule init scenario
.
Profile a molecule run
Profiling molecule itself
This profiles the molecule run, but not everything is shown due to not everything being python native.
$ python3 -m cProfile -o ansible-run.cprofile $(which molecule) test
...normal molecule output scrolls by...
$ python3 -m pstats ansible-run.cprofile
Welcome to the profile statistics browser.
ansible-run.cprofile% sort cumulative
ansible-run.cprofile% stats 20
Mon Jan 13 08:56:45 2020 ansible-run.cprofile
1782927 function calls (1731081 primitive calls) in 145.057 seconds
Ordered by: cumulative time
List reduced from 6303 to 20 due to restriction <20>
ncalls tottime percall cumtime percall filename:lineno(function)
1247/1 0.005 0.000 145.060 145.060 {built-in method builtins.exec}
1 0.000 0.000 145.060 145.060 /Users/daniel.hoherd/Library/Python/3.7/bin/molecule:3(<module>)
1 0.000 0.000 144.267 144.267 /Users/daniel.hoherd/Library/Python/3.7/lib/python/site-packages/click/core.py:762(__call__)
...
Profiling testinfra runs
Install pytest-profiling, which adds the --profile
flag needed in the next step
pip3 install --user pytest-profiling
Then set up your molecule/scenario/molecule.yml
file with the following env
contents:
verifier:
name: testinfra
env:
PYTEST_ADDOPTS: "--profile"
See Also
Links
- Ansible Tests with Molecule - https://ansible.readthedocs.io/projects/molecule/ / https://www.digitalocean.com/community/tutorials/how-to-test-ansible-roles-with-molecule
- Molecule sequence of scenario events - https://ansible.readthedocs.io/projects/molecule/configuration/?h=scenario#scenario