diff --git a/lib/ansible/runner/__init__.py b/lib/ansible/runner/__init__.py index ca4f8925eb..5921eb56ea 100644 --- a/lib/ansible/runner/__init__.py +++ b/lib/ansible/runner/__init__.py @@ -382,10 +382,18 @@ class Runner(object): inject['item'] = ",".join(items) items = None - # logic to decide how to run things depends on whether with_items is used + # logic to replace complex args if possible + complex_args = self.complex_args + if isinstance(complex_args, basestring): + if complex_args in inject: + complex_args = inject[complex_args] + else: + complex_args = template.template(self.basedir, complex_args, inject) + complex_args = utils.safe_eval(complex_args) + # logic to decide how to run things depends on whether with_items is used if items is None: - return self._executor_internal_inner(host, self.module_name, self.module_args, inject, port, complex_args=self.complex_args) + return self._executor_internal_inner(host, self.module_name, self.module_args, inject, port, complex_args=complex_args) elif len(items) > 0: # executing using with_items, so make multiple calls @@ -404,7 +412,7 @@ class Runner(object): self.module_args, inject, port, - complex_args=self.complex_args + complex_args=complex_args ) results.append(result.result) if result.comm_ok == False: diff --git a/lib/ansible/utils/__init__.py b/lib/ansible/utils/__init__.py index 138411cf5b..325c3e7fcb 100644 --- a/lib/ansible/utils/__init__.py +++ b/lib/ansible/utils/__init__.py @@ -703,6 +703,9 @@ def safe_eval(str): return var.startswith("$") or '{{' in var # do not allow method calls to modules + if not isinstance(str, basestring): + # already templated to a datastructure, perhaps? + return str if re.search(r'\w\.\w+\(', str): return str # do not allow imports