mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
Prevent premature substitution of variables into tasks
As documented in #2623, early variable substitution causes when_
tests to fail and possibly other side effects.
I can see the reason for this early substitution, likely introduced
in 1dfe60a6
, to allow many playbook parameters to be templated.
This is a valid goal, but the recursive nature of the utils.template
function means that it goes too far.
At this point removing tasks from the list of parameters to be
substituted seems sufficient to make my tests pass. It may be the
case that other parameters should be excluded, but I suspect not.
Adding a test case. I would prefer to analyse not just the aggregate
statistics but also whether the results are as expected - I can't
see an easy way to do that with the available callbacks at present.
This commit is contained in:
parent
a05361f515
commit
377bc31311
3 changed files with 60 additions and 1 deletions
|
@ -65,7 +65,11 @@ class Play(object):
|
|||
|
||||
self._update_vars_files_for_host(None)
|
||||
|
||||
self._ds = ds = template.template(basedir, ds, self.vars)
|
||||
for key in ds:
|
||||
if key != 'tasks':
|
||||
ds[key] = template.template(basedir, ds[key], self.vars)
|
||||
|
||||
self._ds = ds
|
||||
|
||||
hosts = ds.get('hosts')
|
||||
if hosts is None:
|
||||
|
|
|
@ -257,3 +257,31 @@ class TestPlaybook(unittest.TestCase):
|
|||
play = ansible.playbook.Play(playbook, playbook.playbook[0], os.getcwd())
|
||||
assert play.hosts == ';'.join(('host1', 'host2', 'host3'))
|
||||
|
||||
def test_playbook_when(self):
|
||||
test_callbacks = TestCallbacks()
|
||||
playbook = ansible.playbook.PlayBook(
|
||||
playbook=os.path.join(self.test_dir, 'playbook-when.yml'),
|
||||
host_list='test/ansible_hosts',
|
||||
extra_vars={ 'external' : 'xyz', 'identity': 'identity' },
|
||||
stats=ans_callbacks.AggregateStats(),
|
||||
callbacks=test_callbacks,
|
||||
runner_callbacks=test_callbacks
|
||||
)
|
||||
actual = playbook.run()
|
||||
|
||||
# if different, this will output to screen
|
||||
print "**ACTUAL**"
|
||||
print utils.jsonify(actual, format=True)
|
||||
expected = {
|
||||
"localhost": {
|
||||
"changed": 0,
|
||||
"failures": 0,
|
||||
"ok": 3,
|
||||
"skipped": 3,
|
||||
"unreachable": 0
|
||||
}
|
||||
}
|
||||
print "**EXPECTED**"
|
||||
print utils.jsonify(expected, format=True)
|
||||
|
||||
assert utils.jsonify(expected, format=True) == utils.jsonify(actual,format=True)
|
||||
|
|
27
test/playbook-when.yml
Normal file
27
test/playbook-when.yml
Normal file
|
@ -0,0 +1,27 @@
|
|||
---
|
||||
- hosts: all
|
||||
connection: local
|
||||
gather_facts: False
|
||||
|
||||
vars:
|
||||
internal: "print me"
|
||||
|
||||
tasks:
|
||||
- action: debug msg="skip me"
|
||||
when_unset: $internal
|
||||
|
||||
- action: debug msg="$internal"
|
||||
when_set: $internal
|
||||
|
||||
- action: debug msg="skip me"
|
||||
when_unset: $external
|
||||
|
||||
- action: debug msg="$external"
|
||||
when_set: $external
|
||||
|
||||
- action: debug msg="run me"
|
||||
when_unset: $this_var_does_not_exist
|
||||
|
||||
- action: debug msg="skip me"
|
||||
when_set: $this_var_does_not_exist
|
||||
|
Loading…
Reference in a new issue