diff --git a/lib/ansible/inventory.py b/lib/ansible/inventory.py index a9d1aec26a..8ddf2c3d2c 100644 --- a/lib/ansible/inventory.py +++ b/lib/ansible/inventory.py @@ -32,11 +32,15 @@ class Inventory(object): systems, or a script that will be called with --list or --host. """ - def __init__(self, host_list=C.DEFAULT_HOST_LIST): + def __init__(self, host_list=C.DEFAULT_HOST_LIST, global_host_vars={}): self._restriction = None self._variables = {} - + self._global_host_vars = global_host_vars # lets us pass in a global var list + # that each host gets + # after we have set up the inventory + # to get all group variables + if type(host_list) == list: self.host_list = host_list self.groups = dict(ungrouped=host_list) @@ -98,6 +102,9 @@ class Inventory(object): return variables + def get_global_vars(self): + return self._global_host_vars + # ***************************************************** def _parse_from_file(self): @@ -177,9 +184,24 @@ class Inventory(object): hosts = [] groups = {} - ungrouped = [] + + # go through once and grab up the global_host_vars from the 'all' group + for item in data: + if type(item) == dict: + if "group" in item and 'all' == item["group"]: + if "vars" in item: + variables = item['vars'] + if type(variables) == list: + for variable in variables: + if len(variable) != 1: + raise errors.AnsibleError("Only one item expected in %s"%(variable)) + k, v = variable.items()[0] + self._global_host_vars[k] = utils.template(v, self._global_host_vars, {}) + elif type(variables) == dict: + self._global_host_vars.update(variables) + for item in data: if type(item) == dict: if "group" in item: @@ -187,7 +209,7 @@ class Inventory(object): group_vars = [] if "vars" in item: - group_vars = item["vars"] + group_vars.extend(item["vars"]) group_hosts = [] if "hosts" in item: diff --git a/lib/ansible/playbook.py b/lib/ansible/playbook.py index 507db625f1..bba7e1f1bd 100644 --- a/lib/ansible/playbook.py +++ b/lib/ansible/playbook.py @@ -103,16 +103,20 @@ class PlayBook(object): self.sudo = sudo self.sudo_pass = sudo_pass self.extra_vars = extra_vars - - self.basedir = os.path.dirname(playbook) - self.playbook = self._parse_playbook(playbook) + self.global_vars = {} if override_hosts is not None: if type(override_hosts) != list: raise errors.AnsibleError("override hosts must be a list") + self.global_vars.update(ansible.inventory.Inventory(host_list).get_global_vars()) self.inventory = ansible.inventory.Inventory(override_hosts) + else: self.inventory = ansible.inventory.Inventory(host_list) + self.global_vars.update(ansible.inventory.Inventory(host_list).get_global_vars()) + + self.basedir = os.path.dirname(playbook) + self.playbook = self._parse_playbook(playbook) # ***************************************************** @@ -123,7 +127,7 @@ class PlayBook(object): play['vars'] = {} if type(play['vars']) not in [dict, list]: raise errors.AnsibleError("'vars' section must contain only key/value pairs") - vars = {} + vars = self.global_vars # translate a list of vars into a dict if type(play['vars']) == list: @@ -151,9 +155,9 @@ class PlayBook(object): ''' load tasks included from external files. ''' # include: some.yml a=2 b=3 c=4 - include_tokens = task['include'].split() - path = utils.path_dwim(dirname, include_tokens[0]) play_vars = self._get_vars(play, dirname) + include_tokens = utils.template(task['include'], play_vars, SETUP_CACHE).split() + path = utils.path_dwim(dirname, include_tokens[0]) include_vars = {} for i,x in enumerate(include_tokens): if x.find("=") != -1: