From 2c77cf1a49557294567bd2684cb09c403363820e Mon Sep 17 00:00:00 2001 From: Daniel Hokka Zakrisson Date: Wed, 31 Oct 2012 16:37:26 +0100 Subject: [PATCH 1/3] Skip tasks with a with_* that is empty --- lib/ansible/runner/__init__.py | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/lib/ansible/runner/__init__.py b/lib/ansible/runner/__init__.py index 6d4feaf7fda..60f87d9ab94 100644 --- a/lib/ansible/runner/__init__.py +++ b/lib/ansible/runner/__init__.py @@ -290,27 +290,25 @@ class Runner(object): inject['groups'] = self.inventory.groups_list() # allow with_foo to work in playbooks... - items = [] + items = None items_plugin = self.module_vars.get('items_lookup_plugin', None) - if items_plugin is not None: + if items_plugin is not None and items_plugin in self.lookup_plugins: items_terms = self.module_vars.get('items_lookup_terms', '') - if items_plugin in self.lookup_plugins: - items_terms = utils.varReplaceWithItems(self.basedir, items_terms, inject) - items = self.lookup_plugins[items_plugin].run(items_terms) + items_terms = utils.varReplaceWithItems(self.basedir, items_terms, inject) + items = self.lookup_plugins[items_plugin].run(items_terms) + if type(items) != list: + raise errors.AnsibleError("lookup plugins have to return a list: %r" % items) - if type(items) != list: - raise errors.AnsibleError("lookup plugins have to return a list: %r" % items) - - if len(items) and self.module_name in [ 'apt', 'yum' ]: - # hack for apt and soon yum, with_items maps back into a single module call - inject['item'] = ",".join(items) - items = [] + if len(items) and self.module_name in [ 'apt', 'yum' ]: + # hack for apt and soon yum, with_items maps back into a single module call + inject['item'] = ",".join(items) + items = None # logic to decide how to run things depends on whether with_items is used - if len(items) == 0: + if items is None: return self._executor_internal_inner(host, self.module_name, self.module_args, inject, port) - else: + elif len(items) > 0: # executing using with_items, so make multiple calls # TODO: refactor aggregrate = {} @@ -339,6 +337,9 @@ class Runner(object): if not all_failed: del rd_result['failed'] return ReturnData(host=host, comm_ok=all_comm_ok, result=rd_result) + else: + self.callbacks.on_skipped(host, None) + return ReturnData(host=host, comm_ok=True, result=dict(skipped=True)) # ***************************************************** From 37d9acc0978a573c97996d514ab2a88c057e0e9f Mon Sep 17 00:00:00 2001 From: Daniel Hokka Zakrisson Date: Wed, 31 Oct 2012 16:52:31 +0100 Subject: [PATCH 2/3] Make lookup API extensible and allow basedir to be passed This allows using with_fileglob in play context, e.g. - include: $item with_fileglob: tasks/*.yml as well as prepares for other data to be passed. --- lib/ansible/playbook/play.py | 2 +- lib/ansible/runner/__init__.py | 4 ++-- lib/ansible/runner/lookup_plugins/fileglob.py | 8 ++++---- lib/ansible/runner/lookup_plugins/items.py | 8 +++----- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/lib/ansible/playbook/play.py b/lib/ansible/playbook/play.py index c12a3077c36..023c820d606 100644 --- a/lib/ansible/playbook/play.py +++ b/lib/ansible/playbook/play.py @@ -112,7 +112,7 @@ class Play(object): if plugin_name not in self.playbook.lookup_plugins_list: raise errors.AnsibleError("cannot find lookup plugin named %s for usage in with_%s" % (plugin_name, plugin_name)) terms = utils.varReplaceWithItems(self.basedir, x[k], task_vars) - items = self.playbook.lookup_plugins_list[plugin_name].LookupModule(None).run(terms) + items = self.playbook.lookup_plugins_list[plugin_name].LookupModule(basedir=self.basedir, runner=None).run(terms) for item in items: mv = task_vars.copy() diff --git a/lib/ansible/runner/__init__.py b/lib/ansible/runner/__init__.py index 60f87d9ab94..0aba777c75b 100644 --- a/lib/ansible/runner/__init__.py +++ b/lib/ansible/runner/__init__.py @@ -170,12 +170,12 @@ class Runner(object): for (k,v) in action_plugin_list.iteritems(): self.action_plugins[k] = v.ActionModule(self) for (k,v) in lookup_plugin_list.iteritems(): - self.lookup_plugins[k] = v.LookupModule(self) + self.lookup_plugins[k] = v.LookupModule(runner=self, basedir=self.basedir) for (k,v) in utils.import_plugins(os.path.join(self.basedir, 'action_plugins')).iteritems(): self.action_plugins[k] = v.ActionModule(self) for (k,v) in utils.import_plugins(os.path.join(self.basedir, 'lookup_plugins')).iteritems(): - self.lookup_plugins[k] = v.LookupModule(self) + self.lookup_plugins[k] = v.LookupModule(runner=self, basedir=self.basedir) # ***************************************************** diff --git a/lib/ansible/runner/lookup_plugins/fileglob.py b/lib/ansible/runner/lookup_plugins/fileglob.py index fe58173555d..456ca4ed1f4 100644 --- a/lib/ansible/runner/lookup_plugins/fileglob.py +++ b/lib/ansible/runner/lookup_plugins/fileglob.py @@ -21,11 +21,11 @@ from ansible import utils class LookupModule(object): - def __init__(self, runner): - self.runner = runner + def __init__(self, basedir=None, **kwargs): + self.basedir = basedir - def run(self, terms): - return [ f for f in glob.glob(utils.path_dwim(self.runner.basedir, terms)) if os.path.isfile(f) ] + def run(self, terms, **kwargs): + return [ f for f in glob.glob(utils.path_dwim(self.basedir, terms)) if os.path.isfile(f) ] diff --git a/lib/ansible/runner/lookup_plugins/items.py b/lib/ansible/runner/lookup_plugins/items.py index 2a4757db0ee..efc4169602a 100644 --- a/lib/ansible/runner/lookup_plugins/items.py +++ b/lib/ansible/runner/lookup_plugins/items.py @@ -15,14 +15,12 @@ # You should have received a copy of the GNU General Public License # along with Ansible. If not, see . -import os - class LookupModule(object): - def __init__(self, runner): - self.runner = runner + def __init__(self, **kwargs): + pass - def run(self, terms): + def run(self, terms, **kwargs): return terms From c519d5dac00b1ad56c3931d336259a56eb6cf833 Mon Sep 17 00:00:00 2001 From: Daniel Hokka Zakrisson Date: Wed, 31 Oct 2012 16:57:10 +0100 Subject: [PATCH 3/3] Add a template lookup plugin Requires that inject be passed to run --- lib/ansible/playbook/play.py | 2 +- lib/ansible/runner/__init__.py | 2 +- lib/ansible/runner/lookup_plugins/template.py | 27 +++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 lib/ansible/runner/lookup_plugins/template.py diff --git a/lib/ansible/playbook/play.py b/lib/ansible/playbook/play.py index 023c820d606..938901d4a9c 100644 --- a/lib/ansible/playbook/play.py +++ b/lib/ansible/playbook/play.py @@ -112,7 +112,7 @@ class Play(object): if plugin_name not in self.playbook.lookup_plugins_list: raise errors.AnsibleError("cannot find lookup plugin named %s for usage in with_%s" % (plugin_name, plugin_name)) terms = utils.varReplaceWithItems(self.basedir, x[k], task_vars) - items = self.playbook.lookup_plugins_list[plugin_name].LookupModule(basedir=self.basedir, runner=None).run(terms) + items = self.playbook.lookup_plugins_list[plugin_name].LookupModule(basedir=self.basedir, runner=None).run(terms, inject=task_vars) for item in items: mv = task_vars.copy() diff --git a/lib/ansible/runner/__init__.py b/lib/ansible/runner/__init__.py index 0aba777c75b..548b61e87fa 100644 --- a/lib/ansible/runner/__init__.py +++ b/lib/ansible/runner/__init__.py @@ -295,7 +295,7 @@ class Runner(object): if items_plugin is not None and items_plugin in self.lookup_plugins: items_terms = self.module_vars.get('items_lookup_terms', '') items_terms = utils.varReplaceWithItems(self.basedir, items_terms, inject) - items = self.lookup_plugins[items_plugin].run(items_terms) + items = self.lookup_plugins[items_plugin].run(items_terms, inject=inject) if type(items) != list: raise errors.AnsibleError("lookup plugins have to return a list: %r" % items) diff --git a/lib/ansible/runner/lookup_plugins/template.py b/lib/ansible/runner/lookup_plugins/template.py new file mode 100644 index 00000000000..4c8c4b1e862 --- /dev/null +++ b/lib/ansible/runner/lookup_plugins/template.py @@ -0,0 +1,27 @@ +# (c) 2012, Michael DeHaan +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . + +from ansible import utils + +class LookupModule(object): + + def __init__(self, basedir=None, **kwargs): + self.basedir = basedir + + def run(self, terms, inject=None, **kwargs): + return utils.template_from_file(self.basedir, terms, inject) +