Showing with 1,910 additions and 51 deletions.
  1. +6 −0 .fixtures.yml
  2. +45 −0 .travis.yml
  3. +19 −0 Gemfile
  4. +0 −3 README.markdown
  5. +88 −0 README.md
  6. +40 −0 Rakefile
  7. +140 −0 manifests/alert_manager.pp
  8. +85 −0 manifests/alert_manager/config.pp
  9. +74 −0 manifests/alert_manager/install.pp
  10. +20 −0 manifests/alert_manager/run_service.pp
  11. +14 −8 manifests/init.pp
  12. +24 −11 manifests/install.pp
  13. +125 −0 manifests/node_exporter.pp
  14. +76 −0 manifests/node_exporter/config.pp
  15. +66 −0 manifests/node_exporter/install.pp
  16. +20 −0 manifests/node_exporter/run_service.pp
  17. +23 −9 manifests/params.pp
  18. +2 −2 metadata.json
  19. +41 −0 spec/classes/node_exporter-version_spec.rb
  20. +173 −0 templates/alert_manager.debian.erb
  21. +29 −0 templates/alert_manager.launchd.erb
  22. +99 −0 templates/alert_manager.sles.erb
  23. +18 −0 templates/alert_manager.systemd.erb
  24. +125 −0 templates/alert_manager.sysv.erb
  25. +31 −0 templates/alert_manager.upstart.erb
  26. +8 −0 templates/alert_manager.yaml.erb
  27. +173 −0 templates/node_exporter.debian.erb
  28. +27 −0 templates/node_exporter.launchd.erb
  29. +99 −0 templates/node_exporter.sles.erb
  30. +17 −0 templates/node_exporter.systemd.erb
  31. +125 −0 templates/node_exporter.sysv.erb
  32. +31 −0 templates/node_exporter.upstart.erb
  33. +8 −4 templates/prometheus.debian.erb
  34. +7 −1 templates/prometheus.launchd.erb
  35. +6 −2 templates/prometheus.sles.erb
  36. +7 −3 templates/prometheus.systemd.erb
  37. +6 −1 templates/prometheus.sysv.erb
  38. +5 −1 templates/prometheus.upstart.erb
  39. +6 −6 templates/prometheus.yaml.erb
  40. +2 −0 tests/init.pp
6 changes: 6 additions & 0 deletions .fixtures.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
fixtures:
repositories:
stdlib: "https://github.com/puppetlabs/puppetlabs-stdlib"
staging: "https://github.com/nanliu/puppet-staging"
symlinks:
"prometheus": "#{source_dir}"
45 changes: 45 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
---
language: ruby
bundler_args: --without development
before_install: rm Gemfile.lock || true
sudo: false
cache: bundler
rvm:
- 1.9.3
- 2.0.0
- 2.1.0
script: bundle exec rake test
env:
- PUPPET_VERSION="~> 3.1.0"
- PUPPET_VERSION="~> 3.3.0"
- PUPPET_VERSION="~> 3.7.4" FUTURE_PARSER=yes
- PUPPET_VERSION="~> 3.8.4"
- PUPPET_VERSION="~> 3.8.4" FUTURE_PARSER=yes
- PUPPET_VERSION="~> 4.0.0"
- PUPPET_VERSION="~> 4.1.0"
matrix:
exclude:
- rvm: 1.9.3
env: PUPPET_VERSION="~> 2.7.0"
- rvm: 2.0.0
env: PUPPET_VERSION="~> 2.7.0"
- rvm: 2.0.0
env: PUPPET_VERSION="~> 3.1.0"
- rvm: 2.1.0
env: PUPPET_VERSION="~> 2.7.0"
- rvm: 2.1.0
env: PUPPET_VERSION="~> 3.1.0"
- rvm: 2.1.0
env: PUPPET_VERSION="~> 3.2.0"
- rvm: 2.1.0
env: PUPPET_VERSION="~> 3.3.0"
- rvm: 2.1.0
env: PUPPET_VERSION="~> 3.4.0"
- rvm: 1.9.3
env: PUPPET_VERSION="~> 4.0.0"
- rvm: 2.0.0
env: PUPPET_VERSION="~> 4.0.0"
- rvm: 1.9.3
env: PUPPET_VERSION="~> 4.1.0"
- rvm: 2.0.0
env: PUPPET_VERSION="~> 4.1.0"
19 changes: 19 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
source "https://rubygems.org"

group :development,:test do
gem "json"
# Pin for 1.8.7 compatibility for now
gem "rake", '< 11.0.0'
gem "puppet", ENV['PUPPET_VERSION'] || '~> 3.7.0'
gem "puppet-lint"

# Pin for 1.8.7 compatibility for now
gem "rspec", '< 3.2.0'
gem "rspec-core", "3.1.7"
gem "rspec-puppet", "~> 2.1"

gem "puppet-syntax"
gem "puppetlabs_spec_helper"
gem "hiera"
gem "hiera-puppet-helper"
end
3 changes: 0 additions & 3 deletions README.markdown

