From 9792d631b1b92356d41e9a792de4b2479a1bce44 Mon Sep 17 00:00:00 2001 From: Martin Krizek Date: Wed, 26 Aug 2020 07:07:34 +0200 Subject: [PATCH] _check_failed_state: always use the current/nested state (#71347) Fixes #71306 --- .../fragments/71306-fix-exit-code-no-failure.yml | 2 ++ lib/ansible/executor/play_iterator.py | 2 +- test/integration/targets/blocks/issue71306.yml | 16 ++++++++++++++++ test/integration/targets/blocks/runme.sh | 9 +++++++++ 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 changelogs/fragments/71306-fix-exit-code-no-failure.yml create mode 100644 test/integration/targets/blocks/issue71306.yml diff --git a/changelogs/fragments/71306-fix-exit-code-no-failure.yml b/changelogs/fragments/71306-fix-exit-code-no-failure.yml new file mode 100644 index 00000000000..78d59b1900b --- /dev/null +++ b/changelogs/fragments/71306-fix-exit-code-no-failure.yml @@ -0,0 +1,2 @@ +bugfixes: + - Fix an exit code for a non-failing playbook (https://github.com/ansible/ansible/issues/71306) diff --git a/lib/ansible/executor/play_iterator.py b/lib/ansible/executor/play_iterator.py index 1f2accadbe5..1a53f3e7016 100644 --- a/lib/ansible/executor/play_iterator.py +++ b/lib/ansible/executor/play_iterator.py @@ -491,7 +491,7 @@ class PlayIterator: else: return not (state.did_rescue and state.fail_state & self.FAILED_ALWAYS == 0) elif state.run_state == self.ITERATING_TASKS and self._check_failed_state(state.tasks_child_state): - cur_block = self._blocks[state.cur_block] + cur_block = state._blocks[state.cur_block] if len(cur_block.rescue) > 0 and state.fail_state & self.FAILED_RESCUE == 0: return False else: diff --git a/test/integration/targets/blocks/issue71306.yml b/test/integration/targets/blocks/issue71306.yml new file mode 100644 index 00000000000..9762f6ee838 --- /dev/null +++ b/test/integration/targets/blocks/issue71306.yml @@ -0,0 +1,16 @@ +- hosts: all + gather_facts: no + tasks: + - block: + - block: + - block: + - name: EXPECTED FAILURE + fail: + when: ansible_host == "host1" + + - debug: + msg: "I am successful!" + run_once: true + rescue: + - debug: + msg: "Attemp 1 failed!" diff --git a/test/integration/targets/blocks/runme.sh b/test/integration/targets/blocks/runme.sh index 038e5a64fdd..3fcdf202d80 100755 --- a/test/integration/targets/blocks/runme.sh +++ b/test/integration/targets/blocks/runme.sh @@ -84,3 +84,12 @@ cat rc_test.out [ "$(grep -c 'rescued=3' rc_test.out)" -eq 1 ] [ "$(grep -c 'failed=0' rc_test.out)" -eq 1 ] rm -f rc_test.out + +# https://github.com/ansible/ansible/issues/71306 +set +e +exit_code=0 +ansible-playbook -i host1,host2 -vv issue71306.yml > rc_test.out || exit_code=$? +set -e +cat rc_test.out +[ $exit_code -eq 0 ] +rm -f rc_test_out