My playbook has several hosts, and I have some tasks with assert and fail modules. How to do that if the task gets any fatal error in the play within particular host - the whole play should is terminated ?
I thought that playbook command any_errors_fatal would work, but seems not.
Is there any other way to make playbook stop if any of the hosts experiences errors ?
I see ansible has meta modules - there are some kind like end_play module, maybe this one would work…
I’ve two hosts in the play, and one of the hosts assert module doesnt validate to true and fails. With any_errors_fatal command I expect the playbook to stop on all hosts within the play. But in my case, the play stops only on failed host, it continues with other host where assertions passed.
If you set any_errors_fatal and a task returns an error, Ansible finishes the fatal task on all hosts in the current batch, then stops executing the play on all hosts. Subsequent tasks and plays are not executed. You can recover from fatal errors by adding a rescue section to the block. You can set any_errors_fatal at the play or block level.
I never have used it personally, but are you setting any_errors_fatal:true at the task level or playbook level?
As Kosala mentions, this should do what you want, however I think the specific piece of documentation to note is “Ansible finishes the fatal task on all hosts in the current batch”. With 2 hosts, and the default of 5 forks, your batch size will be 5 so your play will carry on across both hosts. If you set “serial: 1” it’ll probably behave the way you want.
I havent mentioned, that im using roles, when thereis simple playbook - everything works as expected - it quits playbook after assertion fails.
When using roles - the assertion fails - and the playbook continues only with the host, which had assertion passed.
So i still think that it’s the bug - the any_errors_fatal: true doenst work in roles.
Will, i think this sentence (“Ansible finishes the fatal task on all hosts in the current batch”). Means that it finishes only the TASK but not the whole playbook.
So i managed to clarify the situation. Seems that the problem occurs only when i’m using roles with block/rescue options. Without it everything works smooth.
For example: Roles Playbook without block/rescue: - hosts: TEONET01A,TEONET01B
gather_facts: false
any_errors_fatal: True
roles:
- test
Roles task (block commented):
---
# - name: Run test pbook
# block:
- assert:
that:
- ansible_hostname == 'TEONET01A'
- debug:
msg: In role
# rescue:
# - debug:
# msg: Rescue
Runs as expected and play exists after fatal error in assert:
root@PCEDVKAIL3:/etc/ansible# ansible-playbook playbook.yml