we have a playbook with several roles in it:
roles:
role1
role2
role3
role4
role5
roleX
…
These roles install some software but each checks at the very begin if the software is already installed
and if it is - it aborts (using fail module). It turns out that i.e. if the role3 fails (because its software is already installed)
the whole playbook also failes (ansible 1.7.1). Is it possible to abort just particular role
and let run the rest of the playbook ?
we have a playbook with several roles in it:
roles:
- role1
- role2
- role3
- role4
- role5
- roleX
...
These roles install some software but each checks at the very begin if the
software is already installed
and if it is - it aborts (using fail module). It turns out that i.e. if the
role3 fails (because its software is already installed)
the whole playbook also failes (ansible 1.7.1).
This is the expected behaviour. A failure is a failure...
Is it possible to abort just particular role
and let run the rest of the playbook ?
I would recommend changing the roles so that installation of new
software is skipped (instead of failing) when the software is already
present...
we have a playbook with several roles in it:
roles:
role1
role2
role3
role4
role5
roleX
…
These roles install some software but each checks at the very begin if the
software is already installed
and if it is - it aborts (using fail module). It turns out that i.e. if the
role3 fails (because its software is already installed)
the whole playbook also failes (ansible 1.7.1).
This is the expected behaviour. A failure is a failure…
Why ?!?! I use fail module in a role so the role should fail and not the whole playbook.
Is it possible to abort just particular role
and let run the rest of the playbook ?
I would recommend changing the roles so that installation of new
software is skipped (instead of failing) when the software is already
present…
What do you mean by “skipped” ? If I check at the top of a role that the software is installed
how can I skip the rest of role ?
You will need to handle failures and skipping on a per-task basis - that logic does not exist at the role level.
As Karl noted, you should not use the fail module in this case. With Ansible (and just about every other configuration management system out there now), you define the state of the system as you want it to be, and Ansible will make the changes required to bring your system to that state. The fact that the software is already installed means your system is in the state expected, which is not a failure.
You could add a 'when:' clause in the tasks following the software installation task to prevent them from running when the software is already installed. The software installation task will need to set a 'register:' clause with the result which can then be used by the 'when:' clause in the following tasks.
I used fail module because I cannot find anything else.
All I need is to check if something exists and if does skip the rest of role.
Currently if I want to skip all the rest 30 tasks I need to repeat 30 lines of:
when: something is not defined or exists or whatever …
It would be good to have something really simple like that:
abort_role:
when: condition is met
I use it in my playbooks but when a role has many, many tasks you need to repeat
the same “when:” line in every task which is not very handy.
Also in more complicated cases your ansible code will go very unreadable.
Imagine you are going to install software related to hardware.
You don’t need to install it under VM. So the most intuitive way
(at least for me ) would be:
if this is VM:
abort role
if the software is installed:
abort role
install software
…
I used this syntax in my playbooks. But when you have to check several different conditions (and it’s not only about
installing software !) the “when:” becomes quite complicated. And I still think that simple kind of “abort_role”
would make a code (especially in bigger playbooks/roles) much, much cleaner.
Anyway - thanks James - now I know I have no other options and have to stick with your way
of doing it.
Thanks again