[stable-2.10] Allow single vault encrypted values to be used directly as module parameters. Fixes #68275 (#70607) (#70641)
(cherry picked from commit a77dbf0
)
Co-authored-by: Matt Martz <matt@sivel.net>
This commit is contained in:
parent
86b24498b7
commit
255dfca7f6
4 changed files with 26 additions and 4 deletions
3
changelogs/fragments/68275-vault-module-args.yml
Normal file
3
changelogs/fragments/68275-vault-module-args.yml
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
bugfixes:
|
||||||
|
- Vault - Allow single vault encrypted values to be used directly as module
|
||||||
|
parameters. (https://github.com/ansible/ansible/issues/68275)
|
|
@ -36,6 +36,7 @@ from ansible import constants as C
|
||||||
from ansible.errors import AnsibleError, AnsiblePluginRemovedError
|
from ansible.errors import AnsibleError, AnsiblePluginRemovedError
|
||||||
from ansible.executor.interpreter_discovery import InterpreterDiscoveryRequiredError
|
from ansible.executor.interpreter_discovery import InterpreterDiscoveryRequiredError
|
||||||
from ansible.executor.powershell import module_manifest as ps_manifest
|
from ansible.executor.powershell import module_manifest as ps_manifest
|
||||||
|
from ansible.module_utils.common.json import AnsibleJSONEncoder
|
||||||
from ansible.module_utils.common.text.converters import to_bytes, to_text, to_native
|
from ansible.module_utils.common.text.converters import to_bytes, to_text, to_native
|
||||||
from ansible.plugins.loader import module_utils_loader
|
from ansible.plugins.loader import module_utils_loader
|
||||||
from ansible.utils.collection_loader._collection_finder import _get_collection_metadata, _nested_dict_get
|
from ansible.utils.collection_loader._collection_finder import _get_collection_metadata, _nested_dict_get
|
||||||
|
@ -1092,7 +1093,7 @@ def _find_module_utils(module_name, b_module_data, module_path, module_args, tas
|
||||||
if module_substyle == 'python':
|
if module_substyle == 'python':
|
||||||
params = dict(ANSIBLE_MODULE_ARGS=module_args,)
|
params = dict(ANSIBLE_MODULE_ARGS=module_args,)
|
||||||
try:
|
try:
|
||||||
python_repred_params = repr(json.dumps(params))
|
python_repred_params = repr(json.dumps(params, cls=AnsibleJSONEncoder, vault_to_text=True))
|
||||||
except TypeError as e:
|
except TypeError as e:
|
||||||
raise AnsibleError("Unable to pass options to module, they must be JSON serializable: %s" % to_native(e))
|
raise AnsibleError("Unable to pass options to module, they must be JSON serializable: %s" % to_native(e))
|
||||||
|
|
||||||
|
@ -1244,7 +1245,7 @@ def _find_module_utils(module_name, b_module_data, module_path, module_args, tas
|
||||||
)
|
)
|
||||||
|
|
||||||
elif module_substyle == 'jsonargs':
|
elif module_substyle == 'jsonargs':
|
||||||
module_args_json = to_bytes(json.dumps(module_args))
|
module_args_json = to_bytes(json.dumps(module_args, cls=AnsibleJSONEncoder, vault_to_text=True))
|
||||||
|
|
||||||
# these strings could be included in a third-party module but
|
# these strings could be included in a third-party module but
|
||||||
# officially they were included in the 'basic' snippet for new-style
|
# officially they were included in the 'basic' snippet for new-style
|
||||||
|
|
|
@ -36,14 +36,18 @@ class AnsibleJSONEncoder(json.JSONEncoder):
|
||||||
Simple encoder class to deal with JSON encoding of Ansible internal types
|
Simple encoder class to deal with JSON encoding of Ansible internal types
|
||||||
'''
|
'''
|
||||||
|
|
||||||
def __init__(self, preprocess_unsafe=False, **kwargs):
|
def __init__(self, preprocess_unsafe=False, vault_to_text=False, **kwargs):
|
||||||
self._preprocess_unsafe = preprocess_unsafe
|
self._preprocess_unsafe = preprocess_unsafe
|
||||||
|
self._vault_to_text = vault_to_text
|
||||||
super(AnsibleJSONEncoder, self).__init__(**kwargs)
|
super(AnsibleJSONEncoder, self).__init__(**kwargs)
|
||||||
|
|
||||||
# NOTE: ALWAYS inform AWS/Tower when new items get added as they consume them downstream via a callback
|
# NOTE: ALWAYS inform AWS/Tower when new items get added as they consume them downstream via a callback
|
||||||
def default(self, o):
|
def default(self, o):
|
||||||
if getattr(o, '__ENCRYPTED__', False):
|
if getattr(o, '__ENCRYPTED__', False):
|
||||||
# vault object
|
# vault object
|
||||||
|
if self._vault_to_text:
|
||||||
|
value = to_text(o, errors='surrogate_or_strict')
|
||||||
|
else:
|
||||||
value = {'__ansible_vault': to_text(o._ciphertext, errors='surrogate_or_strict', nonstring='strict')}
|
value = {'__ansible_vault': to_text(o._ciphertext, errors='surrogate_or_strict', nonstring='strict')}
|
||||||
elif getattr(o, '__UNSAFE__', False):
|
elif getattr(o, '__UNSAFE__', False):
|
||||||
# unsafe object, this will never be triggered, see ``AnsibleJSONEncoder.iterencode``
|
# unsafe object, this will never be triggered, see ``AnsibleJSONEncoder.iterencode``
|
||||||
|
|
|
@ -107,3 +107,17 @@
|
||||||
that:
|
that:
|
||||||
- vaulted_value|wordcount == 2
|
- vaulted_value|wordcount == 2
|
||||||
when: lookup('pipe', ansible_python.executable ~ ' -c "import jinja2; print(jinja2.__version__)"') is version('2.11.2', '>=')
|
when: lookup('pipe', ansible_python.executable ~ ' -c "import jinja2; print(jinja2.__version__)"') is version('2.11.2', '>=')
|
||||||
|
|
||||||
|
- ping:
|
||||||
|
data: !vault |
|
||||||
|
$ANSIBLE_VAULT;1.1;AES256
|
||||||
|
35323961353038346165643738646465376139363061353835303739663538343266303232326635
|
||||||
|
3365353662646236356665323135633630656238316530640a663362363763633436373439663031
|
||||||
|
33663433383037396438656464636433653837376361313638366362333037323961316364363363
|
||||||
|
3835616438623261650a636164376534376661393134326662326362323131373964313961623365
|
||||||
|
3833
|
||||||
|
register: ping_result
|
||||||
|
|
||||||
|
- assert:
|
||||||
|
that:
|
||||||
|
- ping_result.ping == 'foo bar'
|
||||||
|
|
Loading…
Add table
Reference in a new issue