# Buggy code
def _update_module_args(self, module_name, module_args, task_vars):
    # set check mode in the module arguments, if required
    if self._play_context.check_mode:
        if not self._supports_check_mode:
            raise AnsibleError("check mode is not supported for this operation")
        module_args["_ansible_check_mode"] = True
    else:
        module_args["_ansible_check_mode"] = False

    # set no log in the module arguments, if required
    module_args["_ansible_no_log"] = (
        self._play_context.no_log or C.DEFAULT_NO_TARGET_SYSLOG
    )

    # set debug in the module arguments, if required
    module_args["_ansible_debug"] = C.DEFAULT_DEBUG

    # let module know we are in diff mode
    module_args["_ansible_diff"] = self._play_context.diff

    # let module know our verbosity
    module_args["_ansible_verbosity"] = display.verbosity

    # give the module information about the ansible version
    module_args["_ansible_version"] = __version__

    # give the module information about its name
    module_args["_ansible_module_name"] = module_name

    # set the syslog facility to be used in the module
    module_args["_ansible_syslog_facility"] = task_vars.get(
        "ansible_syslog_facility", C.DEFAULT_SYSLOG_FACILITY
    )

    # let module know about filesystems that selinux treats specially
    module_args["_ansible_selinux_special_fs"] = C.DEFAULT_SELINUX_SPECIAL_FS

    # give the module the socket for persistent connections
    module_args["_ansible_socket"] = getattr(self._connection, "socket_path")
    if not module_args["_ansible_socket"]:
        module_args["_ansible_socket"] = task_vars.get("ansible_socket")

    # make sure all commands use the designated shell executable
    module_args["_ansible_shell_executable"] = self._play_context.executable

    # make sure modules are aware if they need to keep the remote files
    module_args["_ansible_keep_remote_files"] = C.DEFAULT_KEEP_REMOTE_FILES

    # make sure all commands use the designated temporary directory if created
    module_args["_ansible_tmpdir"] = self._connection._shell.tmpdir

    # make sure the remote_tmp value is sent through in case modules needs to create their own
    try:
        module_args["_ansible_remote_tmp"] = self._connection._shell.get_option(
            "remote_tmp"
        )
    except KeyError:
        # here for 3rd party shell plugin compatibility in case they do not define the remote_tmp option
        module_args["_ansible_remote_tmp"] = "~/.ansible/tmp"


