From b8b206005c8ac66a327b53ea639b7c36a05aea24 Mon Sep 17 00:00:00 2001 From: James Cammarata Date: Tue, 21 Jul 2015 00:18:12 -0400 Subject: [PATCH] Generalize extra variable parsing and loading Fixes #11352 --- lib/ansible/cli/adhoc.py | 4 +++- lib/ansible/cli/playbook.py | 18 ++---------------- lib/ansible/utils/vars.py | 17 +++++++++++++++++ 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/lib/ansible/cli/adhoc.py b/lib/ansible/cli/adhoc.py index 4ea3bab78c4..8fabed3256f 100644 --- a/lib/ansible/cli/adhoc.py +++ b/lib/ansible/cli/adhoc.py @@ -17,13 +17,14 @@ ######################################################## from ansible import constants as C +from ansible.cli import CLI from ansible.errors import AnsibleOptionsError from ansible.executor.task_queue_manager import TaskQueueManager from ansible.inventory import Inventory from ansible.parsing import DataLoader from ansible.parsing.splitter import parse_kv from ansible.playbook.play import Play -from ansible.cli import CLI +from ansible.utils.vars import load_extra_vars from ansible.vars import VariableManager ######################################################## @@ -100,6 +101,7 @@ class AdHocCLI(CLI): loader = DataLoader(vault_password=vault_pass) variable_manager = VariableManager() + variable_manager.extra_vars = load_extra_vars(loader=loader, options=self.options) inventory = Inventory(loader=loader, variable_manager=variable_manager, host_list=self.options.inventory) variable_manager.set_inventory(inventory) diff --git a/lib/ansible/cli/playbook.py b/lib/ansible/cli/playbook.py index 1eab61eb4d3..2fa13aae25f 100644 --- a/lib/ansible/cli/playbook.py +++ b/lib/ansible/cli/playbook.py @@ -33,7 +33,7 @@ from ansible.playbook import Playbook from ansible.playbook.task import Task from ansible.utils.display import Display from ansible.utils.unicode import to_unicode -from ansible.utils.vars import combine_vars +from ansible.utils.vars import load_extra_vars from ansible.vars import VariableManager #--------------------------------------------------------------------------------------------------- @@ -103,20 +103,6 @@ class PlaybookCLI(CLI): loader = DataLoader(vault_password=vault_pass) - extra_vars = {} - for extra_vars_opt in self.options.extra_vars: - extra_vars_opt = to_unicode(extra_vars_opt, errors='strict') - if extra_vars_opt.startswith(u"@"): - # Argument is a YAML file (JSON is a subset of YAML) - data = loader.load_from_file(extra_vars_opt[1:]) - elif extra_vars_opt and extra_vars_opt[0] in u'[{': - # Arguments as YAML - data = loader.load(extra_vars_opt) - else: - # Arguments as Key-value - data = parse_kv(extra_vars_opt) - extra_vars = combine_vars(extra_vars, data) - # FIXME: this should be moved inside the playbook executor code only_tags = self.options.tags.split(",") skip_tags = self.options.skip_tags @@ -134,7 +120,7 @@ class PlaybookCLI(CLI): # create the variable manager, which will be shared throughout # the code, ensuring a consistent view of global variables variable_manager = VariableManager() - variable_manager.extra_vars = extra_vars + variable_manager.extra_vars = load_extra_vars(loader=loader, options=self.options) # create the inventory, and filter it based on the subset specified (if any) inventory = Inventory(loader=loader, variable_manager=variable_manager, host_list=self.options.inventory) diff --git a/lib/ansible/utils/vars.py b/lib/ansible/utils/vars.py index c033c0c2588..bfbc9d1a821 100644 --- a/lib/ansible/utils/vars.py +++ b/lib/ansible/utils/vars.py @@ -21,6 +21,8 @@ __metaclass__ = type from ansible import constants as C +from ansible.parsing.splitter import parse_kv +from ansible.utils.unicode import to_unicode def combine_vars(a, b): @@ -49,3 +51,18 @@ def merge_hash(a, b): return result +def load_extra_vars(loader, options): + extra_vars = {} + for extra_vars_opt in options.extra_vars: + extra_vars_opt = to_unicode(extra_vars_opt, errors='strict') + if extra_vars_opt.startswith(u"@"): + # Argument is a YAML file (JSON is a subset of YAML) + data = loader.load_from_file(extra_vars_opt[1:]) + elif extra_vars_opt and extra_vars_opt[0] in u'[{': + # Arguments as YAML + data = loader.load(extra_vars_opt) + else: + # Arguments as Key-value + data = parse_kv(extra_vars_opt) + extra_vars = combine_vars(extra_vars, data) + return extra_vars