Correctly set path and fullpath for template vars (#73924)

* Correctly set path and fullpath for template vars

 don't expect path to always be full path
 also added exception/tb on action fail
This commit is contained in:
Brian Coca 2021-03-26 16:33:25 -04:00 committed by GitHub
parent 4a82e2c486
commit 22330dd322
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 18 additions and 6 deletions

View file

@ -0,0 +1,2 @@
bugfixes:
- Correctly set template_path and template_fullpath for usage in template lookup and action plugins.

View file

@ -20,6 +20,7 @@ from __future__ import (absolute_import, division, print_function)
__metaclass__ = type __metaclass__ = type
import re import re
import traceback
from ansible.errors.yaml_strings import ( from ansible.errors.yaml_strings import (
YAML_COMMON_DICT_ERROR, YAML_COMMON_DICT_ERROR,
@ -331,7 +332,7 @@ class AnsibleActionFail(AnsibleAction):
def __init__(self, message="", obj=None, show_content=True, suppress_extended_error=False, orig_exc=None, result=None): def __init__(self, message="", obj=None, show_content=True, suppress_extended_error=False, orig_exc=None, result=None):
super(AnsibleActionFail, self).__init__(message=message, obj=obj, show_content=show_content, super(AnsibleActionFail, self).__init__(message=message, obj=obj, show_content=show_content,
suppress_extended_error=suppress_extended_error, orig_exc=orig_exc, result=result) suppress_extended_error=suppress_extended_error, orig_exc=orig_exc, result=result)
self.result.update({'failed': True, 'msg': message}) self.result.update({'failed': True, 'msg': message, 'exception': traceback.format_exc()})
class _AnsibleActionDone(AnsibleAction): class _AnsibleActionDone(AnsibleAction):

View file

@ -129,7 +129,7 @@ class ActionModule(ActionBase):
# add ansible 'template' vars # add ansible 'template' vars
temp_vars = task_vars.copy() temp_vars = task_vars.copy()
temp_vars.update(generate_ansible_template_vars(source, dest)) temp_vars.update(generate_ansible_template_vars(self._task.args.get('src', None), source, dest))
# force templar to use AnsibleEnvironment to prevent issues with native types # force templar to use AnsibleEnvironment to prevent issues with native types
# https://github.com/ansible/ansible/issues/46169 # https://github.com/ansible/ansible/issues/46169

View file

@ -118,7 +118,7 @@ class LookupModule(LookupBase):
# plus anything passed to the lookup with the template_vars= # plus anything passed to the lookup with the template_vars=
# argument. # argument.
vars = deepcopy(variables) vars = deepcopy(variables)
vars.update(generate_ansible_template_vars(lookupfile)) vars.update(generate_ansible_template_vars(term, lookupfile))
vars.update(lookup_template_vars) vars.update(lookup_template_vars)
with templar.set_temporary_context(variable_start_string=variable_start_string, with templar.set_temporary_context(variable_start_string=variable_start_string,

View file

@ -100,8 +100,13 @@ JINJA2_END_TOKENS = frozenset(('variable_end', 'block_end', 'comment_end', 'raw_
RANGE_TYPE = type(range(0)) RANGE_TYPE = type(range(0))
def generate_ansible_template_vars(path, dest_path=None): def generate_ansible_template_vars(path, fullpath=None, dest_path=None):
b_path = to_bytes(path)
if fullpath is None:
b_path = to_bytes(path)
else:
b_path = to_bytes(fullpath)
try: try:
template_uid = pwd.getpwuid(os.stat(b_path).st_uid).pw_name template_uid = pwd.getpwuid(os.stat(b_path).st_uid).pw_name
except (KeyError, TypeError): except (KeyError, TypeError):
@ -112,11 +117,15 @@ def generate_ansible_template_vars(path, dest_path=None):
'template_path': path, 'template_path': path,
'template_mtime': datetime.datetime.fromtimestamp(os.path.getmtime(b_path)), 'template_mtime': datetime.datetime.fromtimestamp(os.path.getmtime(b_path)),
'template_uid': to_text(template_uid), 'template_uid': to_text(template_uid),
'template_fullpath': os.path.abspath(path),
'template_run_date': datetime.datetime.now(), 'template_run_date': datetime.datetime.now(),
'template_destpath': to_native(dest_path) if dest_path else None, 'template_destpath': to_native(dest_path) if dest_path else None,
} }
if fullpath is None:
temp_vars['template_fullpath'] = os.path.abspath(path)
else:
temp_vars['template_fullpath'] = fullpath
managed_default = C.DEFAULT_MANAGED_STR managed_default = C.DEFAULT_MANAGED_STR
managed_str = managed_default.format( managed_str = managed_default.format(
host=temp_vars['template_host'], host=temp_vars['template_host'],