Add support for unicode in ansible-inventory CLI (#74912)
* Add support for unicode in ansible-inventory CLI Fixes #57378 * Add tests * First test fix * --output tests * fix
This commit is contained in:
parent
0a5cc80ce2
commit
5ac1b04929
4 changed files with 85 additions and 6 deletions
2
changelogs/fragments/57378-inventory-cli-unicode.yml
Normal file
2
changelogs/fragments/57378-inventory-cli-unicode.yml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
bugfixes:
|
||||||
|
- Add unicode support to ``ansible-inventory`` CLI (https://github.com/ansible/ansible/issues/57378)
|
|
@ -15,7 +15,7 @@ from ansible import context
|
||||||
from ansible.cli import CLI
|
from ansible.cli import CLI
|
||||||
from ansible.cli.arguments import option_helpers as opt_help
|
from ansible.cli.arguments import option_helpers as opt_help
|
||||||
from ansible.errors import AnsibleError, AnsibleOptionsError
|
from ansible.errors import AnsibleError, AnsibleOptionsError
|
||||||
from ansible.module_utils._text import to_bytes, to_native
|
from ansible.module_utils._text import to_bytes, to_native, to_text
|
||||||
from ansible.utils.vars import combine_vars
|
from ansible.utils.vars import combine_vars
|
||||||
from ansible.utils.display import Display
|
from ansible.utils.display import Display
|
||||||
from ansible.vars.plugins import get_vars_from_inventory_sources, get_vars_from_path
|
from ansible.vars.plugins import get_vars_from_inventory_sources, get_vars_from_path
|
||||||
|
@ -158,8 +158,8 @@ class InventoryCLI(CLI):
|
||||||
display.display(results)
|
display.display(results)
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
with open(to_bytes(outfile), 'wt') as f:
|
with open(to_bytes(outfile), 'wb') as f:
|
||||||
f.write(results)
|
f.write(to_bytes(results))
|
||||||
except (OSError, IOError) as e:
|
except (OSError, IOError) as e:
|
||||||
raise AnsibleError('Unable to write to destination file (%s): %s' % (to_native(outfile), to_native(e)))
|
raise AnsibleError('Unable to write to destination file (%s): %s' % (to_native(outfile), to_native(e)))
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
@ -172,7 +172,7 @@ class InventoryCLI(CLI):
|
||||||
if context.CLIARGS['yaml']:
|
if context.CLIARGS['yaml']:
|
||||||
import yaml
|
import yaml
|
||||||
from ansible.parsing.yaml.dumper import AnsibleDumper
|
from ansible.parsing.yaml.dumper import AnsibleDumper
|
||||||
results = yaml.dump(stuff, Dumper=AnsibleDumper, default_flow_style=False)
|
results = to_text(yaml.dump(stuff, Dumper=AnsibleDumper, default_flow_style=False, allow_unicode=True))
|
||||||
elif context.CLIARGS['toml']:
|
elif context.CLIARGS['toml']:
|
||||||
from ansible.plugins.inventory.toml import toml_dumps, HAS_TOML
|
from ansible.plugins.inventory.toml import toml_dumps, HAS_TOML
|
||||||
if not HAS_TOML:
|
if not HAS_TOML:
|
||||||
|
@ -192,9 +192,9 @@ class InventoryCLI(CLI):
|
||||||
import json
|
import json
|
||||||
from ansible.parsing.ajson import AnsibleJSONEncoder
|
from ansible.parsing.ajson import AnsibleJSONEncoder
|
||||||
try:
|
try:
|
||||||
results = json.dumps(stuff, cls=AnsibleJSONEncoder, sort_keys=True, indent=4, preprocess_unsafe=True)
|
results = json.dumps(stuff, cls=AnsibleJSONEncoder, sort_keys=True, indent=4, preprocess_unsafe=True, ensure_ascii=False)
|
||||||
except TypeError as e:
|
except TypeError as e:
|
||||||
results = json.dumps(stuff, cls=AnsibleJSONEncoder, sort_keys=False, indent=4, preprocess_unsafe=True)
|
results = json.dumps(stuff, cls=AnsibleJSONEncoder, sort_keys=False, indent=4, preprocess_unsafe=True, ensure_ascii=False)
|
||||||
display.warning("Could not sort JSON output due to issues while sorting keys: %s" % to_native(e))
|
display.warning("Could not sort JSON output due to issues while sorting keys: %s" % to_native(e))
|
||||||
|
|
||||||
return results
|
return results
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
all:
|
||||||
|
hosts:
|
||||||
|
příbor:
|
|
@ -105,3 +105,77 @@
|
||||||
that:
|
that:
|
||||||
- result is failed
|
- result is failed
|
||||||
- '"ERROR! The source inventory contains a non-string key" in result.stderr'
|
- '"ERROR! The source inventory contains a non-string key" in result.stderr'
|
||||||
|
|
||||||
|
- name: "test json output with unicode characters"
|
||||||
|
command: ansible-inventory --list -i {{ role_path }}/files/unicode.yml
|
||||||
|
register: result
|
||||||
|
|
||||||
|
- assert:
|
||||||
|
that:
|
||||||
|
- result is succeeded
|
||||||
|
- result.stdout is contains('příbor')
|
||||||
|
|
||||||
|
- block:
|
||||||
|
- name: "test json output file with unicode characters"
|
||||||
|
command: ansible-inventory --list --output unicode_inventory.json -i {{ role_path }}/files/unicode.yml
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
json_inventory_file: "{{ lookup('file', 'unicode_inventory.json') | string }}"
|
||||||
|
|
||||||
|
- assert:
|
||||||
|
that:
|
||||||
|
- json_inventory_file is contains('příbor')
|
||||||
|
always:
|
||||||
|
- file:
|
||||||
|
name: unicode_inventory.json
|
||||||
|
state: absent
|
||||||
|
|
||||||
|
- name: "test yaml output with unicode characters"
|
||||||
|
command: ansible-inventory --list --yaml -i {{ role_path }}/files/unicode.yml
|
||||||
|
register: result
|
||||||
|
|
||||||
|
- assert:
|
||||||
|
that:
|
||||||
|
- result is succeeded
|
||||||
|
- result.stdout is contains('příbor')
|
||||||
|
|
||||||
|
- block:
|
||||||
|
- name: "test yaml output file with unicode characters"
|
||||||
|
command: ansible-inventory --list --yaml --output unicode_inventory.yaml -i {{ role_path }}/files/unicode.yml
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
yaml_inventory_file: "{{ lookup('file', 'unicode_inventory.yaml') | string }}"
|
||||||
|
|
||||||
|
- assert:
|
||||||
|
that:
|
||||||
|
- yaml_inventory_file is contains('příbor')
|
||||||
|
always:
|
||||||
|
- file:
|
||||||
|
name: unicode_inventory.yaml
|
||||||
|
state: absent
|
||||||
|
|
||||||
|
- block:
|
||||||
|
- name: "test toml output with unicode characters"
|
||||||
|
command: ansible-inventory --list --toml -i {{ role_path }}/files/unicode.yml
|
||||||
|
register: result
|
||||||
|
|
||||||
|
- assert:
|
||||||
|
that:
|
||||||
|
- result is succeeded
|
||||||
|
- result.stdout is contains('příbor')
|
||||||
|
|
||||||
|
- block:
|
||||||
|
- name: "test toml output file with unicode characters"
|
||||||
|
command: ansible-inventory --list --toml --output unicode_inventory.toml -i {{ role_path }}/files/unicode.yml
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
toml_inventory_file: "{{ lookup('file', 'unicode_inventory.toml') | string }}"
|
||||||
|
|
||||||
|
- assert:
|
||||||
|
that:
|
||||||
|
- toml_inventory_file is contains('příbor')
|
||||||
|
always:
|
||||||
|
- file:
|
||||||
|
name: unicode_inventory.toml
|
||||||
|
state: absent
|
||||||
|
when: ansible_python.version.major|int == 3
|
||||||
|
|
Loading…
Reference in a new issue