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
pull/52184/head
Matt Martz 5 years ago committed by GitHub
parent 847d089d6b
commit cdb53ff1a4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -477,9 +477,6 @@ class CLI(with_metaclass(ABCMeta, object)):
# create the inventory, and filter it based on the subset specified (if any)
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
# 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'")
no_hosts = True
inventory.subset(subset)
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")
return hosts

@ -99,6 +99,14 @@ class PlaybookCLI(CLI):
# create base objects
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
if context.CLIARGS['flush_cache']:
self._flush_cache(inventory, variable_manager)

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

@ -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
Loading…
Cancel
Save