msg: httplib2 is not installed for uri module when httplib2 is installed

2,929 views
Skip to first unread message

Kesten Broughton

unread,
Apr 22, 2014, 5:43:36 PM4/22/14
to ansible...@googlegroups.com
Running the task

 - name: Get tenant id
   uri: url="{{ os_service_endpoint }}/tenants?name={{tenant.name}}"
        method=GET
        timeout=30
        return_content=yes
        HEADER_User-Agent=python-keystoneclient
        HEADER_X-Auth-Token="{{keystone_admin_token}}"
        HEADER_Content-Type="application/json"
   register: register_tenant


TASK: [Get tenant id] ********************************************************* 

<localhost> REMOTE_MODULE uri url="http://example.com:35357/v2.0//tenants?name=tenant2" method=GET timeout=30 return_content=yes HEADER_User-Agent=python-keystoneclient HEADER_X-Auth-Token="*****" HEADER_Content-Type="application/json"

<localhost> EXEC ['/bin/sh', '-c', 'mkdir -p $HOME/.ansible/tmp/ansible-tmp-1398201502.91-131706600599036 && echo $HOME/.ansible/tmp/ansible-tmp-1398201502.91-131706600599036']

<localhost> PUT /var/folders/t2/h22337c12hn279xwd4s9fk7s8_088c/T/tmpLEIdmk TO /Users/kbroughton/.ansible/tmp/ansible-tmp-1398201502.91-131706600599036/uri

<localhost> EXEC /bin/sh -c 'sudo -k && sudo -H -S -p "[sudo via ansible, key=turelpokuakqdltyqvhjhfyyvmrqaail] password: " -u root /bin/sh -c '"'"'echo SUDO-SUCCESS-turelpokuakqdltyqvhjhfyyvmrqaail; /usr/bin/python /Users/kbroughton/.ansible/tmp/ansible-tmp-1398201502.91-131706600599036/uri; rm -rf /Users/kbroughton/.ansible/tmp/ansible-tmp-1398201502.91-131706600599036/ >/dev/null 2>&1'"'"''


failed: [localhost] => {"failed": true, "item": ""}


msg: httplib2 is not installed

FATAL: all hosts have already failed -- aborting

-----------------
Running ansible 1.6 on a mac

Default python is 2.7.6 in /usr/local/bin/python .  That one can import httplib2.

[kbroughton@mb-kbroughton:lynx-ansible/21ct-ansible + (develop)] which python

/usr/local/bin/python

ansible seems to use /usr/bin/python, but that also can import httplib2

[kbroughton@mb-kbroughton:/21ct-ansible + (develop)] /usr/bin/python

Python 2.7.5 (default, Aug 25 2013, 00:04:04) 

[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

>>> import httplib2

>>>

The play is run against localhost (my mac) but even the 3 controller openstack nodes have httplib2 installed (though in dist-packages not site-packages because it is ubuntu).

any ideas?

--

Kesten Broughton
512 701 4209

Matt Martz

unread,
Apr 22, 2014, 5:59:23 PM4/22/14
to ansible...@googlegroups.com, Kesten Broughton
Do you have 'localhost' defined in your inventory?  If so, have you specified ansible_python_interpreter=/usr/local/bin/python along with it in your inventory?

You do mention that /usr/bin/python has access to httplib2, but that could be due to something such as setting PYTHONPATH somewhere that would allow /usr/bin/python to load httplib2 that it wouldn't otherwise have access to, and as a result ansible is running without access to PYTHONPATH maybe...

The code that determines if you have httplib2 is somewhat simple:

HAS_HTTPLIB2 = True
try:
    import httplib2
except ImportError:
    HAS_HTTPLIB2 = False

And later if HAS_HTTPLIB2 is False, it fails with the message you are seeing.


Perhaps try running:

/usr/bin/python -c "import httplib2; print httplib2.__file__"
/usr/local/bin/python -c "import httplib2; print httplib2.__file__"

As well as looking at:

echo $PYTHONPATH

-- 
Matt Martz
ma...@sivel.net
--
You received this message because you are subscribed to the Google Groups "Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ansible-proje...@googlegroups.com.
To post to this group, send email to ansible...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/CAO2fFsXRGrp20pH09FK_ez6FChYsMOFEjDoLhA3HQjmt-zPAJg%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Kesten Broughton

unread,
Apr 23, 2014, 9:33:20 AM4/23/14
to Matt Martz, ansible...@googlegroups.com

httplib2 is getting picked up from the same place for either python install.

[kbroughton@mb-kbroughton:Contents/MacOS] /usr/bin/python -c "import httplib2; print httplib2.__file__"

/usr/local/lib/python2.7/site-packages/httplib2/__init__.pyc

[kbroughton@mb-kbroughton:Contents/MacOS] /usr/local/bin/python -c "import httplib2; print httplib2.__file__"

/usr/local/lib/python2.7/site-packages/httplib2/__init__.pyc

PYTHONPATH is pointing there

[kbroughton@mb-kbroughton:Contents/MacOS] echo $PYTHONPATH 

/usr/local/lib/python2.7/site-packages:/Users/kbroughton/vcp/git/mentat/ansible/lib:

But i'm not sure how to force pip to install it to the location that ansible has access to.

[kbroughton@mb-kbroughton:Contents/MacOS] export PYTHONPATH=''

[kbroughton@mb-kbroughton:Contents/MacOS] echo $PYTHONPATH 


[kbroughton@mb-kbroughton:Contents/MacOS] pip install httplib2

Requirement already satisfied (use --upgrade to upgrade): httplib2 in /usr/local/lib/python2.7/site-packages

Cleaning up...

[kbroughton@mb-kbroughton:Contents/MacOS] 


I suppose that pip belongs to the homebrew installed python, and i don't have pip installed for /usr/bin/python.


Setting ansible_python_interpreter=/usr/local/bin/python in the hosts file fixes the problem.


kesten

Matt Martz

unread,
Apr 23, 2014, 1:07:54 PM4/23/14
to Kesten Broughton, ansible...@googlegroups.com
I've often found that using python from homebrew causes more problems than it solves.

You can probably do something like:

sudo PYTHONPATH="" /usr/bin/easy_install httplib2

On Mac, usually one of the first things I do is:

sudo /usr/bin/easy_install pip

Unfortunately that will try to squash pip provided by homebrew installed python as they both use /usr/local/bin/pip as their destination.

If you want to use python from homebrew, then your inventory modification is probably the right change to make.

Either that , or don't target localhost explicitly, remove localhost from your inventory and use local_action or delegate_to: localhost, which does some magic (implicit localhost) and uses the python binary used to invoke ansible as ansible_python_interpreter.
-- 
Matt Martz
ma...@sivel.net
Reply all
Reply to author
Forward
0 new messages