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:
parent
4a82e2c486
commit
22330dd322
5 changed files with 18 additions and 6 deletions
2
changelogs/fragments/template_temp_vars_fix.yml
Normal file
2
changelogs/fragments/template_temp_vars_fix.yml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
bugfixes:
|
||||||
|
- Correctly set template_path and template_fullpath for usage in template lookup and action plugins.
|
|
@ -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):
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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):
|
||||||
|
|
||||||
|
if fullpath is None:
|
||||||
b_path = to_bytes(path)
|
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'],
|
||||||
|
|
Loading…
Reference in a new issue