Repository: ansible/ansible

Issue:
debug action plugin silently ignores bad parameters
After looking through the code and noticing the `fail` option for the `debug` action plugin, I decided to try it out. I messed up and set `failed=yes` and was confused about why nothing happened.

The plugin should probably tell me that I'm being an idiot.



Discussion:

Resolving patch:
diff --git a/lib/ansible/plugins/action/debug.py b/lib/ansible/plugins/action/debug.py
--- a/lib/ansible/plugins/action/debug.py
+++ b/lib/ansible/plugins/action/debug.py
@@ -20,40 +20,45 @@
 from ansible.plugins.action import ActionBase
 from ansible.utils.boolean import boolean
 from ansible.utils.unicode import to_unicode
+from ansible.errors import AnsibleUndefinedVariable
 
 class ActionModule(ActionBase):
     ''' Print statements during execution '''
 
     TRANSFERS_FILES = False
+    VALID_ARGS = set(['msg', 'var'])
 
     def run(self, tmp=None, task_vars=None):
         if task_vars is None:
             task_vars = dict()
 
+        for arg in self._task.args:
+            if arg not in self.VALID_ARGS:
+                return {"failed": True, "msg": "'%s' is not a valid option in debug" % arg}
+
+        if 'msg' in self._task.args and 'var' in self._task.args:
+            return {"failed": True, "msg": "'msg' and 'var' are incompatible options"}
+
         result = super(ActionModule, self).run(tmp, task_vars)
 
         if 'msg' in self._task.args:
-            if 'fail' in self._task.args and boolean(self._task.args['fail']):
-                result['failed'] = True
-                result['msg'] = self._task.args['msg']
-            else:
-                result['msg'] = self._task.args['msg']
-        # FIXME: move the LOOKUP_REGEX somewhere else
-        elif 'var' in self._task.args: # and not utils.LOOKUP_REGEX.search(self._task.args['var']):
-            results = self._templar.template(self._task.args['var'], convert_bare=True, fail_on_undefined=False)
+            result['msg'] = self._task.args['msg']
+
+        elif 'var' in self._task.args:
+            try:
+                results = self._templar.template(self._task.args['var'], convert_bare=True, fail_on_undefined=True)
+                if results == self._task.args['var']:
+                    raise AnsibleUndefinedVariable
+            except AnsibleUndefinedVariable:
+                results = "VARIABLE IS NOT DEFINED!"
+
             if type(self._task.args['var']) in (list, dict):
                 # If var is a list or dict, use the type as key to display
                 result[to_unicode(type(self._task.args['var']))] = results
             else:
-                # If var name is same as result, try to template it
-                if results == self._task.args['var']:
-                    try:
-                        results = self._templar.template("{{" + results + "}}", convert_bare=True, fail_on_undefined=True)
-                    except:
-                        results = "VARIABLE IS NOT DEFINED!"
                 result[self._task.args['var']] = results
         else:
-            result['msg'] = 'here we are'
+            result['msg'] = 'Hello world!'
 
         # force flag to make debug output module always verbose
         result['_ansible_verbose_always'] = True


Test patch: