Skip to content

Instantly share code, notes, and snippets.

@kesor
Created December 16, 2012 12:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kesor/4306797 to your computer and use it in GitHub Desktop.
Save kesor/4306797 to your computer and use it in GitHub Desktop.
#
# installs and configures a graphite server
#
# depends on two modules from:
# - https://github.com/uggedal/puppet-module-nginx
# - https://github.com/uggedal/puppet-module-python
# global path for exec
Exec {
path => "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
# make pip behave itself!
environment => [
"PIP_LOG=/tmp/pip_install.log",
"PIP_USE_MIRRORS=1",
"PIP_TIMEOUT=300",
"PIP_DEFAULT_TIMEOUT=300",
"PIP_DOWNLOAD_CACHE=/var/spool/pip/cache"
]
}
class graphite::web($version="0.9.10",
$root="/opt/graphite",
$domain="graphite",
$timezone="America/Chicago",
$nginx_workers=1,
$gunicorn_version=undef,
$gunicorn_workers=1,
$gunicorn_timeout=30,
$django_version="1.4.2",
$tagging_version="0.3.1",
$ensure=present) {
$venv = $root
$src = "${root}/webapp"
$djangoroot = "${src}/graphite"
$mediaroot = "${src}/content"
$owner = "www-data"
$group = "www-data"
$pyversion = "2.7"
class { "nginx":
ensure => $ensure,
workers => $nginx_workers
}
class { "python::dev":
ensure => $ensure
}
class { "python::venv":
ensure => $ensure,
owner => $owner,
group => $group
}
class { "python::gunicorn":
ensure => $ensure,
owner => $owner,
group => $group
}
python::venv::isolate { $venv:
ensure => $ensure,
}
python::pip::install{
"Django $django_version":
package => "Django==$django_version",
ensure => $ensure,
venv => $venv,
owner => $owner,
group => $group,
require => Python::Venv::Isolate[$venv];
"django-tagging $tagging_version":
package => "django-tagging==$tagging_version",
ensure => $ensure,
venv => $venv,
owner => $owner,
group => $group,
require => Python::Pip::Install["Django $django_version"];
"graphite-web $version":
package => "graphite-web==$version",
ensure => $ensure,
venv => $venv,
owner => $owner,
group => $group,
require => Python::Pip::Install["django-tagging $tagging_version"];
"carbon $version":
package => "carbon==$version",
ensure => $ensure,
venv => $venv,
owner => $owner,
group => $group,
require => Python::Venv::Isolate[$venv];
"whisper $version":
package => "whisper==$version",
ensure => $ensure,
venv => $venv,
owner => $owner,
group => $group,
require => Python::Venv::Isolate[$venv];
}
##
# fix broken graphite-web and carbon pip installations
if $ensure == present {
$ensure_eggs = link
} elsif $ensure == 'absent' {
$ensure_eggs = absent
}
file { "$venv/lib/python2.7/site-packages/graphite_web-$version-py$pyversion.egg-info":
ensure => $ensure_eggs,
target => "$src/graphite_web-$version-py$pyversion.egg-info"
}
file { "$venv/lib/python2.7/site-packages/carbon-$version-py$pyversion.egg-info":
ensure => $ensure_eggs,
target => "$root/lib/carbon-$version-py$pyversion.egg-info"
}
##
# configure graphite-web django application
file { "${src}/graphite/local_settings.py":
ensure => $ensure,
content => template("${module_name}/graphite_settings.py.erb"),
}
exec { "graphite syncdb":
command => "$venv/bin/python manage.py syncdb --noinput",
cwd => $djangoroot,
require => File["${src}/graphite/local_settings.py"]
}
python::gunicorn::instance { "graphite-web":
venv => $venv,
src => $djangoroot,
ensure => $ensure,
django => true,
django_settings => "settings.py",
version => $gunicorn_version,
workers => $gunicorn_workers,
timeout_seconds => $gunicorn_timeout,
require => Exec["graphite syncdb"]
}
$socket = "${python::gunicorn::rundir}/graphite-web.sock"
nginx::site { "graphite-web":
domain => $domain,
root => $mediaroot,
upstreams => ["unix:$socket"],
# creates a loop with local_setttings.py
# require => Python::Gunicorn::Instance["graphite-web"],
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment