From dc35dd99c0b96660da7a62fbc93fc92646189a89 Mon Sep 17 00:00:00 2001 From: Seth Vidal Date: Wed, 2 May 2012 18:29:46 -0400 Subject: [PATCH 1/2] inventory group 'all' variables are global variables applied to every host and available all over they are read in so that ones defined first can be used to define the later ones. --- lib/ansible/inventory.py | 30 ++++++++++++++++++++++++++---- lib/ansible/playbook.py | 16 ++++++++++------ 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/lib/ansible/inventory.py b/lib/ansible/inventory.py index a9d1aec26af..8ddf2c3d2ce 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 507db625f18..bba7e1f1bd5 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: From 38ea61054f168299ce2018ccde77100ed86dc6f7 Mon Sep 17 00:00:00 2001 From: Seth Vidal Date: Thu, 3 May 2012 15:52:02 -0400 Subject: [PATCH 2/2] if a playbook has no vars - still include the global vars --- lib/ansible/playbook.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ansible/playbook.py b/lib/ansible/playbook.py index bba7e1f1bd5..9f15784f1f4 100644 --- a/lib/ansible/playbook.py +++ b/lib/ansible/playbook.py @@ -135,7 +135,7 @@ class PlayBook(object): k, v = item.items()[0] vars[k] = v else: - vars = play['vars'] + vars.update(play['vars']) vars_prompt = play.get('vars_prompt', {}) if type(vars_prompt) != dict: