1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pkg/
4 changes: 2 additions & 2 deletions Modulefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name 'puppet-python'
version '1.0.0'
name 'stankevich-python'
version '1.6.4'

author 'Sergey Stankevich'
license 'Apache License, Version 2.0'
Expand Down
117 changes: 94 additions & 23 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,21 +1,43 @@
[puppet-python](https://github.com/stankevich/puppet-python)
======

Puppet module for installing and managing python, pip, virtualenv, Gunicorn virtual hosts
Puppet module for installing and managing python, pip, virtualenvs and Gunicorn virtual hosts.

**Version 1.1.x Notes**

Version 1.1.x makes several fundamental changes to the core of this module, adding some additional features, improving performance and making operations more robust in general.

Please note that everal changes have been made in v1.1.x which make manifests incompatible with the previous version. However, modifying your manifests to suit is trivial. Please see the notes below.

Currently, the changes you need to make are as follows:

* All pip definitions MUST include the owner field which specifies which user owns the virtualenv that packages will be installed in. Adding this greatly improves performance and efficiency of this module.
* You must explicitly specify pip => true in the python class if you want pip installed. As such, the pip package is now independent of the dev package and so one can exist without the other.

## Installation

``` bash
cd /etc/puppet/modules
git clone git://github.com/stankevich/puppet-python.git python
```

## Usage

### python

Installs and manages python, python-dev, python-virtualenv and Gunicorn.

**version** Python version to install. Default: system default
**version** - Python version to install. Default: system default

**dev** Install python-dev. Default: false
**pip** - Install python-pip. Default: false

**virtualenv** Install python-virtualenv. Default: false
**dev** - Install python-dev. Default: false

**gunicorn** — Install Gunicorn. Default: false
**virtualenv** - Install python-virtualenv. Default: false

**gunicorn** - Install Gunicorn. Default: false

**manage_gunicorn** - Allow Installation / Removal of Gunicorn. Default: true

class { 'python':
version => 'system',
Expand All @@ -28,64 +50,109 @@ Installs and manages python, python-dev, python-virtualenv and Gunicorn.

Installs and manages packages from pip.

**ensure** present/absent. Default: present
**ensure** - present/latest/absent. Default: present

**virtualenv** virtualenv to run pip in.
**virtualenv** - virtualenv to run pip in. Default: system (no virtualenv)

**proxy** — Proxy server to use for outbound connections. Default: none
**url** - URL to install from. Default: none

python::pip { 'flask':
virtualenv => '/var/www/project1',
proxy => 'http://proxy.domain.com:3128',
**owner** - The owner of the virtualenv to ensure that packages are installed with the correct permissions (must be specified). Default: root

**proxy** - Proxy server to use for outbound connections. Default: none

**environment** - Additional environment variables required to install the packages. Default: none

**egg** - The egg name to use. Default: $name of the class, e.g. cx_Oracle

**install_args** - Array of additional flags to pass to pip during installaton. Default: none

**uninstall_args** - Array of additional flags to pass to pip during uninstall. Default: none

python::pip { 'cx_Oracle':
virtualenv => '/var/www/project1',
owner => 'appuser',
proxy => 'http://proxy.domain.com:3128',
environment => 'ORACLE_HOME=/usr/lib/oracle/11.2/client64',
install_args => ['-e'],
}

### python::requirements

Installs and manages Python packages from requirements file.

**virtualenv** — virtualenv to run pip in. Default: system-wide
**virtualenv** - virtualenv to run pip in. Default: system-wide

**proxy** - Proxy server to use for outbound connections. Default: none

**proxy** — Proxy server to use for outbound connections. Default: none
**owner** - The owner of the virtualenv to ensure that packages are installed with the correct permissions (must be specified). Default: root

**src** - The ``--src`` parameter to ``pip``, used to specify where to install ``--editable`` resources; by default no ``--src`` parameter is passed to ``pip``.

**group** - The group that was used to create the virtualenv. This is used to create the requirements file with correct permissions if it's not present already.

python::requirements { '/var/www/project1/requirements.txt':
virtualenv => '/var/www/project1',
proxy => 'http://proxy.domain.com:3128',
owner => 'appuser',
group => 'apps',
}

### python::virtualenv

Creates Python virtualenv.

**ensure** — present/absent. Default: present
**ensure** - present/absent. Default: present

**version** - Python version to use. Default: system default

**version** — Python version to use. Default: system default
**requirements** - Path to pip requirements.txt file. Default: none

**requirements** — Path to pip requirements.txt file. Default: none
**proxy** - Proxy server to use for outbound connections. Default: none

**proxy** — Proxy server to use for outbound connections. Default: none
**systempkgs** - Copy system site-packages into virtualenv. Default: don't

**distribute** - Include distribute in the virtualenv. Default: true

**owner** - Specify the owner of this virtualenv

**group** - Specify the group for this virtualenv

**index** - Base URL of Python package index. Default: none

**cwd** - The directory from which to run the "pip install" command. Default: undef

**timeout** - The maximum time in seconds the "pip install" command should take. Default: 1800

python::virtualenv { '/var/www/project1':
ensure => present,
version => 'system',
requirements => '/var/www/project1/requirements.txt',
proxy => 'http://proxy.domain.com:3128',
systempkgs => true,
distribute => false,
owner => 'appuser',
group => 'apps',
cwd => '/var/www/project1',
timeout => 0,
}

### python::gunicorn

Manages Gunicorn virtual hosts.

**ensure** — present/absent. Default: present
**ensure** - present/absent. Default: present

**virtualenv** - Run in virtualenv, specify directory. Default: disabled

**virtualenv** — Run in virtualenv, specify directory. Default: disabled
**mode** - Gunicorn mode. wsgi/django. Default: wsgi

**mode** — Gunicorn mode. wsgi/django. Default: wsgi
**dir** - Application directory.

**dir** — Application directory.
**bind** - Bind on: 'HOST', 'HOST:PORT', 'unix:PATH'. Default: unix:/tmp/gunicorn-$name.socket or unix:${virtualenv}/${name}.socket

**bind** — Bind on: 'HOST', 'HOST:PORT', 'unix:PATH'. Default: unix:/tmp/gunicorn-$name.socket or unix:${virtualenv}/${name}.socket
**environment** - Set ENVIRONMENT variable. Default: none

**environment** — Set ENVIRONMENT variable. Default: none
**template** - Which ERB template to use. Default: python/gunicorn.erb

python::gunicorn { 'vhost':
ensure => present,
Expand All @@ -94,8 +161,12 @@ Manages Gunicorn virtual hosts.
dir => '/var/www/project1/current',
bind => 'unix:/tmp/gunicorn.socket',
environment => 'prod',
template => 'python/gunicorn.erb',
}

## Authors

[Sergey Stankevich](https://github.com/stankevich)
[Ashley Penney](https://github.com/apenney)
[Marc Fournier](https://github.com/mfournier)
[Fotis Gimian](https://github.com/fgimian)
27 changes: 27 additions & 0 deletions lib/facter/pip_version.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Make pip version available as a fact
# Works with pip loaded and without, pip installed using pip and package installed
require 'puppet'
pkg = Puppet::Type.type(:package).new(:name => "python-pip")
Facter.add("pip_version") do
has_weight 100
setcode do
begin
/^pip (\d+\.\d+\.?\d*).*$/.match(Facter::Util::Resolution.exec('pip --version 2>/dev/null'))[1]
rescue
false
end
end
end

Facter.add("pip_version") do
has_weight 50
setcode do
begin
unless [:absent,'purged'].include?(pkg.retrieve[pkg.property(:ensure)])
/^.*(\d+\.\d+\.\d+).*$/.match(pkg.retrieve[pkg.property(:ensure)])[1]
end
rescue
false
end
end
end
40 changes: 40 additions & 0 deletions lib/facter/python_version.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# Make python versions available as facts
# In lists default python and system python versions
require 'puppet'
pkg = Puppet::Type.type(:package).new(:name => "python")

Facter.add("system_python_version") do
setcode do
begin
unless [:absent,'purged'].include?(pkg.retrieve[pkg.property(:ensure)])
/^(\d+\.\d+\.\d+).*$/.match(pkg.retrieve[pkg.property(:ensure)])[1]
end
rescue
false
end
end
end

Facter.add("python_version") do
has_weight 100
setcode do
begin
/^.*(\d+\.\d+\.\d+)$/.match(Facter::Util::Resolution.exec('python -V 2>&1'))[1]
rescue
false
end
end
end

Facter.add("python_version") do
has_weight 50
setcode do
begin
unless [:absent,'purged'].include?(pkg.retrieve[pkg.property(:ensure)])
/^.*(\d+\.\d+\.\d+).*$/.match(pkg.retrieve[pkg.property(:ensure)])[1]
end
rescue
false
end
end
end
27 changes: 27 additions & 0 deletions lib/facter/virtualenv_version.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Make virtualenv version available as a fact
# Works with virualenv loaded and without, pip installed and package installed
require 'puppet'
pkg = Puppet::Type.type(:package).new(:name => "virtualenv")
Facter.add("virtualenv_version") do
has_weight 100
setcode do
begin
Facter::Util::Resolution.exec('virtualenv --version')
rescue
false
end
end
end

Facter.add("virtualenv_version") do
has_weight 50
setcode do
begin
unless [:absent,'purged'].include?(pkg.retrieve[pkg.property(:ensure)])
/^.*(\d+\.\d+\.\d+).*$/.match(pkg.retrieve[pkg.property(:ensure)])[1]
end
rescue
false
end
end
end
36 changes: 26 additions & 10 deletions manifests/config.pp
Original file line number Diff line number Diff line change
@@ -1,23 +1,39 @@
# == Define: python::config
#
# Optionally installs the gunicorn service
#
# === Examples
#
# include python::config
#
# === Authors
#
# Sergey Stankevich
# Ashley Penney
# Fotis Gimian
#

class python::config {

Class['python::install'] -> Python::Pip <| |>
Class['python::install'] -> Python::Requirements <| |>
Class['python::install'] -> Python::Virtualenv <| |>

Python::Virtualenv <| |> -> Python::Pip <| |>
Python::Virtualenv <| |> -> Python::Requirements <| |>

if $python::gunicorn {
Class['python::install'] -> Python::Gunicorn <| |>
if $python::manage_gunicorn {
if $python::gunicorn {
Class['python::install'] -> Python::Gunicorn <| |>

Python::Gunicorn <| |> ~> Service['gunicorn']
Python::Gunicorn <| |> ~> Service['gunicorn']

service { 'gunicorn':
ensure => running,
enable => true,
hasrestart => true,
hasstatus => false,
pattern => '/usr/bin/gunicorn',
service { 'gunicorn':
ensure => running,
enable => true,
hasrestart => true,
hasstatus => false,
pattern => '/usr/bin/gunicorn',
}
}
}

Expand Down
Loading