diff options
author | Matt Martz <matt@sivel.net> | 2018-10-22 10:27:52 -0500 |
---|---|---|
committer | Toshio Kuratomi <a.badger@gmail.com> | 2018-10-22 16:32:26 -0700 |
commit | 0e933f76ba4edb0e06f0779f5fb4b0ea85191e8b (patch) | |
tree | cebdede99aa5cce9463af2697be49f53e4d32b82 | |
parent | ce16286dee0af539749ea776b13e10cca7eb4c3c (diff) | |
download | ansible-0e933f76ba4edb0e06f0779f5fb4b0ea85191e8b.tar.gz |
[stable-2.7] Handle sets differently than lists in wrap_var. Fixes #47372.
(cherry picked from commit c58de75f385dcfcef0531fc7c0cbb13bfdef0e83)
Co-authored-by: Matt Martz <matt@sivel.net>
-rw-r--r-- | changelogs/fragments/unsafe-set-wrap.yaml | 2 | ||||
-rw-r--r-- | lib/ansible/utils/unsafe_proxy.py | 8 | ||||
-rw-r--r-- | test/integration/targets/loops/tasks/main.yml | 10 |
3 files changed, 19 insertions, 1 deletions
diff --git a/changelogs/fragments/unsafe-set-wrap.yaml b/changelogs/fragments/unsafe-set-wrap.yaml new file mode 100644 index 0000000000..5e3a491632 --- /dev/null +++ b/changelogs/fragments/unsafe-set-wrap.yaml @@ -0,0 +1,2 @@ +bugfixes: +- unsafe - Add special casing to sets, to support wrapping elements of sets correctly in Python 3 (https://github.com/ansible/ansible/issues/47372) diff --git a/lib/ansible/utils/unsafe_proxy.py b/lib/ansible/utils/unsafe_proxy.py index 963798a087..9f7de697e4 100644 --- a/lib/ansible/utils/unsafe_proxy.py +++ b/lib/ansible/utils/unsafe_proxy.py @@ -96,11 +96,17 @@ def _wrap_list(v): return v +def _wrap_set(v): + return set(item if item is None else wrap_var(item) for item in v) + + def wrap_var(v): if isinstance(v, Mapping): v = _wrap_dict(v) - elif isinstance(v, (MutableSequence, Set)): + elif isinstance(v, MutableSequence): v = _wrap_list(v) + elif isinstance(v, Set): + v = _wrap_set(v) elif v is not None and not isinstance(v, AnsibleUnsafe): v = UnsafeProxy(v) return v diff --git a/test/integration/targets/loops/tasks/main.yml b/test/integration/targets/loops/tasks/main.yml index 1b8a745050..423a8b3ad2 100644 --- a/test/integration/targets/loops/tasks/main.yml +++ b/test/integration/targets/loops/tasks/main.yml @@ -252,3 +252,13 @@ loop: "{{ fake_var }}" register: result failed_when: result is not skipped + +# https://github.com/ansible/ansible/issues/47372 +- name: Loop unsafe list + debug: + var: item + with_items: "{{ things|map('string')|unique }}" + vars: + things: + - !unsafe foo + - !unsafe bar |