How to abort just one role and let the others run

2,915 views
Skip to first unread message

P

unread,
Sep 17, 2014, 4:22:51 AM9/17/14
to ansible...@googlegroups.com
Hi all,

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 ?

Karl E. Jorgensen

unread,
Sep 17, 2014, 8:09:01 AM9/17/14
to ansible...@googlegroups.com
Hi

On Wed, Sep 17, 2014 at 01:22:51AM -0700, P wrote:
> Hi all,
>
> 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...

--
Karl E. Jorgensen

P

unread,
Sep 17, 2014, 8:15:57 AM9/17/14
to ansible...@googlegroups.com


On Wednesday, September 17, 2014 1:09:01 PM UTC+1, Karl Jorgensen wrote:
Hi

On Wed, Sep 17, 2014 at 01:22:51AM -0700, P wrote:
> Hi all,
>
> 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 ?

James Cammarata

unread,
Sep 17, 2014, 10:45:15 AM9/17/14
to ansible...@googlegroups.com
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 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/4de3e97c-b389-4330-8e1d-54b7a9469cb1%40googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

Patrick Ansible-ML

unread,
Sep 17, 2014, 10:52:33 AM9/17/14
to ansible...@googlegroups.com
On 17-09-14 14:15, P wrote:
> > 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 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.

http://docs.ansible.com/playbooks_conditionals.html

HTH,
Patrick

P

unread,
Sep 17, 2014, 10:55:17 AM9/17/14
to ansible...@googlegroups.com


On Wednesday, September 17, 2014 3:45:15 PM UTC+1, James Cammarata wrote:
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.

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

P

unread,
Sep 17, 2014, 11:02:39 AM9/17/14
to ansible...@googlegroups.com, ans...@puzzled.xs4all.nl

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

James Cammarata

unread,
Sep 17, 2014, 12:53:40 PM9/17/14
to ansible...@googlegroups.com, ans...@puzzled.xs4all.nl
In that case, you may wish to do something in your roles like:

- name: check to see if something is already done
  whatever: a=b c=d
  register: is_done

- name: include the rest of the role tasks from another file if the above thing isn't done
  include: role_tasks.yml
  when: not is_done



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

Patrick Ansible-ML

unread,
Sep 17, 2014, 1:15:05 PM9/17/14
to ansible...@googlegroups.com
On 17-09-14 18:53, James Cammarata wrote:
> In that case, you may wish to do something in your roles like:
>
> - name: check to see if something is already done
> whatever: a=b c=d
> register: is_done
>
> - name: include the rest of the role tasks from another file if the
> above thing isn't done
> include: role_tasks.yml
> when: not is_done

Thanks James. That's an excellent way to get rid of the repetition.

Cheers,
Patrick

P

unread,
Sep 18, 2014, 2:40:55 AM9/18/14
to ansible...@googlegroups.com, ans...@puzzled.xs4all.nl
Hi James,

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

Regards
Reply all
Reply to author
Forward
0 new messages