Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix no log templating #44506

Merged
merged 2 commits into from
Sep 4, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions changelogs/fragments/fix_no_log_loop.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
bugfixes:
- always correctly template no log for tasks https://github.com/ansible/ansible/issues/43294
11 changes: 9 additions & 2 deletions lib/ansible/executor/task_executor.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,9 +170,10 @@ def _clean_res(res, errors='surrogate_or_strict'):
display.debug("done dumping result, returning")
return res
except AnsibleError as e:
return dict(failed=True, msg=wrap_var(to_text(e, nonstring='simplerepr')))
return dict(failed=True, msg=wrap_var(to_text(e, nonstring='simplerepr')), _ansible_no_log=self._play_context.no_log)
except Exception as e:
return dict(failed=True, msg='Unexpected failure during module execution.', exception=to_text(traceback.format_exc()), stdout='')
return dict(failed=True, msg='Unexpected failure during module execution.', exception=to_text(traceback.format_exc()),
stdout='', _ansible_no_log=self._play_context.no_log)
finally:
try:
self._connection.close()
Expand Down Expand Up @@ -302,6 +303,7 @@ def _run_loop(self, items):
# Only squash with 'with_:' not with the 'loop:', 'magic' squashing can be removed once with_ loops are
items = self._squash_items(items, loop_var, task_vars)

no_log = False
for item_index, item in enumerate(items):
task_vars[loop_var] = item
if index_var:
Expand Down Expand Up @@ -336,6 +338,9 @@ def _run_loop(self, items):
(self._task, tmp_task) = (tmp_task, self._task)
(self._play_context, tmp_play_context) = (tmp_play_context, self._play_context)

# update 'general no_log' based on specific no_log
no_log = no_log or tmp_task.no_log

# now update the result with the item info, and append the result
# to the list of results
res[loop_var] = item
Expand All @@ -359,6 +364,8 @@ def _run_loop(self, items):
results.append(res)
del task_vars[loop_var]

self._task.no_log = no_log

return results

def _squash_items(self, items, loop_var, variables):
Expand Down
2 changes: 1 addition & 1 deletion lib/ansible/executor/task_result.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ def clean_copy(self):
else:
ignore = _IGNORE

if self._task.no_log or self._result.get('_ansible_no_log', False):
if isinstance(self._task.no_log, bool) and self._task.no_log or self._result.get('_ansible_no_log', False):
x = {"censored": "the output has been hidden due to the fact that 'no_log: true' was specified for this result"}

# preserve full
Expand Down
27 changes: 27 additions & 0 deletions test/integration/targets/no_log/dynamic.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
- name: test dynamic no log
hosts: testhost
gather_facts: no
ignore_errors: yes
tasks:
- name: no loop, task fails, dynamic no_log
debug:
msg: "SHOW {{ var_does_not_exist }}"
no_log: "{{ not (unsafe_show_logs|bool) }}"

- name: loop, task succeeds, dynamic does no_log
debug:
msg: "SHOW {{ item }}"
loop:
- a
- b
- c
no_log: "{{ not (unsafe_show_logs|bool) }}"

- name: loop, task fails, dynamic no_log
debug:
msg: "SHOW {{ var_does_not_exist }}"
loop:
- a
- b
- c
no_log: "{{ not (unsafe_show_logs|bool) }}"
8 changes: 7 additions & 1 deletion test/integration/targets/no_log/runme.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@ set -eux

# This test expects 7 loggable vars and 0 non-loggable ones.
# If either mismatches it fails, run the ansible-playbook command to debug.

[ "$(ansible-playbook no_log_local.yml -i ../../inventory -vvvvv "$@" | awk \
'BEGIN { logme = 0; nolog = 0; } /LOG_ME/ { logme += 1;} /DO_NOT_LOG/ { nolog += 1;} END { printf "%d/%d", logme, nolog; }')" = "26/0" ]

# deal with corner cases with no log and loops
# no log enabled, should produce 6 censored messages
[ "$(ansible-playbook dynamic.yml -i ../../inventory -vvvvv "$@" -e unsafe_show_logs=no|grep -c 'output has been hidden')" = "6" ]

# no log disabled, should produce 0 censored
[ "$(ansible-playbook dynamic.yml -i ../../inventory -vvvvv "$@" -e unsafe_show_logs=yes|grep -c 'output has been hidden')" = "0" ]