From 2e0472e03bae5535999a34377862fc4b142f4d54 Mon Sep 17 00:00:00 2001 From: Toshio Kuratomi Date: Mon, 19 Jan 2015 13:39:45 -0800 Subject: [PATCH] Allow ansible-playbook to determine if an invalid limit is specified --- bin/ansible-playbook | 18 ++++++++++++++++-- v2/bin/ansible-playbook | 20 ++++++++++++++++++-- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/bin/ansible-playbook b/bin/ansible-playbook index 03ca513c12..6390bcba83 100755 --- a/bin/ansible-playbook +++ b/bin/ansible-playbook @@ -166,9 +166,23 @@ def main(args): raise errors.AnsibleError("the playbook: %s does not appear to be a file" % playbook) inventory = ansible.inventory.Inventory(options.inventory, vault_password=vault_pass) - inventory.subset(options.subset) + + # Note: slightly wrong, this is written so that implicit localhost + # (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 in v2 + no_hosts = False if len(inventory.list_hosts()) == 0: - utils.warning("provided hosts list is empty") + # Empty inventory + utils.warning("provided hosts list is empty, only localhost is available") + no_hosts = True + inventory.subset(options.subset) + if len(inventory.list_hosts()) == 0 and no_hosts is False: + # Invalid limit + raise errors.AnsibleError("Specified --limit does not match any hosts") # run all playbooks specified on the command line for playbook in args: diff --git a/v2/bin/ansible-playbook b/v2/bin/ansible-playbook index 03392e13f9..4a60f84c9f 100755 --- a/v2/bin/ansible-playbook +++ b/v2/bin/ansible-playbook @@ -15,7 +15,9 @@ from ansible.playbook.task import Task from ansible.utils.cli import base_parser from ansible.utils.vars import combine_vars from ansible.vars import VariableManager -from ansible.utils import warning + +# Implement an ansible.utils.warning() function later +warning = print #--------------------------------------------------------------------------------------------------- @@ -137,9 +139,23 @@ def main(args): # create the inventory, and filter it based on the subset specified (if any) inventory = Inventory(loader=loader, variable_manager=variable_manager, host_list=options.inventory) - inventory.subset(options.subset) + + # Note: slightly wrong, this is written so that implicit localhost + # (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()) + no_hosts = False if len(inventory.list_hosts()) == 0: + # Empty inventory warning("provided hosts list is empty, only localhost is available") + no_hosts = True + inventory.subset(options.subset) + if len(inventory.list_hosts()) == 0 and no_hosts is False: + # Invalid limit + raise errors.AnsibleError("Specified --limit does not match any hosts") # create the playbook executor, which manages running the plays # via a task queue manager