Allow variables to be passed in to template lookup plugin (#18662)

This allows a single template to be evaluated with different values in
the same task. For example, with a template like 'x:{{a}}', one could do
something like this:

    - foo:
        a: "{{ lookup('template', 'x.j2', template_vars=dict(a=foo[item])) }}"
        b: "{{ lookup('template', 'x.j2', template_vars=dict(a=bar[item])) }}"
      with_items:
        - x
        - y

…and "a" and "b" would expand to different strings based on what we
passed in to the template lookup.
This commit is contained in:
Abhijit Menon-Sen 2017-08-02 09:29:27 +05:30 committed by GitHub
parent 517c91df18
commit 20b0716948
2 changed files with 12 additions and 4 deletions

View file

@ -556,6 +556,9 @@ Here are some examples::
- debug: msg="{{ lookup('template', './some_template.j2') }} is a value from evaluation of this template" - debug: msg="{{ lookup('template', './some_template.j2') }} is a value from evaluation of this template"
# Since 2.4, you can pass in variables during evaluation
- debug: msg="{{ lookup('template', './some_template.j2', template_vars=dict(x=42)) }} is evaluated with x=42"
- name: loading a json file from a template as a string - name: loading a json file from a template as a string
debug: msg="{{ lookup('template', './some_json.json.j2', convert_data=False) }} is a value from evaluation of this template" debug: msg="{{ lookup('template', './some_json.json.j2', convert_data=False) }} is a value from evaluation of this template"

View file

@ -36,6 +36,7 @@ class LookupModule(LookupBase):
def run(self, terms, variables, **kwargs): def run(self, terms, variables, **kwargs):
convert_data_p = kwargs.get('convert_data', True) convert_data_p = kwargs.get('convert_data', True)
lookup_template_vars = kwargs.get('template_vars', {})
ret = [] ret = []
for term in terms: for term in terms:
@ -62,10 +63,14 @@ class LookupModule(LookupBase):
searchpath = [self._loader._basedir, os.path.dirname(lookupfile)] searchpath = [self._loader._basedir, os.path.dirname(lookupfile)]
self._templar.environment.loader.searchpath = searchpath self._templar.environment.loader.searchpath = searchpath
# add ansible 'template' vars # The template will have access to all existing variables,
temp_vars = variables.copy() # plus some added by ansible (e.g., template_{path,mtime}),
temp_vars.update(generate_ansible_template_vars(lookupfile)) # plus anything passed to the lookup with the template_vars=
self._templar.set_available_variables(temp_vars) # argument.
vars = variables.copy()
vars.update(generate_ansible_template_vars(lookupfile))
vars.update(lookup_template_vars)
self._templar.set_available_variables(vars)
# do the templating # do the templating
res = self._templar.template(template_data, preserve_trailing_newlines=True, res = self._templar.template(template_data, preserve_trailing_newlines=True,