template: add additional variable for dest path (#52015)

Signed-off-by: Dustin Spicuzza <dustin@virtualroadside.com>
Signed-off-by: Abhijeet Kasurde <akasurde@redhat.com>
This commit is contained in:
Abhijeet Kasurde 2019-02-19 14:15:19 +05:30 committed by GitHub
parent 13fa284946
commit 24d1886499
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 41 additions and 17 deletions

View file

@ -22,13 +22,14 @@ description:
- Templates are processed by the L(Jinja2 templating language,http://jinja.pocoo.org/docs/). - Templates are processed by the L(Jinja2 templating language,http://jinja.pocoo.org/docs/).
- Documentation on the template formatting can be found in the - Documentation on the template formatting can be found in the
L(Template Designer Documentation,http://jinja.pocoo.org/docs/templates/). L(Template Designer Documentation,http://jinja.pocoo.org/docs/templates/).
- The six additional variables, listed below, can be used in template. - Additional variables listed below can be used in templates.
- C(ansible_managed) (configurable via the C(defaults) section of C(ansible.cfg)) contains a string which can be used to - C(ansible_managed) (configurable via the C(defaults) section of C(ansible.cfg)) contains a string which can be used to
describe the template name, host, modification time of the template file and the owner uid. describe the template name, host, modification time of the template file and the owner uid.
- C(template_host) contains the node name of the template's machine. - C(template_host) contains the node name of the template's machine.
- C(template_uid) is the numeric user id of the owner. - C(template_uid) is the numeric user id of the owner.
- C(template_path) is the path of the template. - C(template_path) is the path of the template.
- C(template_fullpath) is the absolute path of the template. - C(template_fullpath) is the absolute path of the template.
- C(template_destpath) is the path of the template on the remote system (added in 2.8).
- C(template_run_date) is the date that the template was rendered. - C(template_run_date) is the date that the template was rendered.
options: options:
src: src:

View file

@ -19,15 +19,17 @@ description:
(U(http://jinja.pocoo.org/docs/)) - documentation on the template (U(http://jinja.pocoo.org/docs/)) - documentation on the template
formatting can be found in the Template Designer Documentation formatting can be found in the Template Designer Documentation
(U(http://jinja.pocoo.org/docs/templates/)). (U(http://jinja.pocoo.org/docs/templates/)).
- "Six additional variables can be used in templates: C(ansible_managed) - "Additional variables can be used in templates: C(ansible_managed)
(configurable via the C(defaults) section of C(ansible.cfg)) contains a string (configurable via the C(defaults) section of C(ansible.cfg)) contains a string
which can be used to describe the template name, host, modification time of the which can be used to describe the template name, host, modification time of the
template file and the owner uid, C(template_host) contains the node name of template file and the owner uid."
the template's machine, C(template_uid) the owner, C(template_path) the - "C(template_host) contains the node name of the template's machine."
absolute path of the template, C(template_fullpath) is the absolute path of the - "C(template_uid) the owner."
template, and C(template_run_date) is the date that the template was rendered. Note that including - "C(template_path) the absolute path of the template."
a string that uses a date in the template will result in the template being marked 'changed' - "C(template_fullpath) is the absolute path of the template."
each time." - "C(template_destpath) is the path of the template on the remote system (added in 2.8)."
- "C(template_run_date) is the date that the template was rendered."
- "Note that including a string that uses a date in the template will result in the template being marked 'changed' each time."
- For other platforms you can use M(template) which uses '\n' as C(newline_sequence). - For other platforms you can use M(template) which uses '\n' as C(newline_sequence).
options: options:
src: src:

View file

@ -141,7 +141,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)) temp_vars.update(generate_ansible_template_vars(source, dest))
old_vars = self._templar._available_variables old_vars = self._templar._available_variables
self._templar.set_available_variables(temp_vars) self._templar.set_available_variables(temp_vars)

View file

@ -84,20 +84,22 @@ else:
from jinja2.utils import concat as j2_concat from jinja2.utils import concat as j2_concat
def generate_ansible_template_vars(path): def generate_ansible_template_vars(path, dest_path=None):
b_path = to_bytes(path) b_path = to_bytes(path)
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):
template_uid = os.stat(b_path).st_uid template_uid = os.stat(b_path).st_uid
temp_vars = {} temp_vars = {
temp_vars['template_host'] = to_text(os.uname()[1]) 'template_host': to_text(os.uname()[1]),
temp_vars['template_path'] = path 'template_path': path,
temp_vars['template_mtime'] = datetime.datetime.fromtimestamp(os.path.getmtime(b_path)) 'template_mtime': datetime.datetime.fromtimestamp(os.path.getmtime(b_path)),
temp_vars['template_uid'] = to_text(template_uid) 'template_uid': to_text(template_uid),
temp_vars['template_fullpath'] = os.path.abspath(path) 'template_fullpath': os.path.abspath(path),
temp_vars['template_run_date'] = datetime.datetime.now() 'template_run_date': datetime.datetime.now(),
'template_destpath': to_native(dest_path) if dest_path else None,
}
managed_default = C.DEFAULT_MANAGED_STR managed_default = C.DEFAULT_MANAGED_STR
managed_str = managed_default.format( managed_str = managed_default.format(

View file

@ -667,5 +667,23 @@
- list_var.1.foo is not defined - list_var.1.foo is not defined
- list_var.1.foo | default('DEFAULT') == 'DEFAULT' - list_var.1.foo | default('DEFAULT') == 'DEFAULT'
- template:
src: template_destpath_test.j2
dest: "{{ output_dir }}/template_destpath.templated"
- copy:
content: "{{ output_dir}}/template_destpath.templated\n"
dest: "{{ output_dir }}/template_destpath.expected"
- name: compare templated file to known good template_destpath
shell: diff -uw {{output_dir}}/template_destpath.templated {{output_dir}}/template_destpath.expected
register: diff_result
- name: verify templated template_destpath matches known good
assert:
that:
- 'diff_result.stdout == ""'
- "diff_result.rc == 0"
# aliases file requires root for template tests so this should be safe # aliases file requires root for template tests so this should be safe
- include: backup_test.yml - include: backup_test.yml

View file

@ -0,0 +1 @@
{{ template_destpath }}