This file was deleted.

88 changes: 88 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# puppet-prometheus
[![Puppet Forge](https://img.shields.io/puppetforge/e/brutus777/prometheus.svg)](https://forge.puppetlabs.com/brutus777/prometheus)
[![Puppet Forge](https://img.shields.io/puppetforge/v/brutus777/prometheus.svg)](https://forge.puppetlabs.com/brutus777/prometheus)
[![Puppet Forge](https://img.shields.io/puppetforge/f/brutus777/prometheus.svg)](https://forge.puppetlabs.com/brutus777/prometheus)

## Compatibility

| Prometheus Version | Recommended Puppet Module Version |
| ---------------- | ----------------------------------- |
| >= 0.16.2 | latest |


## Background

This module automates the install and configuration of Prometheus monitoring tool: [Prometheus web site](https://prometheus.io/docs/introduction/overview/)

### What This Module Affects

* Installs the prometheus daemon, alertmanager or exporters(via url or package)
* The package method was implemented, but currently there isn't any package for prometheus
* Optionally installs a user to run it under
* Installs a configuration file for prometheus daemon (/etc/prometheus/prometheus.yaml) or for alertmanager (/etc/prometheus/alert.rules)
* Manages the services via upstart, sysv, or systemd

## Usage

To set up a prometheus daemon:
On the server (for prometheus version < 1.0.0):

```puppet
class { '::prometheus':
global_config => { 'scrape_interval'=> '15s', 'evaluation_interval'=> '15s', 'external_labels'=> { 'monitor'=>'master'}},
rule_files => [ "/etc/prometheus/alert.rules" ],
scrape_configs => [ { 'job_name'=> 'prometheus', 'scrape_interval'=> '10s', 'scrape_timeout'=> '10s', 'target_groups'=> [ { 'targets'=> [ 'localhost:9090' ], 'labels'=> { 'alias'=> 'Prometheus'} } ] } ]
}
```

On the server (for prometheus version >= 1.0.0):

```puppet
class { 'prometheus':
version => '1.0.0',
scrape_configs => [ {'job_name'=>'prometheus','scrape_interval'=> '30s','scrape_timeout'=>'30s','static_configs'=> [{'targets'=>['localhost:9090'], 'labels'=> { 'alias'=>'Prometheus'}}]}],
extra_options => '-alertmanager.url http://localhost:9093 -web.console.templates=/opt/staging/prometheus-1.0.0.linux-amd64/consoles -web.console.libraries=/opt/staging/prometheus-1.0.0.linux-amd64/console_libraries',
localstorage => '/prometheus/prometheus',
}
```

or simply:
```puppet
include ::prometheus
```

On the monitored nodes:

```puppet
class { '::prometheus::node_exporter':
collectors => ['diskstats','filesystem','loadavg','meminfo','netdev','stat,time']
}
```

or:

```puppet
class { 'prometheus::node_exporter':
version => '0.12.0',
collectors => ['diskstats','filesystem','loadavg','meminfo','logind','netdev','netstat','stat','time','interrupts','ntp','tcpstat'],
extra_options => '-collector.ntp.server ntp1.orange.intra',
}
```

or simply:
```puppet
include ::prometheus::node_exporter
```

For more information regarding class parameters please take a look at class docstring.

## Limitations/Known issues

Do not use version 1.0.0 of Prometheus: https://groups.google.com/forum/#!topic/prometheus-developers/vuSIxxUDff8 ; it does break the compatibility with thus module!

Even if the module has templates for several linux distributions, only RH family distributions were tested.

## Development
Open an [issue](https://github.com/brutus333/puppet-prometheus/issues) or
[fork](https://github.com/brutus333/puppet-prometheus/fork) and open a
[Pull Request](https://github.com/brutus333/puppet-prometheus/pulls)
40 changes: 40 additions & 0 deletions Rakefile
Original file line number Diff line number Diff line change
@@ -1,2 +1,42 @@
require 'rubygems'
require 'bundler/setup'
require 'puppetlabs_spec_helper/rake_tasks'
require 'puppet-lint/tasks/puppet-lint'
require 'puppet-syntax/tasks/puppet-syntax'

# These two gems aren't always present, for instance
# on Travis with --without development
begin
require 'puppet_blacksmith/rake_tasks'
rescue LoadError
end

PuppetLint.configuration.send("disable_80chars")
PuppetLint.configuration.log_format = "%{path}:%{linenumber}:%{check}:%{KIND}:%{message}"
PuppetLint.configuration.fail_on_warnings = false

# Forsake support for Puppet 2.6.2 for the benefit of cleaner code.
# http://puppet-lint.com/checks/class_parameter_defaults/
PuppetLint.configuration.send('disable_class_parameter_defaults')
# http://puppet-lint.com/checks/class_inherits_from_params_class/
PuppetLint.configuration.send('disable_class_inherits_from_params_class')

exclude_paths = [
"pkg/**/*",
"vendor/**/*",
"spec/**/*",
]
PuppetLint.configuration.ignore_paths = exclude_paths
PuppetSyntax.exclude_paths = exclude_paths

#desc "Run acceptance tests"
#RSpec::Core::RakeTask.new(:acceptance) do |t|
# t.pattern = 'spec/acceptance'
#end

desc "Run syntax, lint, and spec tests."
task :test => [
:syntax,
:lint,
:spec,
]
140 changes: 140 additions & 0 deletions manifests/alert_manager.pp
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
# Class: prometheus::alert_manager
#
# This module manages prometheus alert_manager
#
# Parameters:
#
# [*manage_user*]
# Whether to create user for prometheus or rely on external code for that
#
# [*user*]
# User running prometheus
#
# [*manage_group*]
# Whether to create user for prometheus or rely on external code for that
#
# [*purge_config_dir*]
# Purge config files no longer generated by Puppet
#
# [*group*]
# Group under which prometheus is running
#
# [*bin_dir*]
# Directory where binaries are located
#
# [*arch*]
# Architecture (amd64 or i386)
#
# [*version*]
# Prometheus alert_manager release
#
# [*install_method*]
# Installation method: url or package (only url is supported currently)
#
# [*os*]
# Operating system (linux is the only one supported)
#
# [*download_url*]
# Complete URL corresponding to the Prometheus alert_manager release, default to undef
#
# [*download_url_base*]
# Base URL for prometheus alert_manager
#
# [*download_extension*]
# Extension of Prometheus alert_manager binaries archive
#
# [*package_name*]
# Prometheus alert_manager package name - not available yet
#
# [*package_ensure*]
# If package, then use this for package ensure default 'latest'
#
# [*config_file*]
# The configuration file for alert manager (it should be under $prometheus::config_dir directory, it depends on it)
#
# [*extra_options*]
# Extra options added to prometheus startup command
#
# [*service_enable*]
# Whether to enable or not prometheus alert_manager service from puppet (default true)
#
# [*service_ensure*]
# State ensured from prometheus alert_manager service (default 'running')
#
# [*manage_service*]
# Should puppet manage the prometheus alert_manager service? (default true)
#
# [*restart_on_change*]
# Should puppet restart prometheus alert_manager on configuration change? (default true)
#
# [*init_style*]
# Service startup scripts style (e.g. rc, upstart or systemd)
#
# Actions:
#
# Requires: see Modulefile
#
# Sample Usage:
#
class prometheus::alert_manager (
$manage_user = true,
$user = $::prometheus::params::user,
$manage_group = true,
$purge_config_dir = true,
$group = $::prometheus::params::group,
$bin_dir = $::prometheus::params::bin_dir,
$arch = $::prometheus::params::arch,
$version = $::prometheus::params::alert_manager_version,
$install_method = $::prometheus::params::install_method,
$os = $::prometheus::params::os,
$download_url = undef,
$download_url_base = $::prometheus::params::alert_manager_download_url_base,
$download_extension = $::prometheus::params::alert_manager_download_extension,
$package_name = $::prometheus::params::alert_manager_package_name,
$package_ensure = $::prometheus::params::alert_manager_package_ensure,
$storage_path = $::prometheus::params::alert_manager_storage_path,
$config_file = $::prometheus::params::alert_manager_config_file,
$global = $::prometheus::params::alert_manager_global,
$route = $::prometheus::params::alert_manager_route,
$receivers = $::prometheus::params::alert_manager_receivers,
$templates = $::prometheus::params::alert_manager_templates,
$inhibit_rules = $::prometheus::params::alert_manager_inhibit_rules,
$extra_options = '',
$config_mode = $::prometheus::params::config_mode,
$service_enable = true,
$service_ensure = 'running',
$manage_service = true,
$restart_on_change = true,
$init_style = $::prometheus::params::init_style,
) inherits prometheus::params {
if( versioncmp($::prometheus::alert_manager::version, '0.3.0') == -1 ){
$real_download_url = pick($download_url,
"${download_url_base}/download/${version}/${package_name}-${version}.${os}-${arch}.${download_extension}")
} else {
$real_download_url = pick($download_url,
"${download_url_base}/download/v${version}/${package_name}-${version}.${os}-${arch}.${download_extension}")
}
validate_bool($purge_config_dir)
validate_bool($manage_user)
validate_bool($manage_service)
validate_bool($restart_on_change)
validate_array($templates)
validate_array($receivers)
validate_array($inhibit_rules)
validate_hash($global)
validate_hash($route)
$notify_service = $restart_on_change ? {
true => Class['::prometheus::alert_manager::run_service'],
default => undef,
}

anchor {'alert_manager_first': }
->
class { '::prometheus::alert_manager::install': } ->
class { '::prometheus::alert_manager::config':
purge => $purge_config_dir,
notify => $notify_service,
} ->
class { '::prometheus::alert_manager::run_service': } ->
anchor {'alert_manager_last': }
}
Loading