How to see roles search path?

25 views
Skip to first unread message

Karl Auer

unread,
Apr 24, 2018, 4:18:22 PM4/24/18
to Ansible Project
Is there any way to output the roles_path in a task (not the specific path to a role, I mean the search path)?

The doco for Ansible 2.5 says that roles are found in the ./roles directory relative to the playbook file, and in /etc/ansible/roles.

"ansible-config list" says that roles are also found in ~/.ansible/roles, /usr/share/ansible/roles and /etc/ansible/roles - the first two are not mentioned in the doco.

It seems to me from my testing that roles are also found in the current working directory, and in the playbooks directory.

I have a role called other_role (i.e., a directory called other_role, containing a tasks directory containing main.yaml) in /tmp.

As a control, I have another role called local_role in ./playbooks/roles

Finally I have an extremely simple playbook in ./playbooks that references the roles:

---
- hosts: localhost

  roles:
     - { role: local_role }
     - { role: other_role }

If I place other_role in my ./playbooks/roles directory:

   mv /tmp/other_role ./playbooks/roles
   ansible-playbook -v playbooks/test.yaml  --> both roles run
 
If I place other_role in my ./playbooks directory:

   mv ./playbooks/roles/other_role ./playbooks
   ansible-playbook -v playbooks/test.yaml  --> both roles run

If I place other_role in my current working directory (my playbook directory's parent) :

   mv ./playbooks/other_role .
   ansible-playbook -v playbooks/test.yaml  --> both roles run

If I place other_role in /etc/ansible/roles:

   sudo mv ./other_role /etc/ansible/roles
   ansible-playbook -v playbooks/test.yaml  --> both roles run

If I place other_role back in the /tmp directory (or anywhere else except the above four locations), running the playbook produces a "role not found" error:

   mv ./other_role /tmp

so it seems to me that the search path for roles contains at least these four locations:

- the current working directory
- the directory containing the playbook
- the roles directory relative to the directory containing the playbook
- /etc/ansible/roles

Plus the other two that ansible-config reports (that I didn't test):
- ~/.ansible/roles
- /usr/share/ansible/roles

Is all this expected? In what order are these locations checked when a role is referenced?

Regards, K.

Brian Coca

unread,
Apr 24, 2018, 4:25:40 PM4/24/18
to Ansible Project
You can use `lookup('config', 'DEFAULT_ROLES_PATH')`to get the
configured ones, but that won't include the adjacent to playbook, but
{{playbook_dir}}/roles would give you that.


--
----------
Brian Coca

Karl Auer

unread,
Apr 24, 2018, 7:43:36 PM4/24/18
to ansible...@googlegroups.com
Thanks, Brian.

It's disappointing not to be able to get the actual search path. This means that the doc is wrong (or at least incomplete), so one has to "just know" that a role can also be in the current working directory, in the playbook directory, and in two other secret locations - as well as the documented ones.

The reason I was looking for this information is that I need to add a path to the roles search path. I began an experiment to see if the ansible.cfg "roles_path" variable would be added to or override the defaults. I still haven't done that experiment, because I got distracted by the question of how to locate the search path at all :-)

I discovered the playbook directory component because I initially moved my test role there (out of the ./playbook/roles directory) thinking that would prevent it from being found, and was surprised to see it still ran... so I moved it up to my current working directory (above the playbooks directory) and was surprised again to see that it STILL ran!

IMHO a way to see the *actual* search path, rather than just the default or configured parts of it, would be useful.

Regards, K.




--
----------
Brian Coca

--
You received this message because you are subscribed to the Google Groups "Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ansible-project+unsubscribe@googlegroups.com.
To post to this group, send email to ansible-project@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/CACVha7fyjNxNuk0hua81ztWzdeyJKdZLea%2B6UgCKDX_POQe%3DRg%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.



--
Karl Auer

Email  : ka...@2pisoftware.com
Website: 
http://2pisoftware.com

GPG/PGP : 958A 2647 6C44 D376 3D63 86A5 FFB2 20BC 0257 5816
Previous: F0AB 6C70 A49D 1927 6E05 81E7 AD95 268F 2AB6 40EA

Karl Auer

unread,
Apr 24, 2018, 7:52:33 PM4/24/18
to Ansible Project
I should mention that the complete path with all components does show up in the error message when a role is missing :-)

Regards, K.

Brian Coca

unread,
Apr 25, 2018, 6:01:46 PM4/25/18
to Ansible Project
FYI, cwd is not in the searchpath, its relative to the playbook, not
the cwd. I did give you the way to get the full list, just need to
consult 2 variables.


--
----------
Brian Coca

Karl Auer

unread,
Apr 25, 2018, 7:02:49 PM4/25/18
to ansible...@googlegroups.com
Thanks, Brian.

You are right; I conflated two results. I just re-tested that aspect; a role will not be found merely because it is in the CWD.

Regards, K.




--
----------
Brian Coca

--
You received this message because you are subscribed to the Google Groups "Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ansible-project+unsubscribe@googlegroups.com.
To post to this group, send email to ansible-project@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

Karl Auer

unread,
Apr 25, 2018, 7:16:03 PM4/25/18
to Ansible Project
I spoke too soon.

A role placed in the current working directory WILL be located and run, even if it is not explicitly in the default roles path NOR in the roles_path defined in ansible.cfg.

This is with Ansible 2.5.1. Try it...

Regards, K.

Brian Coca

unread,
Apr 25, 2018, 8:53:12 PM4/25/18
to Ansible Project
I cannot reproduce, i only get roles/ from cwd if I cd to the play
directory and it has an adjacent roles/.

But that is not that it searches cwd, it just happens to coincide with
the play's directory.





--
----------
Brian Coca

Karl Auer

unread,
Apr 26, 2018, 1:49:25 AM4/26/18
to Ansible Project
I've just done some testing, and a role in the current working directory WILL be used, but only if the role cannot be found elsewhere. This is with Ubuntu 16.04 and Ansible 2.5.1.

I haven't worked out  the precedence yet, but it appears to be :

- the roles directory below the directory containing the playbook
- the elements of roles_path from left to right (two elements in my case)
   OR
- the elements of the DEFAULT_ROLES_PATH from left to right (three elements)
- the directory the playbook is in

- the current working directory

To test this, I put a test role in each of the eight possible locations (my CWD test was from /tmp) then renamed them all so that the playbook would be unable to find them. I then ran the playbook and got the expected failure to find the role. Then I renamed the role in each of the locations in turn, to the name expected by the playbook, checked that the playbook could find it, then renamed it away again.

One surprise was that although the comment in the distributed ansible.cfg says that the roles_path variable is for "additional paths to search for roles in", in fact roles_path will, if specified, REPLACE the defaults.

On my system the default role paths (i.e., with no roles_path specified in ansible.cfg) are ~/.ansible/roles, /usr/share/ansible/roles, and /etc/ansible/roles.


Regards, K.


On Wednesday, April 25, 2018 at 6:18:22 AM UTC+10, Karl Auer wrote:

Karl Auer

unread,
Apr 26, 2018, 1:52:11 AM4/26/18
to ansible...@googlegroups.com
Sorry, that OR in the precedence applies only to the one item above and the one item below it.

--
You received this message because you are subscribed to the Google Groups "Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ansible-project+unsubscribe@googlegroups.com.
To post to this group, send email to ansible-project@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.
Reply all
Reply to author
Forward
0 new messages