Include_roles with block/always(rescue)

Hi guys,

I have 3 roles:

  • role A: which needs to be executed on localhost
  • role B: which needs to run on a remote host
  • role C: which is a rescue role that cleans up some things which role A did on localhost (this one should always run, especially if some task failed in one of the other roles)

How could I achieve this?

The closest I’ve been was something like:


- hosts: all
tasks:
- block:

- include_role:
name: role A
- include_role:
name: role B
always:
- include_role:
name: role C

but this of course has no posibilty of changing the hosts against which it is run (‘localhost’ is not ‘all’ being the problem)

This is one play.
Add separate plays for localhost etc.

Hi Dick,

True, that’s a single play. But how could I achieve the block/always behavior with separate plays per host? The inventory is dynamically loaded, not an issue, but I don’t know how to make sure that role C is executed on localhost no matter what.

This might work:

Hey Dick,

This seems to be exactly what I need, thanks a lot!

Right now I’m having issues on a different point:

- hosts: all
tasks:
- name: Role A
block:
- name: Do A
include_role:
name: roleA
apply:
delegate_to:
localhost
- name: Refresh Inventory
meta: refresh_inventory
- name: Do remote Role B
include_role:
name: roleB
always:
- name: Clean up
include_role:
name: roleC

I have a custom inventory plugin which needs to be refreshed after role A. It seems though that the meta action interrupts execution there, not even the always block getting executed anymore. I’m opening an issue with Ansible on this.