Restore behavior for detecting only localhost, and no limit match. Fixes #52152 (#52172)

* Restore behavior for detecting only localhost, and no limit match. Fixes #52152

* Add test for non-matching limit
This commit is contained in:
Matt Martz 2019-02-13 11:52:30 -06:00 committed by GitHub
parent 847d089d6b
commit cdb53ff1a4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 27 additions and 4 deletions

View file

@ -477,9 +477,6 @@ class CLI(with_metaclass(ABCMeta, object)):
# create the inventory, and filter it based on the subset specified (if any) # create the inventory, and filter it based on the subset specified (if any)
inventory = InventoryManager(loader=loader, sources=options['inventory']) inventory = InventoryManager(loader=loader, sources=options['inventory'])
subset = options.get('subset', False)
if subset:
inventory.subset(subset)
# create the variable manager, which will be shared throughout # create the variable manager, which will be shared throughout
# the code, ensuring a consistent view of global variables # the code, ensuring a consistent view of global variables
@ -497,8 +494,10 @@ class CLI(with_metaclass(ABCMeta, object)):
display.warning("provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'") display.warning("provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'")
no_hosts = True no_hosts = True
inventory.subset(subset)
hosts = inventory.list_hosts(pattern) hosts = inventory.list_hosts(pattern)
if len(hosts) == 0 and no_hosts is False: if not hosts and no_hosts is False:
raise AnsibleError("Specified hosts and/or --limit does not match any hosts") raise AnsibleError("Specified hosts and/or --limit does not match any hosts")
return hosts return hosts

View file

@ -99,6 +99,14 @@ class PlaybookCLI(CLI):
# create base objects # create base objects
loader, inventory, variable_manager = self._play_prereqs() loader, inventory, variable_manager = self._play_prereqs()
# (which is not returned in list_hosts()) is taken into account for
# warning if inventory is empty. But it can't be taken into account for
# checking if limit doesn't match any hosts. Instead we don't worry about
# limit if only implicit localhost was in inventory to start with.
#
# Fix this when we rewrite inventory by making localhost a real host (and thus show up in list_hosts())
CLI.get_host_list(inventory, context.CLIARGS['subset'])
# flush fact cache if requested # flush fact cache if requested
if context.CLIARGS['flush_cache']: if context.CLIARGS['flush_cache']:
self._flush_cache(inventory, variable_manager) self._flush_cache(inventory, variable_manager)

View file

@ -0,0 +1 @@
shippable/posix/group3

View file

@ -0,0 +1,4 @@
- hosts: all
gather_facts: false
tasks:
- ping:

View file

@ -0,0 +1,11 @@
#!/usr/bin/env bash
set -x
# https://github.com/ansible/ansible/issues/52152
# Ensure that non-matching limit causes failure with rc 1
ansible-playbook -i ../../inventory --limit foo playbook.yml
if [ "$?" != "1" ]; then
echo "Non-matching limit should cause failure"
exit 1
fi