mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
parent
6e56a61535
commit
6b46cc5c73
5 changed files with 29 additions and 6 deletions
|
@ -221,7 +221,7 @@ class Inventory(object):
|
||||||
results.append(item)
|
results.append(item)
|
||||||
return results
|
return results
|
||||||
|
|
||||||
def get_hosts(self, pattern="all", ignore_limits=False, ignore_restrictions=False):
|
def get_hosts(self, pattern="all", ignore_limits=False, ignore_restrictions=False, order=None):
|
||||||
"""
|
"""
|
||||||
Takes a pattern or list of patterns and returns a list of matching
|
Takes a pattern or list of patterns and returns a list of matching
|
||||||
inventory host names, taking into account any active restrictions
|
inventory host names, taking into account any active restrictions
|
||||||
|
@ -258,7 +258,21 @@ class Inventory(object):
|
||||||
seen = set()
|
seen = set()
|
||||||
HOSTS_PATTERNS_CACHE[pattern_hash] = [x for x in hosts if x not in seen and not seen.add(x)]
|
HOSTS_PATTERNS_CACHE[pattern_hash] = [x for x in hosts if x not in seen and not seen.add(x)]
|
||||||
|
|
||||||
return HOSTS_PATTERNS_CACHE[pattern_hash][:]
|
# sort hosts list if needed (should only happen when called from strategy)
|
||||||
|
if order in ['sorted', 'reverse_sorted']:
|
||||||
|
from operator import attrgetter
|
||||||
|
hosts = sorted(HOSTS_PATTERNS_CACHE[pattern_hash][:], key=attrgetter('name'), reverse=(order == 'reverse_sorted'))
|
||||||
|
elif order == 'reverse_inventory':
|
||||||
|
hosts = sorted(HOSTS_PATTERNS_CACHE[pattern_hash][:], reverse=True)
|
||||||
|
else:
|
||||||
|
hosts = HOSTS_PATTERNS_CACHE[pattern_hash][:]
|
||||||
|
if order == 'shuffle':
|
||||||
|
from random import shuffle
|
||||||
|
shuffle(hosts)
|
||||||
|
elif order not in [None, 'inventory']:
|
||||||
|
AnsibleError("Invalid 'order' specified for inventory hosts: %s" % order)
|
||||||
|
|
||||||
|
return hosts
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def split_host_pattern(cls, pattern):
|
def split_host_pattern(cls, pattern):
|
||||||
|
|
|
@ -56,7 +56,7 @@ class Play(Base, Taggable, Become):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# =================================================================================
|
# =================================================================================
|
||||||
# Connection-Related Attributes
|
_name = FieldAttribute(isa='string', default='', always_post_validate=True)
|
||||||
|
|
||||||
# TODO: generalize connection
|
# TODO: generalize connection
|
||||||
_accelerate = FieldAttribute(isa='bool', default=False, always_post_validate=True)
|
_accelerate = FieldAttribute(isa='bool', default=False, always_post_validate=True)
|
||||||
|
@ -69,7 +69,6 @@ class Play(Base, Taggable, Become):
|
||||||
_gather_subset = FieldAttribute(isa='barelist', default=None, always_post_validate=True)
|
_gather_subset = FieldAttribute(isa='barelist', default=None, always_post_validate=True)
|
||||||
_gather_timeout = FieldAttribute(isa='int', default=None, always_post_validate=True)
|
_gather_timeout = FieldAttribute(isa='int', default=None, always_post_validate=True)
|
||||||
_hosts = FieldAttribute(isa='list', required=True, listof=string_types, always_post_validate=True)
|
_hosts = FieldAttribute(isa='list', required=True, listof=string_types, always_post_validate=True)
|
||||||
_name = FieldAttribute(isa='string', default='', always_post_validate=True)
|
|
||||||
|
|
||||||
# Variable Attributes
|
# Variable Attributes
|
||||||
_vars_files = FieldAttribute(isa='list', default=[], priority=99)
|
_vars_files = FieldAttribute(isa='list', default=[], priority=99)
|
||||||
|
@ -90,6 +89,7 @@ class Play(Base, Taggable, Become):
|
||||||
_max_fail_percentage = FieldAttribute(isa='percent', always_post_validate=True)
|
_max_fail_percentage = FieldAttribute(isa='percent', always_post_validate=True)
|
||||||
_serial = FieldAttribute(isa='list', default=[], always_post_validate=True)
|
_serial = FieldAttribute(isa='list', default=[], always_post_validate=True)
|
||||||
_strategy = FieldAttribute(isa='string', default=C.DEFAULT_STRATEGY, always_post_validate=True)
|
_strategy = FieldAttribute(isa='string', default=C.DEFAULT_STRATEGY, always_post_validate=True)
|
||||||
|
_order = FieldAttribute(isa='string', always_post_validate=True)
|
||||||
|
|
||||||
# =================================================================================
|
# =================================================================================
|
||||||
|
|
||||||
|
|
|
@ -918,3 +918,11 @@ class StrategyBase:
|
||||||
display.vv("META: %s" % msg)
|
display.vv("META: %s" % msg)
|
||||||
|
|
||||||
return [TaskResult(target_host, task, result)]
|
return [TaskResult(target_host, task, result)]
|
||||||
|
|
||||||
|
def get_hosts_left(self, iterator):
|
||||||
|
|
||||||
|
hosts_left = []
|
||||||
|
for host in self._inventory.get_hosts(iterator._play.hosts, order=iterator._play.order):
|
||||||
|
if host.name not in self._tqm._unreachable_hosts:
|
||||||
|
hosts_left.append(host)
|
||||||
|
return hosts_left
|
||||||
|
|
|
@ -61,7 +61,8 @@ class StrategyModule(StrategyBase):
|
||||||
work_to_do = True
|
work_to_do = True
|
||||||
while work_to_do and not self._tqm._terminated:
|
while work_to_do and not self._tqm._terminated:
|
||||||
|
|
||||||
hosts_left = [host for host in self._inventory.get_hosts(iterator._play.hosts) if host.name not in self._tqm._unreachable_hosts]
|
hosts_left = self.get_hosts_left(iterator)
|
||||||
|
|
||||||
if len(hosts_left) == 0:
|
if len(hosts_left) == 0:
|
||||||
self._tqm.send_callback('v2_playbook_on_no_hosts_remaining')
|
self._tqm.send_callback('v2_playbook_on_no_hosts_remaining')
|
||||||
result = False
|
result = False
|
||||||
|
|
|
@ -167,7 +167,7 @@ class StrategyModule(StrategyBase):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
display.debug("getting the remaining hosts for this loop")
|
display.debug("getting the remaining hosts for this loop")
|
||||||
hosts_left = [host for host in self._inventory.get_hosts(iterator._play.hosts) if host.name not in self._tqm._unreachable_hosts]
|
hosts_left = self.get_hosts_left(iterator)
|
||||||
display.debug("done getting the remaining hosts for this loop")
|
display.debug("done getting the remaining hosts for this loop")
|
||||||
|
|
||||||
# queue up this task for each host in the inventory
|
# queue up this task for each host in the inventory
|
||||||
|
|
Loading…
Reference in a new issue