InventoryDir: another fix for the host.groups list

In some cases, where a host is mentioned in multiple groups, and those
groups are referenced in multiple ini files, a group could still contain
multiple instances of a group in its host,groups list, where only one of them
is the right group, that exists in the inventory.
This commit is contained in:
Serge van Ginderachter 2014-04-04 09:27:44 +02:00
parent d3eaa1b79e
commit e36e2d38fe

View file

@ -171,8 +171,15 @@ class InventoryDirectory(object):
# same host name but different object, merge # same host name but different object, merge
self._merge_hosts(grouphosts[host.name], host) self._merge_hosts(grouphosts[host.name], host)
else: else:
# new membership # new membership, add host to group from self
# group from self will also be added again to host.groups, but
# as different object
group.add_host(self.hosts[host.name]) group.add_host(self.hosts[host.name])
# now remove this the old object for group in host.groups
for hostgroup in [g for g in host.groups]:
if hostgroup.name == group.name and hostgroup != self.groups[group.name]:
self.hosts[host.name].groups.remove(hostgroup)
# group child membership relation # group child membership relation
for newchild in newgroup.child_groups: for newchild in newgroup.child_groups:
@ -204,6 +211,18 @@ class InventoryDirectory(object):
if host.name != newhost.name: if host.name != newhost.name:
raise errors.AnsibleError("Cannot merge host %s with %s" % (host.name, newhost.name)) raise errors.AnsibleError("Cannot merge host %s with %s" % (host.name, newhost.name))
# group membership relation
for newgroup in newhost.groups:
# dict with existing groups:
hostgroups = dict([(g.name, g) for g in host.groups])
# check if new group is already known as a group
if newgroup.name not in hostgroups:
if newgroup.name not in self.groups:
# group does not exist yet in self, import him
self.groups[newgroup.name] = newgroup
# group now exists but doesn't have host yet
self.groups[newgroup.name].add_host(host)
# variables # variables
host.vars = utils.combine_vars(host.vars, newhost.vars) host.vars = utils.combine_vars(host.vars, newhost.vars)