Fix for saving conditionals in variable expressions.

This commit is contained in:
Michael DeHaan 2013-07-21 08:52:00 -04:00
parent ca512c7d2f
commit 62b39d3de5
4 changed files with 14 additions and 7 deletions

View file

@ -89,6 +89,7 @@ Misc changes:
* added Jinja2 filters: skipped, whether a result was skipped
* added Jinja2 filters: quote, quotes a string if it needs to be quoted
* allow force=yes to affect apt upgrades
* fix for saving conditionals in variable names
1.2.2 "Hear About It Later" (reprise) -- July 4, 2013

View file

@ -528,8 +528,7 @@ class Runner(object):
self.conditional = [ self.conditional ]
for cond in self.conditional:
cond = template.template(self.basedir, cond, inject, expand_lists=False)
if not utils.check_conditional(cond):
if not utils.check_conditional(cond, self.basedir, inject):
result = utils.jsonify(dict(changed=False, skipped=True))
self.callbacks.on_skipped(host, inject.get('item',None))
return ReturnData(host=host, result=result)

View file

@ -58,7 +58,7 @@ class ActionModule(object):
data = {}
data.update(inject)
data.update(inject['hostvars'][host])
if not check_conditional(template.template(self.runner.basedir, self.runner.conditional, data)):
if not check_conditional(self.runner.basedir, self.runner.conditional, data):
continue
group_name = template.template(self.runner.basedir, args['key'], data)
group_name = group_name.replace(' ','-')

View file

@ -155,7 +155,16 @@ def is_changed(result):
return (result.get('changed', False) in [ True, 'True', 'true'])
def check_conditional(conditional):
def check_conditional(conditional, basedir, inject):
if conditional.startswith("jinja2_compare"):
conditional = conditional.replace("jinja2_compare ","")
# allow variable names
if conditional in inject:
conditional = inject[conditional]
conditional = template.template(basedir, conditional, inject)
# a Jinja2 evaluation that results in something Python can eval!
presented = "{% if " + conditional + " %} True {% else %} False {% endif %}"
if not isinstance(conditional, basestring):
return conditional
@ -667,9 +676,7 @@ def compile_when_to_only_if(expression):
# the stock 'when' without qualification (new in 1.2), assumes Jinja2 terms
elif tokens[0] == 'jinja2_compare':
# a Jinja2 evaluation that results in something Python can eval!
presented = "{% if " + " ".join(tokens[1:]).strip() + " %} True {% else %} False {% endif %}"
return presented
return " ".join(tokens)
else:
raise errors.AnsibleError("invalid usage of when_ operator: %s" % expression)