summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Cassell <code@james.cassell.me>2019-10-10 18:24:31 -0400
committerToshio Kuratomi <a.badger@gmail.com>2019-10-12 09:18:10 -0700
commit2c836d4908ff256a9b61bbc4779d70588cc4a02d (patch)
tree2c8b0e983bf0f0130960ca8b782dd8abd27b9b09
parentdbc1ba448760a8437589c9827b3539cb76cc620c (diff)
downloadansible-2c836d4908ff256a9b61bbc4779d70588cc4a02d.tar.gz
clean "changed" only after it has been processed (#59958)
* clean "changed" after it has been processed without this change, a loop of `debug` tasks with `changed_when` causes the "changed" status to get lost before output * runme.sh tests for debug loop status (cherry picked from commit bfd32c9b002825b4bfc0c663322fab4061702c90)
-rw-r--r--changelogs/fragments/debug_loop_changed.yaml3
-rw-r--r--lib/ansible/plugins/callback/default.py2
-rw-r--r--test/integration/targets/callback_default/callback_default.out.default.stdout16
-rw-r--r--test/integration/targets/callback_default/callback_default.out.failed_to_stderr.stderr1
-rw-r--r--test/integration/targets/callback_default/callback_default.out.failed_to_stderr.stdout15
-rw-r--r--test/integration/targets/callback_default/callback_default.out.hide_ok.stdout13
-rw-r--r--test/integration/targets/callback_default/callback_default.out.hide_skipped.stdout15
-rw-r--r--test/integration/targets/callback_default/callback_default.out.hide_skipped_ok.stdout12
-rw-r--r--test/integration/targets/callback_default/test.yml16
9 files changed, 87 insertions, 6 deletions
diff --git a/changelogs/fragments/debug_loop_changed.yaml b/changelogs/fragments/debug_loop_changed.yaml
new file mode 100644
index 0000000000..fd4c0897a3
--- /dev/null
+++ b/changelogs/fragments/debug_loop_changed.yaml
@@ -0,0 +1,3 @@
+bugfixes:
+- debug - fixed an issue introduced in Ansible 2.4 where a loop of debug tasks
+ would lose the "changed" status on each item.
diff --git a/lib/ansible/plugins/callback/default.py b/lib/ansible/plugins/callback/default.py
index 98c66ab68a..c68010959d 100644
--- a/lib/ansible/plugins/callback/default.py
+++ b/lib/ansible/plugins/callback/default.py
@@ -290,7 +290,6 @@ class CallbackModule(CallbackBase):
def v2_runner_item_on_ok(self, result):
delegated_vars = result._result.get('_ansible_delegated_vars', None)
- self._clean_results(result._result, result._task.action)
if isinstance(result._task, TaskInclude):
return
elif result._result.get('changed', False):
@@ -316,6 +315,7 @@ class CallbackModule(CallbackBase):
msg += " => (item=%s)" % (self._get_item_label(result._result),)
+ self._clean_results(result._result, result._task.action)
if self._run_is_verbose(result):
msg += " => %s" % self._dump_results(result._result)
self._display.display(msg, color=color)
diff --git a/test/integration/targets/callback_default/callback_default.out.default.stdout b/test/integration/targets/callback_default/callback_default.out.default.stdout
index 1b7a63e3a7..b9d1b8a171 100644
--- a/test/integration/targets/callback_default/callback_default.out.default.stdout
+++ b/test/integration/targets/callback_default/callback_default.out.default.stdout
@@ -22,6 +22,20 @@ changed: [testhost] => (item=foo-1)
changed: [testhost] => (item=foo-2)
changed: [testhost] => (item=foo-3)
+TASK [debug loop] **************************************************************
+changed: [testhost] => (item=debug-1) => {
+ "msg": "debug-1"
+}
+failed: [testhost] (item=debug-2) => {
+ "msg": "debug-2"
+}
+ok: [testhost] => (item=debug-3) => {
+ "msg": "debug-3"
+}
+skipping: [testhost] => (item=debug-4)
+fatal: [testhost]: FAILED! => {"msg": "All items completed"}
+...ignoring
+
TASK [EXPECTED FAILURE Failed task to be rescued] ******************************
fatal: [testhost]: FAILED! => {"changed": false, "msg": "Failed as requested from task"}
@@ -46,5 +60,5 @@ TASK [Second free task] ********************************************************
changed: [testhost]
PLAY RECAP *********************************************************************
-testhost : ok=11 changed=8 unreachable=0 failed=0 skipped=1 rescued=1 ignored=1
+testhost : ok=12 changed=9 unreachable=0 failed=0 skipped=1 rescued=1 ignored=2
diff --git a/test/integration/targets/callback_default/callback_default.out.failed_to_stderr.stderr b/test/integration/targets/callback_default/callback_default.out.failed_to_stderr.stderr
index 5b97462669..932a2e4f50 100644
--- a/test/integration/targets/callback_default/callback_default.out.failed_to_stderr.stderr
+++ b/test/integration/targets/callback_default/callback_default.out.failed_to_stderr.stderr
@@ -1,4 +1,5 @@
+ ansible-playbook -i inventory test.yml
++ set +x
fatal: [testhost]: FAILED! => {"changed": false, "msg": "no reason"}
+fatal: [testhost]: FAILED! => {"msg": "All items completed"}
fatal: [testhost]: FAILED! => {"changed": false, "msg": "Failed as requested from task"}
diff --git a/test/integration/targets/callback_default/callback_default.out.failed_to_stderr.stdout b/test/integration/targets/callback_default/callback_default.out.failed_to_stderr.stdout
index ca011faa6c..58c4e1039b 100644
--- a/test/integration/targets/callback_default/callback_default.out.failed_to_stderr.stdout
+++ b/test/integration/targets/callback_default/callback_default.out.failed_to_stderr.stdout
@@ -21,6 +21,19 @@ changed: [testhost] => (item=foo-1)
changed: [testhost] => (item=foo-2)
changed: [testhost] => (item=foo-3)
+TASK [debug loop] **************************************************************
+changed: [testhost] => (item=debug-1) => {
+ "msg": "debug-1"
+}
+failed: [testhost] (item=debug-2) => {
+ "msg": "debug-2"
+}
+ok: [testhost] => (item=debug-3) => {
+ "msg": "debug-3"
+}
+skipping: [testhost] => (item=debug-4)
+...ignoring
+
TASK [EXPECTED FAILURE Failed task to be rescued] ******************************
TASK [Rescue task] *************************************************************
@@ -44,5 +57,5 @@ TASK [Second free task] ********************************************************
changed: [testhost]
PLAY RECAP *********************************************************************
-testhost : ok=11 changed=8 unreachable=0 failed=0 skipped=1 rescued=1 ignored=1
+testhost : ok=12 changed=9 unreachable=0 failed=0 skipped=1 rescued=1 ignored=2
diff --git a/test/integration/targets/callback_default/callback_default.out.hide_ok.stdout b/test/integration/targets/callback_default/callback_default.out.hide_ok.stdout
index 9ce13aeea6..b9dad40c0d 100644
--- a/test/integration/targets/callback_default/callback_default.out.hide_ok.stdout
+++ b/test/integration/targets/callback_default/callback_default.out.hide_ok.stdout
@@ -19,6 +19,17 @@ changed: [testhost] => (item=foo-1)
changed: [testhost] => (item=foo-2)
changed: [testhost] => (item=foo-3)
+TASK [debug loop] **************************************************************
+changed: [testhost] => (item=debug-1) => {
+ "msg": "debug-1"
+}
+failed: [testhost] (item=debug-2) => {
+ "msg": "debug-2"
+}
+skipping: [testhost] => (item=debug-4)
+fatal: [testhost]: FAILED! => {"msg": "All items completed"}
+...ignoring
+
TASK [EXPECTED FAILURE Failed task to be rescued] ******************************
fatal: [testhost]: FAILED! => {"changed": false, "msg": "Failed as requested from task"}
@@ -40,5 +51,5 @@ TASK [Second free task] ********************************************************
changed: [testhost]
PLAY RECAP *********************************************************************
-testhost : ok=11 changed=8 unreachable=0 failed=0 skipped=1 rescued=1 ignored=1
+testhost : ok=12 changed=9 unreachable=0 failed=0 skipped=1 rescued=1 ignored=2
diff --git a/test/integration/targets/callback_default/callback_default.out.hide_skipped.stdout b/test/integration/targets/callback_default/callback_default.out.hide_skipped.stdout
index c8fd1c5358..3c6ba0d3cf 100644
--- a/test/integration/targets/callback_default/callback_default.out.hide_skipped.stdout
+++ b/test/integration/targets/callback_default/callback_default.out.hide_skipped.stdout
@@ -19,6 +19,19 @@ changed: [testhost] => (item=foo-1)
changed: [testhost] => (item=foo-2)
changed: [testhost] => (item=foo-3)
+TASK [debug loop] **************************************************************
+changed: [testhost] => (item=debug-1) => {
+ "msg": "debug-1"
+}
+failed: [testhost] (item=debug-2) => {
+ "msg": "debug-2"
+}
+ok: [testhost] => (item=debug-3) => {
+ "msg": "debug-3"
+}
+fatal: [testhost]: FAILED! => {"msg": "All items completed"}
+...ignoring
+
TASK [EXPECTED FAILURE Failed task to be rescued] ******************************
fatal: [testhost]: FAILED! => {"changed": false, "msg": "Failed as requested from task"}
@@ -43,5 +56,5 @@ TASK [Second free task] ********************************************************
changed: [testhost]
PLAY RECAP *********************************************************************
-testhost : ok=11 changed=8 unreachable=0 failed=0 skipped=1 rescued=1 ignored=1
+testhost : ok=12 changed=9 unreachable=0 failed=0 skipped=1 rescued=1 ignored=2
diff --git a/test/integration/targets/callback_default/callback_default.out.hide_skipped_ok.stdout b/test/integration/targets/callback_default/callback_default.out.hide_skipped_ok.stdout
index 92eb253534..181f56fdf5 100644
--- a/test/integration/targets/callback_default/callback_default.out.hide_skipped_ok.stdout
+++ b/test/integration/targets/callback_default/callback_default.out.hide_skipped_ok.stdout
@@ -16,6 +16,16 @@ changed: [testhost] => (item=foo-1)
changed: [testhost] => (item=foo-2)
changed: [testhost] => (item=foo-3)
+TASK [debug loop] **************************************************************
+changed: [testhost] => (item=debug-1) => {
+ "msg": "debug-1"
+}
+failed: [testhost] (item=debug-2) => {
+ "msg": "debug-2"
+}
+fatal: [testhost]: FAILED! => {"msg": "All items completed"}
+...ignoring
+
TASK [EXPECTED FAILURE Failed task to be rescued] ******************************
fatal: [testhost]: FAILED! => {"changed": false, "msg": "Failed as requested from task"}
@@ -37,5 +47,5 @@ TASK [Second free task] ********************************************************
changed: [testhost]
PLAY RECAP *********************************************************************
-testhost : ok=11 changed=8 unreachable=0 failed=0 skipped=1 rescued=1 ignored=1
+testhost : ok=12 changed=9 unreachable=0 failed=0 skipped=1 rescued=1 ignored=2
diff --git a/test/integration/targets/callback_default/test.yml b/test/integration/targets/callback_default/test.yml
index f623f89708..71ff909e99 100644
--- a/test/integration/targets/callback_default/test.yml
+++ b/test/integration/targets/callback_default/test.yml
@@ -34,6 +34,22 @@
loop_control:
label: foo-{{ item }}
+ # detect "changed" debug tasks being hidden with display_ok_tasks=false
+ - name: debug loop
+ debug:
+ msg: debug-{{ item }}
+ changed_when: item == 1
+ failed_when: item == 2
+ when: item != 4
+ ignore_errors: yes
+ loop:
+ - 1
+ - 2
+ - 3
+ - 4
+ loop_control:
+ label: debug-{{ item }}
+
- block:
- name: EXPECTED FAILURE Failed task to be rescued
fail: