1
0
Fork 0
mirror of https://github.com/ansible-collections/community.general.git synced 2024-09-14 20:13:21 +02:00

Ensure play order is obeyed ()

* 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 
This commit is contained in:
Brian Coca 2019-02-27 18:20:16 -05:00 committed by GitHub
parent 6583ed0df9
commit cfba6dfe91
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 59 additions and 3 deletions
changelogs/fragments
lib/ansible
test/integration/targets/order

View file

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

View file

@ -190,7 +190,7 @@ class PlayIterator:
self._host_states = {}
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)
for host in batch:
self._host_states[host.name] = HostState(blocks=self._blocks)

View file

@ -255,7 +255,7 @@ class PlaybookExecutor:
'''
# 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)
# the serial value can be listed as a scalar or a list of

View file

@ -226,7 +226,9 @@ class StrategyBase:
# 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 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()
# 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