Merge pull request #488 from dhozac/jinja2-env
Create a Jinja2 environment allowing includes
This commit is contained in:
commit
07f5ab04ea
5 changed files with 47 additions and 51 deletions
|
@ -588,8 +588,7 @@ class Runner(object):
|
||||||
|
|
||||||
# template the source data locally
|
# template the source data locally
|
||||||
try:
|
try:
|
||||||
resultant = utils.template_from_file(utils.path_dwim(self.basedir, source),
|
resultant = utils.template_from_file(self.basedir, source, inject, self.setup_cache)
|
||||||
inject, self.setup_cache, no_engine=False)
|
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
result = dict(failed=True, msg=str(e))
|
result = dict(failed=True, msg=str(e))
|
||||||
return ReturnData(host=conn.host, comm_ok=False, result=result)
|
return ReturnData(host=conn.host, comm_ok=False, result=result)
|
||||||
|
|
|
@ -265,35 +265,33 @@ def varReplace(raw, vars):
|
||||||
|
|
||||||
return ''.join(done)
|
return ''.join(done)
|
||||||
|
|
||||||
def _template(text, vars, setup_cache=None, no_engine=True):
|
def _template(text, vars, setup_cache=None):
|
||||||
''' run a text buffer through the templating engine '''
|
''' run a text buffer through the templating engine '''
|
||||||
vars = vars.copy()
|
vars = vars.copy()
|
||||||
vars['hostvars'] = setup_cache
|
vars['hostvars'] = setup_cache
|
||||||
text = varReplace(unicode(text), vars)
|
text = varReplace(unicode(text), vars)
|
||||||
if no_engine:
|
|
||||||
# used when processing include: directives so that Jinja is evaluated
|
|
||||||
# in a later context when more variables are available
|
|
||||||
return text
|
return text
|
||||||
else:
|
|
||||||
template = jinja2.Template(text)
|
|
||||||
res = template.render(vars)
|
|
||||||
if text.endswith('\n') and not res.endswith('\n'):
|
|
||||||
res = res + '\n'
|
|
||||||
return res
|
|
||||||
|
|
||||||
def template(text, vars, setup_cache=None, no_engine=True):
|
def template(text, vars, setup_cache=None):
|
||||||
''' run a text buffer through the templating engine
|
''' run a text buffer through the templating engine
|
||||||
until it no longer changes '''
|
until it no longer changes '''
|
||||||
prev_text = ''
|
prev_text = ''
|
||||||
while prev_text != text:
|
while prev_text != text:
|
||||||
prev_text = text
|
prev_text = text
|
||||||
text = _template(text, vars, setup_cache, no_engine)
|
text = _template(text, vars, setup_cache)
|
||||||
return text
|
return text
|
||||||
|
|
||||||
def template_from_file(path, vars, setup_cache, no_engine=True):
|
def template_from_file(basedir, path, vars, setup_cache):
|
||||||
''' run a file through the templating engine '''
|
''' run a file through the templating engine '''
|
||||||
data = codecs.open(path, encoding="utf8").read()
|
environment = jinja2.Environment(loader=jinja2.FileSystemLoader(basedir), trim_blocks=False)
|
||||||
return template(data, vars, setup_cache, no_engine=no_engine)
|
data = codecs.open(path_dwim(basedir, path), encoding="utf8").read()
|
||||||
|
template = environment.from_string(data)
|
||||||
|
vars = vars.copy()
|
||||||
|
vars['hostvars'] = setup_cache
|
||||||
|
res = template.render(vars)
|
||||||
|
if data.endswith('\n') and not res.endswith('\n'):
|
||||||
|
res = res + '\n'
|
||||||
|
return res
|
||||||
|
|
||||||
def parse_yaml(data):
|
def parse_yaml(data):
|
||||||
return yaml.load(data)
|
return yaml.load(data)
|
||||||
|
|
|
@ -203,39 +203,6 @@ class TestUtils(unittest.TestCase):
|
||||||
|
|
||||||
assert res == 'hello world'
|
assert res == 'hello world'
|
||||||
|
|
||||||
#####################################
|
|
||||||
### Template function tests
|
|
||||||
|
|
||||||
def test_template_basic(self):
|
|
||||||
template = 'hello {{ who }}'
|
|
||||||
vars = {
|
|
||||||
'who': 'world',
|
|
||||||
}
|
|
||||||
|
|
||||||
res = ansible.utils.template(template, vars, {}, no_engine=False)
|
|
||||||
|
|
||||||
assert res == 'hello world'
|
|
||||||
|
|
||||||
def test_template_whitespace(self):
|
|
||||||
template = 'hello {{ who }}\n'
|
|
||||||
vars = {
|
|
||||||
'who': 'world',
|
|
||||||
}
|
|
||||||
|
|
||||||
res = ansible.utils.template(template, vars, {}, no_engine=False)
|
|
||||||
|
|
||||||
assert res == 'hello world\n'
|
|
||||||
|
|
||||||
def test_template_unicode(self):
|
|
||||||
template = 'hello {{ who }}'
|
|
||||||
vars = {
|
|
||||||
'who': u'wórld',
|
|
||||||
}
|
|
||||||
|
|
||||||
res = ansible.utils.template(template, vars, {}, no_engine=False)
|
|
||||||
|
|
||||||
assert res == u'hello wórld'
|
|
||||||
|
|
||||||
def test_template_varReplace_iterated(self):
|
def test_template_varReplace_iterated(self):
|
||||||
template = 'hello $who'
|
template = 'hello $who'
|
||||||
vars = {
|
vars = {
|
||||||
|
@ -247,6 +214,36 @@ class TestUtils(unittest.TestCase):
|
||||||
|
|
||||||
assert res == u'hello oh great one'
|
assert res == u'hello oh great one'
|
||||||
|
|
||||||
|
#####################################
|
||||||
|
### Template function tests
|
||||||
|
|
||||||
|
def test_template_basic(self):
|
||||||
|
vars = {
|
||||||
|
'who': 'world',
|
||||||
|
}
|
||||||
|
|
||||||
|
res = ansible.utils.template_from_file("test", "template-basic", vars, {})
|
||||||
|
|
||||||
|
assert res == 'hello world'
|
||||||
|
|
||||||
|
def test_template_whitespace(self):
|
||||||
|
vars = {
|
||||||
|
'who': 'world',
|
||||||
|
}
|
||||||
|
|
||||||
|
res = ansible.utils.template_from_file("test", "template-whitespace", vars, {})
|
||||||
|
|
||||||
|
assert res == 'hello world\n'
|
||||||
|
|
||||||
|
def test_template_unicode(self):
|
||||||
|
vars = {
|
||||||
|
'who': u'wórld',
|
||||||
|
}
|
||||||
|
|
||||||
|
res = ansible.utils.template_from_file("test", "template-basic", vars, {})
|
||||||
|
|
||||||
|
assert res == u'hello wórld'
|
||||||
|
|
||||||
#####################################
|
#####################################
|
||||||
### key-value parsing
|
### key-value parsing
|
||||||
|
|
||||||
|
|
1
test/template-basic
Normal file
1
test/template-basic
Normal file
|
@ -0,0 +1 @@
|
||||||
|
hello {{ who }}
|
1
test/template-whitespace
Normal file
1
test/template-whitespace
Normal file
|
@ -0,0 +1 @@
|
||||||
|
hello {{ who }}
|
Loading…
Reference in a new issue