# Traceback (OSError)
ansible-playbook 2.6.0rc1
config file = None
configured module search path = [u'/home/centos/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible-playbook
python version = 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
No config file found; using defaults
Parsed /home/centos/inventory.ini inventory source with ini plugin

PLAYBOOK: playbook.yml *************************************************************************************************************************************
1 plays in playbook.yml

PLAY [all] *************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************
task path: /home/centos/playbook.yml:2
<target> ESTABLISH LOCAL CONNECTION FOR USER: centos
<target> EXEC /bin/sh -c 'echo ~centos &amp;&amp; sleep 0'
<target> EXEC /bin/sh -c '( umask 77 &amp;&amp; mkdir -p "` echo /home/centos/.ansible/tmp/ansible-tmp-1528489241.67-154074287834207 `" &amp;&amp; echo ansible-tmp-1528489241.67-154074287834207="` echo /home/centos/.ansible/tmp/ansible-tmp-1528489241.67-154074287834207 `" ) &amp;&amp; sleep 0'
Using module file /usr/lib/python2.7/site-packages/ansible/modules/system/setup.py
<target> PUT /home/centos/.ansible/tmp/ansible-local-26937OUx1qh/tmpsaSW45 TO /home/centos/.ansible/tmp/ansible-tmp-1528489241.67-154074287834207/setup.py
<target> EXEC /bin/sh -c 'chmod u+x /home/centos/.ansible/tmp/ansible-tmp-1528489241.67-154074287834207/ /home/centos/.ansible/tmp/ansible-tmp-1528489241.67-154074287834207/setup.py &amp;&amp; sleep 0'
<target> EXEC /bin/sh -c '/usr/bin/python /home/centos/.ansible/tmp/ansible-tmp-1528489241.67-154074287834207/setup.py &amp;&amp; sleep 0'
<target> EXEC /bin/sh -c 'rm -f -r /home/centos/.ansible/tmp/ansible-tmp-1528489241.67-154074287834207/ > /dev/null 2>&amp;1 &amp;&amp; sleep 0'
ok: [target]
META: ran handlers

TASK [blockinfile] *****************************************************************************************************************************************
task path: /home/centos/playbook.yml:4
<target> ESTABLISH LOCAL CONNECTION FOR USER: centos
<target> EXEC /bin/sh -c 'echo ~centos &amp;&amp; sleep 0'
<target> EXEC /bin/sh -c '( umask 77 &amp;&amp; mkdir -p "` echo /var/tmp/ansible-tmp-1528489242.66-190869334332659 `" &amp;&amp; echo ansible-tmp-1528489242.66-190869334332659="` echo /var/tmp/ansible-tmp-1528489242.66-190869334332659 `" ) &amp;&amp; sleep 0'
Using module file /usr/lib/python2.7/site-packages/ansible/modules/files/blockinfile.py
<target> PUT /home/centos/.ansible/tmp/ansible-local-26937OUx1qh/tmp4y0GYj TO /var/tmp/ansible-tmp-1528489242.66-190869334332659/blockinfile.py
<target> EXEC /bin/sh -c 'setfacl -m u:testuser:r-x /var/tmp/ansible-tmp-1528489242.66-190869334332659/ /var/tmp/ansible-tmp-1528489242.66-190869334332659/blockinfile.py &amp;&amp; sleep 0'
<target> EXEC /bin/sh -c 'sudo -H -S -n -u testuser /bin/sh -c '"'"'echo BECOME-SUCCESS-dkqkzvhlmkxabaonclqypkdsoabveqpw; /usr/bin/python /var/tmp/ansible-tmp-1528489242.66-190869334332659/blockinfile.py'"'"' &amp;&amp; sleep 0'
<target> EXEC /bin/sh -c 'rm -f -r /var/tmp/ansible-tmp-1528489242.66-190869334332659/ > /dev/null 2>&amp;1 &amp;&amp; sleep 0'
The full traceback is:
Traceback (most recent call last):
File "/tmp/ansible_c67IEZ/ansible_module_blockinfile.py", line 351, in <module>
main()
File "/tmp/ansible_c67IEZ/ansible_module_blockinfile.py", line 335, in main
write_changes(module, result, real_path)
File "/tmp/ansible_c67IEZ/ansible_module_blockinfile.py", line 163, in write_changes
tmpfd, tmpfile = tempfile.mkstemp(dir=getattr(module, 'tmpdir', None))
File "/usr/lib64/python2.7/tempfile.py", line 304, in mkstemp
return _mkstemp_inner(dir, prefix, suffix, flags)
File "/usr/lib64/python2.7/tempfile.py", line 239, in _mkstemp_inner
fd = _os.open(file, flags, 0600)
OSError: [Errno 13] Permission denied: '/var/tmp/ansible-tmp-1528489242.66-190869334332659/tmpXemXXr'

fatal: [target]: FAILED! => {
"changed": false,
"module_stderr": "Traceback (most recent call last):\n  File \"/tmp/ansible_c67IEZ/ansible_module_blockinfile.py\", line 351, in <module>\n    main()\n  File \"/tmp/ansible_c67IEZ/ansible_module_blockinfile.py\", line 335, in main\n    write_changes(module, result, real_path)\n  File \"/tmp/ansible_c67IEZ/ansible_module_blockinfile.py\", line 163, in write_changes\n    tmpfd, tmpfile = tempfile.mkstemp(dir=getattr(module, 'tmpdir', None))\n  File \"/usr/lib64/python2.7/tempfile.py\", line 304, in mkstemp\n    return _mkstemp_inner(dir, prefix, suffix, flags)\n  File \"/usr/lib64/python2.7/tempfile.py\", line 239, in _mkstemp_inner\n    fd = _os.open(file, flags, 0600)\nOSError: [Errno 13] Permission denied: '/var/tmp/ansible-tmp-1528489242.66-190869334332659/tmpXemXXr'\n",
"module_stdout": "",
"msg": "MODULE FAILURE",
"rc": 1
}
to retry, use: --limit @/home/centos/playbook.retry

PLAY RECAP *************************************************************************************************************************************************
target                     : ok=1    changed=0    unreachable=0    failed=1

# Fixed code
def _update_module_args(self, module_name, module_args, task_vars):
    # set check mode in the module arguments, if required
    if self._play_context.check_mode:
        if not self._supports_check_mode:
            raise AnsibleError("check mode is not supported for this operation")
        module_args["_ansible_check_mode"] = True
    else:
        module_args["_ansible_check_mode"] = False

    # set no log in the module arguments, if required
    module_args["_ansible_no_log"] = (
        self._play_context.no_log or C.DEFAULT_NO_TARGET_SYSLOG
    )

    # set debug in the module arguments, if required
    module_args["_ansible_debug"] = C.DEFAULT_DEBUG

    # let module know we are in diff mode
    module_args["_ansible_diff"] = self._play_context.diff

    # let module know our verbosity
    module_args["_ansible_verbosity"] = display.verbosity

    # give the module information about the ansible version
    module_args["_ansible_version"] = __version__

    # give the module information about its name
    module_args["_ansible_module_name"] = module_name

    # set the syslog facility to be used in the module
    module_args["_ansible_syslog_facility"] = task_vars.get(
        "ansible_syslog_facility", C.DEFAULT_SYSLOG_FACILITY
    )

    # let module know about filesystems that selinux treats specially
    module_args["_ansible_selinux_special_fs"] = C.DEFAULT_SELINUX_SPECIAL_FS

    # give the module the socket for persistent connections
    module_args["_ansible_socket"] = getattr(self._connection, "socket_path")
    if not module_args["_ansible_socket"]:
        module_args["_ansible_socket"] = task_vars.get("ansible_socket")

    # make sure all commands use the designated shell executable
    module_args["_ansible_shell_executable"] = self._play_context.executable

    # make sure modules are aware if they need to keep the remote files
    module_args["_ansible_keep_remote_files"] = C.DEFAULT_KEEP_REMOTE_FILES

    # make sure all commands use the designated temporary directory if created
    if (
        self._is_become_unprivileged()
    ):  # force fallback on remote_tmp as user cannot normally write to dir
        module_args["_ansible_tmpdir"] = None
    else:
        module_args["_ansible_tmpdir"] = self._connection._shell.tmpdir

    # make sure the remote_tmp value is sent through in case modules needs to create their own
    try:
        module_args["_ansible_remote_tmp"] = self._connection._shell.get_option(
            "remote_tmp"
        )
    except KeyError:
        # here for 3rd party shell plugin compatibility in case they do not define the remote_tmp option
        module_args["_ansible_remote_tmp"] = "~/.ansible/tmp"