Molecule 4.0.4 - ANSIBLE_ROLES_PATH and ANSIBLE_COLLECTIONS_PATH no more handled
Tcharl opened this issue · 7 comments
Issue Type
`molecule converged not take environment variables into account.
previously
provisioner:
name: ansible
env:
ANSIBLE_ROLES_PATH: "${MOLECULE_PROJECT_DIRECTORY}/..:${MOLECULE_PROJECT_DIRECTORY}/../community:${ANSIBLE_ROLES_PATH}"
ANSIBLE_COLLECTIONS_PATH: "${MOLECULE_PROJECT_DIRECTORY}/../community-collections:${ANSIBLE_COLLECTIONS_PATH}"
Was working accordingly (in a mono repo environments, updates were taken 'live').
Which is no more the situation with 4.0.4.
Molecule and Ansible details
ansible --version && molecule --version
molecule 4.0.4 using python 3.10
ansible:2.14.4
delegated:4.0.4 from molecule
vagrant:2.0.0 from molecule_vagrant
Molecule installation method (one of):
- pip
Ansible installation method (one of):
- pip
Detail any linters or test runners used:
Desired Behavior
Using
ANSIBLE_ROLES_PATH: "${MOLECULE_PROJECT_DIRECTORY}/..:...
Let roles that are located in the same parent folder to be resolved instead of the remote dependency, which is useful when implementing a big chain of dependent roles (avoid tagging the dependency, ansible-galaxy referencing, ...).
Is it possible to get the same behavior (another way), or to support the feature again?
Actual Behavior
INFO Set ANSIBLE_LIBRARY=/Users/charliemordant/.cache/ansible-compat/44ddf8/modules:/Users/charliemordant/.ansible/plugins/modules:/usr/share/ansible/plugins/modules
INFO Set ANSIBLE_COLLECTIONS_PATH=/Users/charliemordant/.cache/ansible-compat/44ddf8/collections:/Users/charliemordant/.ansible/collections:/usr/share/ansible/collections
INFO Set ANSIBLE_ROLES_PATH=/Users/charliemordant/.cache/ansible-compat/44ddf8/roles:/Users/charliemordant/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles
Thanks for reporting this issue.
If I understand it correctly, the X-problem is to share the dependency and the Y-problem is to support ANSIBLE_ROLES_PATH environment variable.
I'll take a look at this issue.
Is this maybe related to my problem that Ansible / Molecule is failing to find the role in the project directory?
- Here is the project: https://github.com/trallnag/ansible-role-awscli
- Here example workflow run job that fails: https://github.com/trallnag/ansible-role-awscli/actions/runs/4789880064/jobs/8518273091
Error log:
ERROR! the role 'trallnag.awscli' was not found in /home/runner/work/ansible-role-awscli/ansible-role-awscli/molecule/default/roles:/home/runner/.cache/ansible-compat/52a4ae/roles:/home/runner/.cache/molecule/ansible-role-awscli/default/roles:/home/runner/work/ansible-role-awscli:/home/runner/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles:/home/runner/work/ansible-role-awscli/ansible-role-awscli/molecule/default
The error appears to be in '/home/runner/work/ansible-role-awscli/ansible-role-awscli/molecule/default/converge.yml': line 15, column 15, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
ansible.builtin.include_role:
name: trallnag.awscli
^ here
It is the same locally. It only works when I install the role locally into ~/.cache/ansible-compat/52a4ae/roles
. But shouldn't it detect the project role automatically?
I tried setting
provisioner:
name: ansible
ANSIBLE_ROLES_PATH: "../../"
But this did not help.
ansible~=7.4
molecule~=5.0
molecule-plugins[docker]~=23.4
docker~=6.0
Maybe related: #3806
I ended up using these variable as a prefix of the command (and ensure that it's systematic through tox) and creating two different requirements.yml files: local
and standalone
so that I don't import my local roles in cache.
Not optimal but works :-).
Will publish a sample repo soon (while I'll get something acceptable to be public)
What I don't understand why it works for some people / repositories without specification of ANSIBLE_ROLES_PATH
anywhere. For example here: https://github.com/geerlingguy/ansible-role-apache
I found it out. Molecule does not consider .yaml
. It only looks for .yml
.
Now the collections and roles would all be installed in the default directory(~/.ansible/collections and ~/.ansible/roles), which is shipped via isolated=False
You don't need to define ANSIBLE_COLLECTIONS_PATH
and ANSIBLE_ROLES_PATH
explicitly.
Could you verify whether it works?
Hi @zhan9san , and thanks for your help, I whish I knew python and its ecosystem better ^^
It doesn't answer to the use case, see for example https://github.com/OsgiliathEnterprise/servicemesh.
I typically rely on roles only (I do not use collection at all, overkill/not really fitting with the use case).
I try to make all my roles atomic as possible: example role_nginx
, role_virtualhost
.
And I usually use a 'monorepo' approach locally:
workspace_root
|_role_nginx
|_role_virtualhost
When I code the higher-level role (the role_virtualhost
here), I usually also adapt the roles in dependency to enhance it.
I also want speed while doing it, so want to avoid releasing my modifications on the child role to galaxy (role_nginx
) to test my parent role (role_virtualhost
) with molecule, taking into account the modifications made on the child (that aren't released, neither gitted yet). I also don't want to test my child role with molecule (sometimes it's not worth to molecule everything).
I used to play with these variables in the molecule.yml file to let it work this way, and now forced to use another framework (tox) to inject these variable at execution