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)
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 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.