Using a Python virtual environment on the remote machine with Ansible

Submitted by kentr on Tue, 07/04/2017 - 13:03

Problem

Recently I was working on a playbook to set up Apache basic HTTP authentication with the Ansible htpasswd module, and because the Python passlib module wasn't installed on the server I was getting an Ansible error:

"msg": "This module requires the passlib Python library"

Solution

I don't have root access to the server and could only install passlib in a Python virtual environment.  The problem then moved to Ansible—how to make Ansible use the virtual environment interpreter for the htpasswd task?

The Ansible variable controlling the Python interpreter is ansible_python_interpreter.  I didn't find a way to directly set this variable for a specific task. What I did find is the environment parameter for tasks.  However, there's no environment variable to directly specify ansible_python_interpreter.

It is possible, though, to tell Ansible to use the python that is specified by the environment.

With that glue in place, the next step is to specify the $PATH value for the specific task:

- name: Add users to .htpasswd file.
  htpasswd:
    path: path_to_htpasswd_file
    name: user_name
    password: password
    mode: 0644
  # Use previously-installed python virtual env executable so that passlib is available.
  # This requires that ansible_python_interpreter = "/usr/bin/env python"
  environment:
    PATH: '{{ ansible_env.HOME }}/path_to_python_virtual_env/bin:{{ ansible_env.PATH }}'