Using ansible core's pip and virtualenv on Centos or Redhat

I have created a playbook that is suppose to run a django website for local developers. These are organizational constraints

I attempted to follow the software collections route in

The newly create virtualenv and python binaries give an error after provision. Here is the pertinent part of my playbook:

main.yml

- hosts: app
  sudo: yes
  sudo_user: root
  gather_facts: true
  roles:
    # insert other roles
  tasks:
    - name: Add SCL Repos
      command: sh -c 'wget -qO- http://people.redhat.com/bkabrda/scl_python27.repo >> /etc/yum.repos.d/scl.repo'
    - name: Install python dependencies
      yum: pkg={{ item }} state=present
      with_items:
        - "python-devel"
        - "scl-utils"
        - "python27"
    - name: Manually create virtual .env and install requirements
      shell: "source /opt/rh/python27/enable && virtualenv /vagrant/.env && source /vagrant/.env/bin/activate && pip install -r /vagrant/requirements/local.txt"

Ansible - stdout

Here is the tail end of my ansible's stdout message.

pip can't proceed with requirement 'pytz (from -r /vagrant/requirements/base.txt (line 3))' due to a pre-existing build directory.\n location: /vagrant/.env/build/pytz\nThis is likely due to a previous installation that failed.\npip is being responsible and not assuming it can delete this.\nPlease delete it and try again.\n\nCleaning up...

Post Mortem Test via SSH

In an attempt to glean more information out the problem, I sshed into the box to see what feedback I could get.

$ vagrant ssh
Last login: Fri Feb 12 22:17:03 2016 from 10.0.2.2
Welcome to your Vagrant-built virtual machine.

[vagrant@localhost ~]$ cd /vagrant/
[vagrant@localhost vagrant]$ source .env/bin/activate
(.env)[vagrant@localhost vagrant]$ pip install -r requirements/local.txt
/vagrant/.env/bin/python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory

In general, the approach feels like a square peg in a round hole. I'd love to hear some feedback from the community about the appropriate way to run a centos box locally using a python27 virtualenv provisioned through ansible.

Upvotes: 4

Views: 2027

Answers (2)

Giorgos Gernas
Giorgos Gernas

Reputation: 146

You could always use ansible environment directive to manually set appropriate variables so that correct executables get called. Here's an example:

 environment:
    PATH: "/opt/rh/rh-python34/root/usr/bin:{{ ansible_env.PATH }}"
    LD_LIBRARY_PATH: "/opt/rh/rh-python34/root/usr/lib64"
    MANPATH: "/opt/rh/rh-python34/root/usr/share/man"
    XDG_DATA_DIRS: "/opt/rh/rh-python34/root/usr/share"
    PKG_CONFIG_PATH: "/opt/rh/rh-python34/root/usr/lib64/pkgconfig"

  pip: "virtualenv={{root_dir}}/{{venvs_dir}}/{{app_name}}_{{spec}} requirements={{root_dir}}/{{spec}}_sites/{{app_name}}/requirements.txt"

Upvotes: 2

In the end, I had to rebuild python from source to create a python2.7 virtual environment. I used an open source playbook.

main.yml

- hosts: app
  roles:
    - { role: Ken24.python }
  tasks:
    - name: Install virtualenv 
      command: "/usr/local/bin/pip install virtualenv"
    - name: Create virtualenv and install requirements
      pip: requirements=/vagrant/requirements/local.txt virtualenv=/vagrant/cfgov-refresh virtualenv_command=/usr/local/bin/virtualenv

Upvotes: 0

Related Questions