common file dependencies for roles

Hi,

I’m wondering if anyone knows of any tricks for neatly handling common file dependencies for roles. I initially thought having a common dependent role in meta/main.yml would facilitate this but apparently dependencies don’t apply to files (which does make sense if roles are though of as totally isolated), but is there some way to achieve this? Or is there some way to specify search paths for files inside a role or something?

So far the best I’ve come up with is putting a files and/or templates directory in the root of the ansible directory and then referencing files/templates with src=file/myfile.txt and/or src=templates/mytemplate.txt (I’ve also seen the recommendation to use src={{ inventory_dir }}/files/myfile.txt but that doesn’t seem necessary). The problem with this is that it doesn’t really organise dependencies for roles but rather just lumps everything into one directory and makes it difficult to share roles externally.

Alternatively, is there some way to specify multiple task files in a role so that all other components can be shared, i.e. something like the following (or Chef cookbook recipes really)

  • name: myplay
    roles:
  • myrole.create (roles/myrole/tasks/create.yml)
  • myrole (roles/myrole/tasks/main.yml)
  • myrole.delete (roles/myrole/tasks/delete.yml)

Regards,
Yoshi

Hi,

I would try to get paths for files into variables in meta roles and export it as facts:

defaults/main.yml:
rolename_path: {{ role_path }}

tasks/main.yml:

  • set_fact: rolename_path={{ rolename_path }}

And that use this variable to get file:
{{ rolepath_name + ‘files/filename.txt’ }}

Could work.

Thanks David,

That’s quite a reasonable solution actually, for one it works but also it makes you consider naming conventions for the facts and dependencies that will use it.

I had to quote the {{ role_path }} in defaults/main.yml for it to work for me.

So variables defined in defaults/main.yml are scoped only for the execution of tasks in that role?

Regards,
Yoshi

Hi Yoshi,

role variables are accessible only in roles, thats why create a fact that is accessible to host (and thru hostvars from other hosts if needed). Personally I always scope role variables with role name, easier for me to read host_vars/ group_vars files.

Many thanks