Configure a Python virtualenv and install/update requirements. Requires Ansible 2.8 or later.
Support for Ansible versions < 2.8 was dropped as of version 0.7.0.
When become is used (i.e. virtualenv_user does not equal ansible_user or
ansible_ssh_user), the necessary OS package(s) to support become_method
(e.g. sudo) must be installed before using this role.
When none of ansible_user, ansible_ssh_user or ansible_become_user is
root, the necessary OS package(s) to provide the virtualenv command must be
installed by some other means before using this role.
The following variables may be defined to customize this role:
virtualenv_path: Target directory in which to create/update virtualenv (required).virtualenv_user: User to become for creating/updating the virtualenv; default is the current user (i.e.ansible_useroransible_ssh_user).virtualenv_default_os_packages: OS packages required in order to create a virtualenv. There is usually no need to change this option unless running on a system using a differentansible_pkg_mgr; default is{ apt: ['python-dev', 'python-virtualenv'], yum: ['python-devel', 'python-virtualenv'] }.virtualenv_os_packages: OS packages to install to support the virtualenv, indexed byansible_pkg_mgr; default is{}.virtualenv_easy_install_packages: Python packages to install globally usingeasy_install; default is[].virtualenv_easy_install_executable: Alternate executable to use for globaleasy_installpackages; default isomitto use theeasy_installcommand found in the path.virtualenv_global_packages: Python packages to install globally usingpip; default is[].virtualenv_pip_executable: Alternate executable to use for globalpippackages; default isomitto use thepipcommand found in the path.virtualenv_command: Alternate executable to use to create virtualenv; default isomitto usevirtualenvcommand found in the path.virtualenv_python: Python version to use to create virtualenv; default isomitto use the Python interpreter used by Ansible.virtualenv_default_package: Default package to install when creating the virtualenv; default ispip.virtualenv_site_packages: Boolean indicating whether virtualenv will use global site packages; default isno.virtualenv_pre_packages: Python packages topipinstall inside the virtualenv before requirements files; default is[]. This option can also be used to remove packages no longer needed in the virtualenv.virtualenv_requirements: List of requirements files topipinstall inside the virtualenv; default is[]. These paths must already be present on the remote system.virtualenv_post_packages: Python packages topipinstall inside the virtualenv after requirements files; default is[]. This option can also be used to remove packages no longer needed in the virtualenv.virtualenv_recreate: Boolean indicating whether to delete and recreate the virtualenv; default isno.
The following variable may be defined for the play or role invocation (but not as an inventory group or host variable):
virtualenv_notify_on_updated: Handler name to notify when the virtualenv was created or updated. The default is"virtualenv updated"; it is generally recommended for custom handlers to listen for"virtualenv updated"instead of changing the notification name.
Each item in a package list above may be specified as a string with only the
package name or as a hash with name, state or version keys, e.g.:
- package1
- name: package2
state: absent
- name: package3
version: 1.2
OS package lists are a hash indexed by the package manager, e.g.:
apt:
- package1
- name: package2-dev
state: absent
yum:
- package1
- name: package2-devel
state: absent
foo_pkg_mgr:
- foo-package1
This role can create a virtualenv as another user, specified by
virtualenv_user, and will use the become_method specified for the
host/play/task. OS and global packages will only be installed when
ansible_user, ansible_ssh_user or ansible_become_user is root. The
following example combinations of users are listed below with their expected
results:
ansible_user=root: OS and global packages will be installed; virtualenv will be owned byroot.ansible_user=root virtualenv_user=other: OS and global packages will be installed;becomewill be used; virtualenv will be owned byother.ansible_user=other: OS and global packages will not be installed; virtualenv will be owned byother.ansible_user=other virtualenv_user=another: OS and global packages will not be installed;becomewill be used; virtualenv will be owned byanother. This combination may fail ifothercannot becomeanother. The Ansible 2.1 note below may also apply in this case.ansible_user=other ansible_become_user=root: OS and global packages will be installed;becomewill be used; virtualenv will be owned byother.ansible_user=other ansible_become_user=root virtualenv_user=another: OS and global packages will be installed;becomewill be used; virtualenv will be owned byanother. You may need to defineallow_world_readable_tmpfilesin youransible.cfg(which still generate a warning instead of an error) or use another approach to support one unprivileged user becoming another unprivileged user.
The following example playbook installs libjpeg as a system dependency,
creates or updates a virtualenv, installs specific packages, installs
requirements, then removes an old package no longer needed:
- hosts: all
roles:
- name: cchurch.virtualenv
vars:
virtualenv_path: ~/env
virtualenv_os_packages:
apt: [libjpeg-dev]
yum: [libjpeg-devel]
virtualenv_pre_packages:
- name: Django
version: 1.11.26
- Pillow
virtualenv_requirements:
- ~/src/requirements.txt
virtualenv_post_packages:
- name: PIL
state: absent
handlers:
- name: custom virtualenv handler
debug:
msg: "virtualenv in {{ virtualenv_path }} was updated."
listen: virtualenv updated
BSD
Chris Church (cchurch)