title: Ansible through Apache: Authentication or permission failure
body: <p>I try run Ansible through Apache2 CGI.</p>
  
  <p>This is my script:</p>
  
  <pre><code>#!/usr/bin/env python
  # -*- coding: UTF-8 -*-# enable debugging
  print "Content-type: text/html"
  print
  
  import cgitb
  cgitb.enable()
  print "&lt;html&gt;&lt;head&gt;"
  print ""
  print "&lt;/head&gt;&lt;body&gt;"
  
  import os
  import ansible.runner
  import sys
  results = ansible.runner.Runner(
  #    transport='ssh',
  #    remote_user='root',
  #    remote_pass='pass',
      transport='local',
  #    su='yes',
  #    su_user='root',
  #    su_pass='su_pass',
      sudo='yes',
      sudo_user='root',
      sudo_pass='sudo_pass',
      pattern='127.0.0.1',
      module_name='service',
      module_args='name=shoc-lxc-net state=started enabled=yes',
      forks=10,
  ).run()
  
  if results is None:
     print "No hosts found"
     sys.exit(1)
  
  import json
  print(json.dumps(results,
                   default=lambda obj: vars(obj),
                   indent=1))
  
  for (hostname, result) in results['contacted'].items():
      if not 'failed' in result:
          print "%s &gt;&gt;&gt; %s" % (hostname, result['enabled'])
  
  print "&lt;/body&gt;&lt;/html&gt;"
  </code></pre>
  
  <p>When I run it, I get:</p>
  
  <blockquote>
    <p>{ "dark": { "127.0.0.1":  { "msg": "Authentication or permission
    failure. In some cases, you may have been able to authenticate and did
    not have permissions on the remote directory. Consider changing the
    remote temp path in ansible.cfg to a path rooted in \"/tmp\". Failed
    command was: mkdir -p
    $HOME/.ansible/tmp/ansible-1420984254.94-125323999727459 &amp;&amp; chmod a+rx
    $HOME/.ansible/tmp/ansible-1420984254.94-125323999727459 &amp;&amp; echo
    $HOME/.ansible/tmp/ansible-1420984254.94-125323999727459, exited with
    result 1",  "failed": true } }, "contacted": {} }</p>
  </blockquote>
  
  <p>But when I run this script through shell I get:</p>
  
  <pre><code>$ /lxc/www/py/index.py 
  Content-type: text/html
  
  &lt;html&gt;&lt;head&gt; &lt;/head&gt;&lt;body&gt; {  "dark": {},  "contacted": {  
  "127.0.0.1": {    "invocation": {
      "module_name": "service",
      "module_args": "name=shoc-lxc-net state=started enabled=yes"    },    "state": "started",    "changed": false,    "enabled": true,   
  "name": "shoc-lxc-net"   }  } }
  127.0.0.1 &gt;&gt;&gt; True
  </code></pre>
  
  <p>When I check:</p>
  
  <pre><code># ls -la /var/www/
  total 20
  drwxrwxrwx  4 root     root     4096 Jan 11 15:57 .
  drwxr-xr-x 14 root     root     4096 Jan  8 15:58 ..
  drwxr-xr-x  2 root     root     4096 Jan 11 14:54 etc
  -rw-r--r--  1 root     root      177 Mar 18  2013 index.html
  drwx------  2 www-data www-data 4096 Jan 11 15:36 .ssh
  # su www-data
  $ mkdir /var/www/.ansible/tmp -p
  $
  # ls -la /var/www/.ansible/
  total 12
  drwxrwxr-x 3 www-data www-data 4096 Jan 11 15:57 .
  drwxrwxrwx 5 root     root     4096 Jan 11 15:57 ..
  drwxrwxr-x 2 www-data www-data 4096 Jan 11 15:57 tmp
  </code></pre>