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:
>
> 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.
>
--
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 [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/ansible-project/19adfdd8-d595-4166-8db1-736f68cc913c%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.