Including roles dynamically make dependencies runs multiple time

Hello everyone,

(this is my first post BTW, I’ll try to be as clear as possible)

I want to include roles dynamically using this bit of code in my playbook.yml :

`
tasks:

  • name: “Including roles dynamically”
    remote_user: “{{ target_user }}”
    include_role:
    name: “{{ item }}”
    with_items: “{{ roles_to_install | unique }}”
    `

I have roles like following:
common

role1 → common
role2 → role1

My goal is to always include every role (but I also have another use case where I want to specify which roles will be included).

And using this method, if I try with roles_to_install = [‘role1’, ‘role2’]
These roles will be included :

  • role 2 : 1 time

  • role 1 : 2 times

  • common : 3 times

I searched through issues posted on git repo, I found some which may seem duplicates for me, but no solution was provided. (24326, 47374 ).

ansible --version: 2.7.10

I also tried with allow_duplicates: no but the problem is not related to role inclusion, but to the dependency inclusion.

Do you have an idea of what I could have forgotten? Maybe there is another way of treating the problem?

Thank you for your time,
If you need information I forgot, I’ll be glad to add them

I’m not sure if it’s the best way, but when including roles I’ll do something like:

  • name: Include Some Role if Necessary
    include_role:
    name: some_role
    when: SOME_ROLE_RUN is not defined

Then as the last task in “some_role” I’ll have a task like this:

  • set_fact:
    SOME_ROLE_RUN: True

–Steve

Thank you for your answer Steve.

I have tried you proposition, it is working as expected, dependencies are now imported only once.

But still, I’m looking for a cleaner approach (if possible). Besides, I have some problems with this solution :

  • There is noise in the logs (with all the “skipping” tasks between rightful imports)

  • The intensive use of “set_fact” could become a source of problem later, with name collision etc…

  • I want to create a project that could be forked by other users, for them to add their roles. And I wanted to limit constraint for them to be integrated in my project.

Thank you again for your help, I’ll try to find something, and if I can’t I’ll use your proposition