From 60f295f7a0d8901c2ecf7d2e7652ce3e80810334 Mon Sep 17 00:00:00 2001 From: Michael DeHaan Date: Thu, 12 Jul 2012 01:29:51 -0400 Subject: [PATCH] Squashed commit of the following: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 4430ce3eefcdff0b0ceffea0ef66ea8e876a807d Merge: 631783b 649963c Author: Michael DeHaan Date: Thu Jul 12 01:28:43 2012 -0400 Merge branch 'host-groups' of https://github.com/dagwieers/ansible into daggroups commit 649963ca2c2610b97a90d2449132a57ae6b39ec9 Author: Dag Wieërs Date: Thu Jul 12 23:01:00 2012 +0200 Added comments in the example yaml file as requested commit 7f9718f185ec991bc165c4a52b2468cf41f4c349 Author: Dag Wieërs Date: Thu Jul 12 22:49:38 2012 +0200 Add the default nose color too, to test specific overrides commit eb63b9e899318ce0c26902ca73af50135a6224e4 Author: Dag Wieërs Date: Thu Jul 12 22:44:35 2012 +0200 Introduce comics and cartoons to test yaml groups defined on a per-node basis commit aa13d233078b825a8057bebf35ed478342cf4e43 Author: Dag Wieërs Date: Thu Jul 12 19:33:15 2012 +0200 A small fix to revert to old state commit 264ebaa77c4243f2e9117e8d1168dc2f2eed7ee2 Author: Dag Wieërs Date: Thu Jul 12 19:31:51 2012 +0200 Combine both yaml unit tests into one example file commit 7db49a8048e78402c4c9a0a6cb2604689280fbbb Author: Dag Wieërs Date: Thu Jul 12 16:46:53 2012 +0200 Might as well fix this too commit f36c6c8c5b419865939c7e2b0b26f6c97255fdc8 Author: Dag Wieërs Date: Thu Jul 12 16:42:00 2012 +0200 Added unit tests for host-groups patch For the unit test I chose to keep the original yaml file in place as a reference. This patch also includes a fix. commit a96f6813522c5ae8b2be4514a2de56a775c6b7b0 Author: Dag Wieërs Date: Thu Jul 12 12:30:43 2012 +0200 Allow groups to be defined on a per-host basis This makes it possible to define on a per-host basis what groups a host is in. When managing a large set of systems it makes it easier to ensure each of the systems is defined in a set of groups (e.g. production/qa/development, linux/solaris/aix) rather than having to add systems to multiple disconnected groups. ---- - host: system01 - host: system02 - host: system03 - group: linux hosts: - system01 - system02 - group: solaris hosts: - system03 - group: production hosts: - system01 - system03 - group: qa - system02 - group: dbserver hosts: - system01 - group: ntpserver hosts: - system02 - group: webserver - system03 ---- Can be redefined as: ---- - host: system01 groups: [ linux, production, dbserver ] - host: system02 groups: [ linux, qa, ntpserver ] - host: system03 groups: [ solaris, production, webserver ] ---- --- lib/ansible/inventory/yaml.py | 19 ++++++++++++++++ test/TestInventory.py | 31 ++++++++++++++++++++++--- test/yaml_hosts | 43 +++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+), 3 deletions(-) diff --git a/lib/ansible/inventory/yaml.py b/lib/ansible/inventory/yaml.py index 0c2853ad94..9b950e21d6 100644 --- a/lib/ansible/inventory/yaml.py +++ b/lib/ansible/inventory/yaml.py @@ -106,6 +106,7 @@ class InventoryParserYaml(object): elif type(item) == dict and 'host' in item: host = self._make_host(item['host']) + vars = item.get('vars', {}) if type(vars)==list: varlist, vars = vars, {} @@ -113,5 +114,23 @@ class InventoryParserYaml(object): vars.update(subitem) for (k,v) in vars.items(): host.set_variable(k,v) + + groups = item.get('groups', {}) + if type(groups) in [ str, unicode ]: + groups = [ groups ] + if type(groups)==list: + for subitem in groups: + if subitem in self.groups: + group = self.groups[subitem] + else: + group = Group(subitem) + self.groups[group.name] = group + all.add_child_group(group) + group.add_host(host) + grouped_hosts.append(host) + if host not in grouped_hosts: ungrouped.add_host(host) + + # make sure ungrouped.hosts is the complement of grouped_hosts + ungrouped_hosts = [host for host in ungrouped.hosts if host not in grouped_hosts] diff --git a/test/TestInventory.py b/test/TestInventory.py index ef551e5816..bc1cbde031 100644 --- a/test/TestInventory.py +++ b/test/TestInventory.py @@ -221,15 +221,14 @@ class TestInventory(unittest.TestCase): def test_yaml(self): inventory = self.yaml_inventory() hosts = inventory.list_hosts() - print hosts - expected_hosts=['jupiter', 'saturn', 'mars', 'zeus', 'hera', 'poseidon', 'thor', 'odin', 'loki'] + expected_hosts=['garfield', 'goofy', 'hera', 'jerry', 'jupiter', 'loki', 'mars', 'mickey', 'odie', 'odin', 'poseidon', 'saturn', 'thor', 'tom', 'zeus'] self.compare(hosts, expected_hosts) def test_yaml_all(self): inventory = self.yaml_inventory() hosts = inventory.list_hosts('all') - expected_hosts=['jupiter', 'saturn', 'mars', 'zeus', 'hera', 'poseidon', 'thor', 'odin', 'loki'] + expected_hosts=['garfield', 'goofy', 'hera', 'jerry', 'jupiter', 'loki', 'mars', 'mickey', 'odie', 'odin', 'poseidon', 'saturn', 'thor', 'tom', 'zeus'] self.compare(hosts, expected_hosts) def test_yaml_norse(self): @@ -323,3 +322,29 @@ class TestInventory(unittest.TestCase): assert 'group_names' in vars assert sorted(vars['group_names']) == [ 'norse', 'ruler' ] + def test_yaml_some_animals(self): + inventory = self.yaml_inventory() + hosts = inventory.list_hosts("cat:mouse") + expected_hosts=['garfield', 'jerry', 'mickey', 'tom'] + self.compare(hosts, expected_hosts) + + def test_yaml_comic(self): + inventory = self.yaml_inventory() + hosts = inventory.list_hosts("comic") + expected_hosts=['garfield', 'odie'] + self.compare(hosts, expected_hosts) + + def test_yaml_orange(self): + inventory = self.yaml_inventory() + hosts = inventory.list_hosts("orange") + expected_hosts=['garfield', 'goofy'] + self.compare(hosts, expected_hosts) + + def test_yaml_garfield_vars(self): + inventory = self.yaml_inventory() + vars = inventory.get_variables('garfield') + assert vars == {'ears': 'pointy', + 'inventory_hostname': 'garfield', + 'group_names': ['cat', 'comic', 'orange'], + 'nose': 'pink'} + diff --git a/test/yaml_hosts b/test/yaml_hosts index cf73e8d453..adfcf5bce5 100644 --- a/test/yaml_hosts +++ b/test/yaml_hosts @@ -1,5 +1,7 @@ --- +# Below is the original way of defining hosts and groups. + - jupiter - host: saturn vars: @@ -37,3 +39,44 @@ - group: multiple hosts: - saturn + +# Here we demonstrate that groups can be defined on a per-host basis. +# When managing a large set of systems this format makes it easier to +# ensure each of the systems is defined in a set of groups, compared +# to the standard group definitions, where a host may need to be added +# to multiple disconnected groups. + +- host: garfield + groups: [ comic, cat, orange ] + vars: + - nose: pink + +- host: odie + groups: [ comic, dog, yellow ] + +- host: mickey + groups: [ cartoon, mouse, red ] + +- host: goofy + groups: [ cartoon, dog, orange ] + +- host: tom + groups: [ cartoon, cat, gray ] + +- host: jerry + groups: [ cartoon, mouse, brown ] + +- group: cat + vars: + - ears: pointy + - nose: black + +- group: dog + vars: + - ears: flappy + - nose: black + +- group: mouse + vars: + - ears: round + - nose: black