diff --git a/lib/ansible/inventory.py b/lib/ansible/inventory.py index c3678d64a5..46a5edb589 100644 --- a/lib/ansible/inventory.py +++ b/lib/ansible/inventory.py @@ -168,6 +168,8 @@ class Inventory(object): hosts = [] groups = {} + ungrouped = [] + for item in data: if type(item) == dict: if "group" in item: @@ -186,13 +188,14 @@ class Inventory(object): groups[group_name] = group_hosts hosts.extend(group_hosts) - # or a host elif "host" in item: host_name = self._parse_yaml_host(item) hosts.append(host_name) + ungrouped.append(host_name) else: host_name = self._parse_yaml_host(item) hosts.append(host_name) + ungrouped.append(host_name) # filter duplicate hosts output_hosts = [] @@ -200,6 +203,18 @@ class Inventory(object): if host not in output_hosts: output_hosts.append(host) + if len(ungrouped) > 0 : + # hosts can be defined top-level, but also in a group + really_ungrouped = [] + for host in ungrouped: + already_grouped = False + for name, group_hosts in groups.items(): + if host in group_hosts: + already_grouped = True + if not already_grouped: + really_ungrouped.append(host) + groups["ungrouped"] = really_ungrouped + return output_hosts, groups def _parse_yaml_host(self, item, variables=[]): diff --git a/test/TestInventory.py b/test/TestInventory.py index a0b0b74d16..21cccf5fe8 100644 --- a/test/TestInventory.py +++ b/test/TestInventory.py @@ -51,6 +51,13 @@ class TestInventory(unittest.TestCase): expected_hosts=['thor', 'odin', 'loki'] assert hosts == expected_hosts + def test_simple_ungrouped(self): + inventory = self.simple_inventory() + hosts = inventory.list_hosts("ungrouped") + + expected_hosts=['jupiter', 'saturn'] + assert hosts == expected_hosts + def test_simple_combined(self): inventory = self.simple_inventory() hosts = inventory.list_hosts("norse:greek") @@ -176,6 +183,13 @@ class TestInventory(unittest.TestCase): expected_hosts=['thor', 'odin', 'loki'] assert hosts == expected_hosts + def test_simple_ungrouped(self): + inventory = self.yaml_inventory() + hosts = inventory.list_hosts("ungrouped") + + expected_hosts=['jupiter'] + assert hosts == expected_hosts + def test_yaml_combined(self): inventory = self.yaml_inventory() hosts = inventory.list_hosts("norse:greek") diff --git a/test/yaml_hosts b/test/yaml_hosts index 95f278b91a..7568ff4bda 100644 --- a/test/yaml_hosts +++ b/test/yaml_hosts @@ -5,6 +5,8 @@ vars: - moon: titan +- zeus + - group: greek hosts: - zeus