Role Dependency Not Being Executed

192 views
Skip to first unread message

Jamal B

unread,
Dec 6, 2014, 1:17:09 PM12/6/14
to ansible...@googlegroups.com
Hi I have run into an issue where I'm not sure if it's a bug in Ansible or just my lack of understand how roles are activated. Using Ansible 1.7.2,  I have a playbook defined as such:

app/site.yml
app/roles/core/tasks/main.yml
app/roles/app-common/tasks/main.yml
app/roles/app-compA/meta/main.yml  -> contains a dependency on app-common
app/roles/app-compA/tasks/main.yml
app/roles/app-compB/meta/main.yml -> contains a dependency on app-common
app/roles/app-compB/tasks/main.yml
 
Where site.yml activates roles like such:

- hosts: all
  vars:
   home: /usr/local/app
   release: "{{ lookup('env','RELEASE') }}"
   group: "{{ lookup('env','GROUP') }}"
    
  roles:
  - core
  
  # Component Specific Stuff
  - { role: app-compA, when: group== 'compA' }
  - { role: app-compB, when: group== 'compB' }


When I run the playbook like so:
export GROUP=compA
ansible-playbook site.yml -c local

The roles core, app-common & app-compA execute like expected.

However when I run the playbook like so:
export GROUP=compB
ansible-playbook site.yml -c local

Only the roles core and app-compB are executed and the app-common role is not executed.  Shouldn't the app-common role also be executed in this case?   Is this a bug or have I mis-understood how roles are executed when role dependencies exists?  My intent was to minimize the duplication of the tasks defined in app-common that are required by the app-compA & app-compB roles, so if there is another way to do this I'm all ears.

Thanks

Michael DeHaan

unread,
Dec 7, 2014, 4:38:54 PM12/7/14
to ansible...@googlegroups.com
Hard to see with the way it's written above, do you perhaps have a bare-minimum repo to share?



--
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-proje...@googlegroups.com.
To post to this group, send email to ansible...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/3754460d-d331-4f22-bc8c-318abf8a7d7c%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Jamal B

unread,
Dec 8, 2014, 9:03:44 AM12/8/14
to ansible...@googlegroups.com
Here you go.


My test env:
root@01e437db9a4c:/role-execution# ansible --version
ansible 1.7.2

root@01e437db9a4c:/role-execution# export GROUP=compA
root@01e437db9a4c:/role-execution# ansible-playbook site.yml -c local

PLAY [all] ********************************************************************

GATHERING FACTS ***************************************************************
ok: [127.0.0.1]

TASK: [core | Do some common work] ********************************************
ok: [127.0.0.1] => {
    "msg": "Did some common work."
}

TASK: [app-common | Do some app-common work] **********************************
ok: [127.0.0.1] => {
    "msg": "Did some app-common work."
}

TASK: [app-compA | Do some app-compA work] ************************************
ok: [127.0.0.1] => {
    "msg": "Did some app-compA work."
}

TASK: [app-compB | Do some app-compB work] ************************************
skipping: [127.0.0.1]

PLAY RECAP ********************************************************************
127.0.0.1                  : ok=4    changed=0    unreachable=0    failed=0



root@01e437db9a4c:/role-execution# export GROUP=compB
root@01e437db9a4c:/role-execution# ansible-playbook site.yml -c local

PLAY [all] ********************************************************************

GATHERING FACTS ***************************************************************
ok: [127.0.0.1]

TASK: [core | Do some common work] ********************************************
ok: [127.0.0.1] => {
    "msg": "Did some common work."
}

TASK: [app-common | Do some app-common work] **********************************
skipping: [127.0.0.1]

TASK: [app-compA | Do some app-compA work] ************************************
skipping: [127.0.0.1]

TASK: [app-compB | Do some app-compB work] ************************************
ok: [127.0.0.1] => {
    "msg": "Did some app-compB work."
}

PLAY RECAP ********************************************************************
127.0.0.1                  : ok=3    changed=0    unreachable=0    failed=0

James Cammarata

unread,
Dec 8, 2014, 11:47:36 AM12/8/14
to ansible...@googlegroups.com
Hi Jamal,

We actually have an open issue for this currently: https://github.com/ansible/ansible/issues/9292. For now the work-around is to avoid the "diamond" pattern for roles, where the dependent roles with multiple parents use conditionals or tags.

Thanks!

Jamal B

unread,
Dec 8, 2014, 1:08:13 PM12/8/14
to ansible...@googlegroups.com
Ok.

Thanks

Jamal B

unread,
Dec 9, 2014, 5:03:44 PM12/9/14
to ansible...@googlegroups.com
Is it possible to use multiple conditions to activate a role?  

e.g.)
 - { role: app-compA, when: group== 'compA'  or group== 'compB' }

On Monday, December 8, 2014 11:47:36 AM UTC-5, James Cammarata wrote:

Toshio Kuratomi

unread,
Dec 9, 2014, 6:25:16 PM12/9/14
to ansible...@googlegroups.com
It should, yes. I just tested in your sample repo -- removing the
dependencies for compA and compB and then adding a new role for
app-common:

- { role: app-common, when: group == 'compA' or group == 'compB' }

Worked as I expected; app-common was run when GROUP was either compA
or compB but was skipped for other values of GROUP.

-Toshio
> https://groups.google.com/d/msgid/ansible-project/ee5ec7ee-daaa-47d7-be51-3da5aebd66e3%40googlegroups.com.

Jamal B

unread,
Dec 10, 2014, 9:33:10 AM12/10/14
to ansible...@googlegroups.com
Yeah, I realized that I could try it shortly after firing off this email.

Thanks
Reply all
Reply to author
Forward
0 new messages