diff --git a/lib/ansible/playbook/play.py b/lib/ansible/playbook/play.py
index c12a3077c36..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(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 e9e2fd96494..d337bf3370f 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)
# *****************************************************
@@ -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, inject=inject)
+ 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))
# *****************************************************
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
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)
+