Squashed commit of the following:
commit 4430ce3eefcdff0b0ceffea0ef66ea8e876a807d Merge:631783b
649963c
Author: Michael DeHaan <michael.dehaan@gmail.com> Date: Thu Jul 12 01:28:43 2012 -0400 Merge branch 'host-groups' of https://github.com/dagwieers/ansible into daggroups commit649963ca2c
Author: Dag Wieërs <dag@wieers.com> Date: Thu Jul 12 23:01:00 2012 +0200 Added comments in the example yaml file as requested commit7f9718f185
Author: Dag Wieërs <dag@wieers.com> Date: Thu Jul 12 22:49:38 2012 +0200 Add the default nose color too, to test specific overrides commiteb63b9e899
Author: Dag Wieërs <dag@wieers.com> Date: Thu Jul 12 22:44:35 2012 +0200 Introduce comics and cartoons to test yaml groups defined on a per-node basis commitaa13d23307
Author: Dag Wieërs <dag@wieers.com> Date: Thu Jul 12 19:33:15 2012 +0200 A small fix to revert to old state commit264ebaa77c
Author: Dag Wieërs <dag@wieers.com> Date: Thu Jul 12 19:31:51 2012 +0200 Combine both yaml unit tests into one example file commit7db49a8048
Author: Dag Wieërs <dag@wieers.com> Date: Thu Jul 12 16:46:53 2012 +0200 Might as well fix this too commitf36c6c8c5b
Author: Dag Wieërs <dag@wieers.com> 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. commita96f681352
Author: Dag Wieërs <dag@wieers.com> 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 ] ----
This commit is contained in:
parent
86c25fd82d
commit
60f295f7a0
3 changed files with 90 additions and 3 deletions
|
@ -106,6 +106,7 @@ class InventoryParserYaml(object):
|
||||||
|
|
||||||
elif type(item) == dict and 'host' in item:
|
elif type(item) == dict and 'host' in item:
|
||||||
host = self._make_host(item['host'])
|
host = self._make_host(item['host'])
|
||||||
|
|
||||||
vars = item.get('vars', {})
|
vars = item.get('vars', {})
|
||||||
if type(vars)==list:
|
if type(vars)==list:
|
||||||
varlist, vars = vars, {}
|
varlist, vars = vars, {}
|
||||||
|
@ -113,5 +114,23 @@ class InventoryParserYaml(object):
|
||||||
vars.update(subitem)
|
vars.update(subitem)
|
||||||
for (k,v) in vars.items():
|
for (k,v) in vars.items():
|
||||||
host.set_variable(k,v)
|
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:
|
if host not in grouped_hosts:
|
||||||
ungrouped.add_host(host)
|
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]
|
||||||
|
|
|
@ -221,15 +221,14 @@ class TestInventory(unittest.TestCase):
|
||||||
def test_yaml(self):
|
def test_yaml(self):
|
||||||
inventory = self.yaml_inventory()
|
inventory = self.yaml_inventory()
|
||||||
hosts = inventory.list_hosts()
|
hosts = inventory.list_hosts()
|
||||||
print hosts
|
expected_hosts=['garfield', 'goofy', 'hera', 'jerry', 'jupiter', 'loki', 'mars', 'mickey', 'odie', 'odin', 'poseidon', 'saturn', 'thor', 'tom', 'zeus']
|
||||||
expected_hosts=['jupiter', 'saturn', 'mars', 'zeus', 'hera', 'poseidon', 'thor', 'odin', 'loki']
|
|
||||||
self.compare(hosts, expected_hosts)
|
self.compare(hosts, expected_hosts)
|
||||||
|
|
||||||
def test_yaml_all(self):
|
def test_yaml_all(self):
|
||||||
inventory = self.yaml_inventory()
|
inventory = self.yaml_inventory()
|
||||||
hosts = inventory.list_hosts('all')
|
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)
|
self.compare(hosts, expected_hosts)
|
||||||
|
|
||||||
def test_yaml_norse(self):
|
def test_yaml_norse(self):
|
||||||
|
@ -323,3 +322,29 @@ class TestInventory(unittest.TestCase):
|
||||||
assert 'group_names' in vars
|
assert 'group_names' in vars
|
||||||
assert sorted(vars['group_names']) == [ 'norse', 'ruler' ]
|
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'}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
---
|
---
|
||||||
|
|
||||||
|
# Below is the original way of defining hosts and groups.
|
||||||
|
|
||||||
- jupiter
|
- jupiter
|
||||||
- host: saturn
|
- host: saturn
|
||||||
vars:
|
vars:
|
||||||
|
@ -37,3 +39,44 @@
|
||||||
- group: multiple
|
- group: multiple
|
||||||
hosts:
|
hosts:
|
||||||
- saturn
|
- 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
|
||||||
|
|
Loading…
Reference in a new issue