I was using Ansible to set up a bunch of Scientific Linux 6.6 servers running Django and I wanted to use a specific version of Django, version 1.6.5, on all servers.
Ansible makes this easy with the “pip” module:
- name: Install pip package from yum yum: name={{ item }} state=present with_items: - python-pip - python-setuptools - name: Install Django 1.6.5 pip: name=django version=1.6.5 state=present
This works great if you’re installing on a clean, empty server, but if you’re upgrading a server that had an older version of Django on it (1.6.4 in my case) Ansible will act as if it’s installing 1.6.5, but when it’s done I still had version 1.6.4.
If I try using straight PIP commands I get this:
$ pip install django==1.6.5 Downloading/unpacking django==1.6.5 Running setup.py egg_info for package django warning: no previously-included files matching '__pycache__' found under directory '*' warning: no previously-included files matching '*.py[co]' found under directory '*' Requested django==1.6.5, but installing version 1.6.4 Installing collected packages: django Found existing installation: Django 1.6.4 Uninstalling Django: Successfully uninstalled Django Running setup.py install for django warning: no previously-included files matching '__pycache__' found under directory '*' warning: no previously-included files matching '*.py[co]' found under directory '*' changing mode of /usr/bin/django-admin.py to 755 Successfully installed django Cleaning up...
Note the line “Requested django==1.6.5, but installing version 1.6.4”. Thanks PIP!
It turned out to be a bug in PIP versions earlier than PIP 1.4, not Ansible. A little Googling turned up a page on Stackoverflow that pointed the finger at an old cached copy of 1.6.4 in the build directory, which I found in /tmp/pip-build-root.
I updated my Ansible YAML file to get rid of the temporary directory and now it works fine:
- name: Install pip package from yum yum: name={{ item }} state=present with_items: - python-pip - python-setuptools - name: Remove PIP temp directory file: path=/tmp/pip-build-root state=absent - name: Install Django 1.6.5 pip: name=django version=1.6.5 state=present
Hope you find this useful.