Support iteration over command output in with_items.

When the output of a command is stored in a register, this will create a
stdout_lines field in the result object that contains stdout split into a list
of lines.  This list can then be iterated over using with_items.
pull/1058/head
John Kleint 12 years ago
parent 7df0e5259f
commit 2a002f5c0b

@ -258,6 +258,8 @@ class PlayBook(object):
facts = result.get('ansible_facts', {})
self.SETUP_CACHE[host].update(facts)
if task.register:
if 'stdout' in result:
result['stdout_lines'] = result['stdout'].splitlines()
self.SETUP_CACHE[host][task.register] = result
# flag which notify handlers need to be run

@ -181,3 +181,20 @@ class TestPlaybook(unittest.TestCase):
)
play = ansible.playbook.Play(playbook, playbook.playbook[0], os.getcwd())
assert play.hosts == ';'.join(('host1', 'host2', 'host3'))
def test_results_list(self):
# Test that we can iterate over the lines of a command's stdout in a register variable.
test_callbacks = TestCallbacks()
playbook = ansible.playbook.PlayBook(
playbook=os.path.join(self.test_dir, 'results_list.yml'),
host_list='test/ansible_hosts',
stats=ans_callbacks.AggregateStats(),
callbacks=test_callbacks,
runner_callbacks=test_callbacks
)
result = playbook.run()
self.assertIn('localhost', result)
self.assertIn('ok', result['localhost'])
self.assertEqual(result['localhost']['ok'], 6)
self.assertIn('failures', result['localhost'])
self.assertEqual(result['localhost']['failures'], 0)

@ -0,0 +1,19 @@
---
# Test iterating over lines of stdout stored in a register.
- hosts: localhost
vars:
small_file: /etc/resolv.conf
temp_file: /tmp/ansible_result_list.tmp
tasks:
- action: command cat $small_file
register: result
- action: file dest=$temp_file state=absent
- action: shell echo '$item' >> $temp_file
with_items: ${result.stdout_lines}
- action: command diff $small_file $temp_file
- action: file dest=$temp_file state=absent
Loading…
Cancel
Save