I needed a playbook to fail complete when any task failed. You would think “any_errors_fatal: True” would do this, but it doesn’t. It marks the hosts as failed and ends the play, but the recap doesn’t say anything about it. Instead it prints out the normal output even though the playbook never completes for any node. It’s extremely deceptive.
As a result, I opened up a ticket with the Ansible devs (https://github.com/ansible/ansible/issues/57138), but they claimed this was a documentation bug.
I complained about that in the user group (https://groups.google.com/forum/#!topic/ansible-devel/MT-bZgISWrs), but I was ignored.
Finally, I decided I needed a workaround. Here it is. I lifted portions of this code in various places, but I can’t recall them all. I apologize if I lifted something from you.
The idea is to catch any failure and set a global variable (using add_host). Then all the nodes can test that global failure and fail as necessary. Here is the code:
- hosts: all gather_facts: no become: False tasks: - name: Use block to catch errors block: - name: Generate a random failue shell: 'echo $(( $RANDOM % 10 ))' register: random failed_when: random.stdout|int == 2 - debug: msg: 'This node PASSED' rescue: - debug: msg: 'This node FAILED' - name: "Create a dummy host to hold a failure flag" add_host: name: "BAD_HOST" - name: Force EVERYTHING to fail fail: msg="One host failed" when: hostvars['BAD_HOST'] is defined
EDIT: It looks the Ansible devs are going to implement my suggestion in a future release of Ansible.