Ensure play order is obeyed (#49897)

* Ensure play order is obeyed

 it was being ignored depending on other options
 also added tests for each order (except shuffle) both serial and not
 fixes #49846


(cherry picked from commit cfba6dfe91)
This commit is contained in:
Brian Coca 2019-02-27 18:20:16 -05:00 committed by Toshio Kuratomi
parent 2aa96cdec5
commit 6bd7ef4838
8 changed files with 59 additions and 3 deletions

View file

@ -0,0 +1,2 @@
bugfixes:
- play order is now applied under all circumstances, fixes #49846

View file

@ -204,7 +204,7 @@ class PlayIterator:
self._host_states = {} self._host_states = {}
start_at_matched = False start_at_matched = False
batch = inventory.get_hosts(self._play.hosts) batch = inventory.get_hosts(self._play.hosts, order=self._play.order)
self.batch_size = len(batch) self.batch_size = len(batch)
for host in batch: for host in batch:
self._host_states[host.name] = HostState(blocks=self._blocks) self._host_states[host.name] = HostState(blocks=self._blocks)

View file

@ -234,7 +234,7 @@ class PlaybookExecutor:
''' '''
# make sure we have a unique list of hosts # make sure we have a unique list of hosts
all_hosts = self._inventory.get_hosts(play.hosts) all_hosts = self._inventory.get_hosts(play.hosts, order=play.order)
all_hosts_len = len(all_hosts) all_hosts_len = len(all_hosts)
# the serial value can be listed as a scalar or a list of # the serial value can be listed as a scalar or a list of

View file

@ -232,7 +232,9 @@ class StrategyBase:
# make sure that all of the hosts are advanced to their final task. # make sure that all of the hosts are advanced to their final task.
# This should be safe, as everything should be ITERATING_COMPLETE by # This should be safe, as everything should be ITERATING_COMPLETE by
# this point, though the strategy may not advance the hosts itself. # this point, though the strategy may not advance the hosts itself.
[iterator.get_next_task_for_host(host) for host in self._inventory.get_hosts(iterator._play.hosts) if host.name not in self._tqm._unreachable_hosts]
inv_hosts = self._inventory.get_hosts(iterator._play.hosts, order=iterator._play.order)
[iterator.get_next_task_for_host(host) for host in inv_hosts if host.name not in self._tqm._unreachable_hosts]
# save the failed/unreachable hosts, as the run_handlers() # save the failed/unreachable hosts, as the run_handlers()
# method will clear that information during its execution # method will clear that information during its execution

View file

@ -0,0 +1,3 @@
shippable/posix/group1
shippable/posix/group2
shippable/posix/group3

View file

@ -0,0 +1,9 @@
[incremental]
hostB
hostA
hostD
hostC
[incremental:vars]
ansible_connection=local
ansible_python_interpreter='{{ansible_playbook_python}}'

View file

@ -0,0 +1,27 @@
- name: just plain order
hosts: all
gather_facts: false
order: '{{ myorder|default("inventory")}}'
tasks:
- shell: echo '{{inventory_hostname}}' >> hostlist.txt
- name: with serial
hosts: all
gather_facts: false
serial: 1
order: '{{ myorder|default("inventory")}}'
tasks:
- shell: echo '{{inventory_hostname}}' >> shostlist.txt
- name: ensure everything works
hosts: localhost
gather_facts: false
tasks:
- assert:
that:
- item.1 == hostlist[item.0]
- item.1 == shostlist[item.0]
loop: '{{ lookup("indexed_items", inputlist) }}'
vars:
hostlist: '{{lookup("file", "hostlist.txt").splitlines()}}'
shostlist: '{{lookup("file", "shostlist.txt").splitlines()}}'

View file

@ -0,0 +1,13 @@
#!/usr/bin/env bash
set -eux
for EXTRA in '{"inputlist": ["hostB", "hostA", "hostD", "hostC"]}' \
'{"myorder": "inventory", "inputlist": ["hostB", "hostA", "hostD", "hostC"]}' \
'{"myorder": "sorted", "inputlist": ["hostA", "hostB", "hostC", "hostD"]}' \
'{"myorder": "reverse_sorted", "inputlist": ["hostD", "hostC", "hostB", "hostA"]}' \
'{"myorder": "reverse_inventory", "inputlist": ["hostC", "hostD", "hostA", "hostB"]}'
do
rm shostlist.txt hostlist.txt || true
ansible-playbook order.yml --forks 1 -i inventory -e "$EXTRA" "$@"
done