diff options
author | Toshio Kuratomi <toshio@fedoraproject.org> | 2015-01-26 20:37:20 -0800 |
---|---|---|
committer | James Cammarata <jimi@sngx.net> | 2015-02-17 14:01:42 -0600 |
commit | ac0de5a9db56ac01c1f5261897cff2f139314d15 (patch) | |
tree | bb7c4f37ec5e5eea6a2669b86b34f94f7ba0a2f7 | |
parent | 8b8700d36517de3fa88a5c5d6afd5337473d54f6 (diff) | |
download | ansible-ac0de5a9db56ac01c1f5261897cff2f139314d15.tar.gz |
jinja2 cannot handle byte strs with non-ascii. So we need to transform potential byte str into unicode type. This fix is for dynamic inventory.
Fixes #10007
Conflicts:
v2/ansible/inventory/script.py
v2/ansible/module_utils/basic.py
-rw-r--r-- | lib/ansible/callbacks.py | 2 | ||||
-rw-r--r-- | lib/ansible/inventory/script.py | 4 | ||||
-rw-r--r-- | lib/ansible/module_utils/basic.py | 18 |
3 files changed, 22 insertions, 2 deletions
diff --git a/lib/ansible/callbacks.py b/lib/ansible/callbacks.py index a4b62fb005..6469401c92 100644 --- a/lib/ansible/callbacks.py +++ b/lib/ansible/callbacks.py @@ -456,6 +456,8 @@ class PlaybookRunnerCallbacks(DefaultRunnerCallbacks): item = None if type(results) == dict: item = results.get('item', None) + host = utils.to_bytes(host) + results = utils.to_bytes(results) if item: msg = "fatal: [%s] => (item=%s) => %s" % (host, item, results) else: diff --git a/lib/ansible/inventory/script.py b/lib/ansible/inventory/script.py index 6239be0140..c599791e7d 100644 --- a/lib/ansible/inventory/script.py +++ b/lib/ansible/inventory/script.py @@ -22,7 +22,7 @@ import subprocess import ansible.constants as C from ansible.inventory.host import Host from ansible.inventory.group import Group -from ansible.module_utils.basic import json_dict_unicode_to_bytes +from ansible.module_utils.basic import json_dict_bytes_to_unicode from ansible import utils from ansible import errors import sys @@ -55,7 +55,7 @@ class InventoryScript(object): # not passing from_remote because data from CMDB is trusted self.raw = utils.parse_json(self.data) - self.raw = json_dict_unicode_to_bytes(self.raw) + self.raw = json_dict_bytes_to_unicode(self.raw) all = Group('all') groups = dict(all=all) diff --git a/lib/ansible/module_utils/basic.py b/lib/ansible/module_utils/basic.py index 6707381f53..61b5b68b3b 100644 --- a/lib/ansible/module_utils/basic.py +++ b/lib/ansible/module_utils/basic.py @@ -251,6 +251,24 @@ def json_dict_unicode_to_bytes(d): else: return d +def json_dict_bytes_to_unicode(d): + ''' Recursively convert dict keys and values to byte str + + Specialized for json return because this only handles, lists, tuples, + and dict container types (the containers that the json module returns) + ''' + + if isinstance(d, str): + return unicode(d, 'utf-8') + elif isinstance(d, dict): + return dict(map(json_dict_bytes_to_unicode, d.iteritems())) + elif isinstance(d, list): + return list(map(json_dict_bytes_to_unicode, d)) + elif isinstance(d, tuple): + return tuple(map(json_dict_bytes_to_unicode, d)) + else: + return d + class AnsibleModule(object): |