diff options
author | Matt Martz <matt@sivel.net> | 2018-12-07 13:49:50 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-12-07 13:49:50 -0600 |
commit | 9007dbec2fe96d827bd1b713df6b4c1a2a51dc88 (patch) | |
tree | a5f1d9344a6e6abeba81d2af81cc38dd60d8a6a5 /lib/ansible/executor | |
parent | 597c258e0e00f371d3af50915435dbd1524b8157 (diff) | |
download | ansible-9007dbec2fe96d827bd1b713df6b4c1a2a51dc88.tar.gz |
Add info about loop based on jinja2 loop var (#42134)
* Add info about loop based on jinja2 loop var
* ansible_loop
* Update test count
* Add extended loop_control that defines whether ansible_loop should be added
* Extended needs to be defaulted
* Revert "Update test count"
This reverts commit f1e93ee469825f4cdcd90fb28667d29aa088275c.
* Add docs about loop_control.extended
* Add revindex and revindex0
* Document ansible_loop in special vars
* Add changelog fragment
* Add tests, change items to allitems so that dot notation works, fix logic error with previtem
Diffstat (limited to 'lib/ansible/executor')
-rw-r--r-- | lib/ansible/executor/task_executor.py | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/lib/ansible/executor/task_executor.py b/lib/ansible/executor/task_executor.py index af758ee3eb..a6b72fb87c 100644 --- a/lib/ansible/executor/task_executor.py +++ b/lib/ansible/executor/task_executor.py @@ -287,6 +287,7 @@ class TaskExecutor: index_var = None label = None loop_pause = 0 + extended = False templar = Templar(loader=self._loader, shared_loader_obj=self._shared_loader_obj, variables=self._job_vars) # FIXME: move this to the object itself to allow post_validate to take care of templating (loop_control.post_validate) @@ -294,6 +295,7 @@ class TaskExecutor: loop_var = templar.template(self._task.loop_control.loop_var) index_var = templar.template(self._task.loop_control.index_var) loop_pause = templar.template(self._task.loop_control.pause) + extended = templar.template(self._task.loop_control.extended) # This may be 'None',so it is tempalted below after we ensure a value and an item is assigned label = self._task.loop_control.label @@ -313,11 +315,30 @@ class TaskExecutor: items = self._squash_items(items, loop_var, task_vars) no_log = False + items_len = len(items) for item_index, item in enumerate(items): task_vars[loop_var] = item if index_var: task_vars[index_var] = item_index + if extended: + task_vars['ansible_loop'] = { + 'allitems': items, + 'index': item_index + 1, + 'index0': item_index, + 'first': item_index == 0, + 'last': item_index + 1 == items_len, + 'length': items_len, + 'revindex': items_len - item_index, + 'revindex0': items_len - item_index - 1, + } + try: + task_vars['ansible_loop']['nextitem'] = items[item_index + 1] + except IndexError: + pass + if item_index - 1 >= 0: + task_vars['ansible_loop']['previtem'] = items[item_index - 1] + # Update template vars to reflect current loop iteration templar.set_available_variables(task_vars) @@ -355,6 +376,9 @@ class TaskExecutor: res[loop_var] = item if index_var: res[index_var] = item_index + if extended: + res['ansible_loop'] = task_vars['ansible_loop'] + res['_ansible_item_result'] = True res['_ansible_ignore_errors'] = task_fields.get('ignore_errors') |