How to see roles search path?

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:

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.

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 :slight_smile:

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.

I should mention that the complete path with all components does show up in the error message when a role is missing :slight_smile:

Regards, K.

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.

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.

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.

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.

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.

Sorry, that OR in the precedence applies only to the one item above and the one item below it.