diff --git a/lib/ansible/inventory/__init__.py b/lib/ansible/inventory/__init__.py index 2de5634da1b..7d1dfbb0a28 100644 --- a/lib/ansible/inventory/__init__.py +++ b/lib/ansible/inventory/__init__.py @@ -85,15 +85,22 @@ class Inventory(object): patterns = pattern.replace(";",":").split(":") groups = self.get_groups() - for group in groups: - for host in group.get_hosts(): - for pat in patterns: - if group.name == pat or pat == 'all' or self._match(host.name, pat): - #must test explicitly for None because [] means no hosts allowed - if self._restriction==None: - hosts[host.name] = host - elif host.name in self._restriction: - hosts[host.name] = host + for pat in patterns: + if pat.startswith("!"): + pat = pat[1:] + inverted = True + else: + inverted = False + for group in groups: + for host in group.get_hosts(): + if group.name == pat or pat == 'all' or self._match(host.name, pat): + #must test explicitly for None because [] means no hosts allowed + if self._restriction==None or host.name in self._restriction: + if inverted: + if host.name in hosts: + del hosts[host.name] + else: + hosts[host.name] = host return sorted(hosts.values(), key=lambda x: x.name) def get_groups(self):