summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README6
-rw-r--r--files/config/host/munin.conf.header.CentOS88
-rw-r--r--[l---------]files/config/host/munin.conf.header.Debian.sid76
-rw-r--r--[l---------]files/config/host/munin.conf.header.Debian.wheezy76
-rw-r--r--files/plugins/kvm_cpu101
-rw-r--r--files/plugins/kvm_io109
-rw-r--r--files/plugins/kvm_mem106
-rw-r--r--files/plugins/kvm_net148
-rw-r--r--manifests/client.pp33
-rw-r--r--manifests/client/base.pp47
-rw-r--r--manifests/client/centos.pp2
-rw-r--r--manifests/client/debian.pp24
-rw-r--r--manifests/client/gentoo.pp2
-rw-r--r--manifests/client/openbsd.pp102
-rw-r--r--manifests/client/package.pp18
-rw-r--r--manifests/host.pp16
-rw-r--r--manifests/host/cgi.pp26
-rw-r--r--manifests/plugin.pp95
-rw-r--r--manifests/plugin/deploy.pp72
-rw-r--r--manifests/plugin/scriptpaths.pp20
-rw-r--r--manifests/plugins/base.pp7
-rw-r--r--manifests/plugins/gentoo.pp6
-rw-r--r--manifests/plugins/interfaces.pp6
-rw-r--r--manifests/plugins/kvm.pp7
-rw-r--r--manifests/plugins/linux.pp2
-rw-r--r--manifests/register.pp33
-rw-r--r--manifests/register/snmp.pp36
-rw-r--r--manifests/remoteplugin.pp28
-rw-r--r--templates/client.erb8
-rw-r--r--templates/munin-node.conf.Debian.etch6
-rw-r--r--templates/munin-node.conf.default6
31 files changed, 977 insertions, 335 deletions
diff --git a/README b/README
index 22bb19f..1e47d27 100644
--- a/README
+++ b/README
@@ -28,7 +28,7 @@ To use this module, follow these directions:
a. Your modules directory will need all the files included in this repository placed
under a directory called "munin"
- b. Add your hiera storage value for munin_allow which indicates what IP should be allowed to
+ b. Add your class parameter for munin::client::allow which indicates what IP should be allowed to
connect to your individual munin-nodes (this is typically your main munin host's IP):
munin_allow: '192.168.0.1'
@@ -68,9 +68,9 @@ To use this module, follow these directions:
f. If you have Linux-Vservers configured, you will likely have multiple munin-node processes
competing for the default port 4949, for those nodes, set an alternate port for munin-node
- to run on by putting something similar to the following in hiera's node scope:
+ to run on by putting something similar to the following class parameter:
- munin_port: 4948
+ port => 4948
g. If you'd like to do cgi graphing, please note the following page: http://munin.projects.linpro.no/wiki/CgiHowto
For CentOS this is enabled in the default header config
diff --git a/files/config/host/munin.conf.header.CentOS b/files/config/host/munin.conf.header.CentOS
index 413cd84..f212ce0 100644
--- a/files/config/host/munin.conf.header.CentOS
+++ b/files/config/host/munin.conf.header.CentOS
@@ -5,26 +5,40 @@
# must be writable by the user running munin-cron. They are all
# defaulted to the values you see here.
#
-# dbdir /var/lib/munin
-# htmldir /var/www/html/munin
-# logdir /var/log/munin
-# rundir /var/run/munin
+#dbdir /var/lib/munin
+#htmldir /var/www/html/munin
+htmldir /var/www/html/munin
+#logdir /var/log/munin
+#rundir /var/run/munin
+
+# Where to look for the HTML templates
#
-# tmpldir /etc/munin/templates
+#tmpldir /etc/munin/templates
-# (Exactly one) directory to include all files from.
+# Where to look for the static www files
+#
+#staticdir /etc/munin/static
+
+# temporary cgi files are here. note that it has to be writable by
+# the cgi user (usually nobody or httpd).
#
-# includedir /etc/munin/munin-conf.d
+# cgitmpdir /var/lib/munin/cgi-tmp
-# Make graphs show values per minute instead of per second
-#graph_period minute
+# (Exactly one) directory to include all files from.
+includedir /etc/munin/conf.d
+
+# You can choose the time reference for "DERIVE" like graphs, and show
+# "per minute", "per hour" values instead of the default "per second"
+#
+#graph_period second
-# Graphics files are normaly generated by munin-graph, no matter if
-# the graphs are used or not. You can change this to
-# on-demand-graphing by following the instructions in
-# http://munin.projects.linpro.no/wiki/CgiHowto
+# Graphics files are generated either via cron or by a CGI process.
+# See http://munin-monitoring.org/wiki/CgiHowto2 for more
+# documentation.
+# Since 2.0, munin-graph has been rewritten to use the cgi code.
+# It is single threaded *by design* now.
#
-graph_strategy cgi
+#graph_strategy cgi
# munin-cgi-graph is invoked by the web server up to very many times at the
# same time. This is not optimal since it results in high CPU and memory
@@ -36,15 +50,41 @@ graph_strategy cgi
# If the automatic CGI url is wrong for your system override it here:
#
-#cgiurl_graph /cgi-bin/munin-cgi-graph
+#cgiurl_graph /munin-cgi/munin-cgi-graph
+
+# max_size_x and max_size_y are the max size of images in pixel.
+# Default is 4000. Do not make it too large otherwise RRD might use all
+# RAM to generate the images.
+#
+#max_size_x 4000
+#max_size_y 4000
-# munin-graph runs in parallel, the number of concurrent processes is
-# 6. If you want munin-graph to not be parallel set to 0. If set too
-# high it will slow down munin-graph. Some experiments are needed to
-# determine how many are optimal on your system. On a multi-core
-# system with good SCSI disks the number can probably be quite high.
+# HTML files are normally generated by munin-html, no matter if the
+# files are used or not. You can change this to on-demand generation
+# by following the instructions in http://munin-monitoring.org/wiki/CgiHowto2
+#
+# Notes:
+# - moving to CGI for HTML means you cannot have graph generated by cron.
+# - cgi html has some bugs, mostly you still have to launch munin-html by hand
+#
+html_strategy cron
+
+# munin-update runs in parallel.
+#
+# The default max number of processes is 16, and is probably ok for you.
+#
+# If set too high, it might hit some process/ram/filedesc limits.
+# If set too low, munin-update might take more than 5 min.
+#
+# If you want munin-update to not be parallel set it to 0.
#
-#max_graph_jobs 6
+#max_processes 16
+
+# RRD updates are per default, performed directly on the rrd files.
+# To reduce IO and enable the use of the rrdcached, uncomment it and set it to
+# the location of the socket that rrdcached uses.
+#
+#rrdcached_socket /var/run/rrdcached.sock
# Drop somejuser@fnord.comm and anotheruser@blibb.comm an email everytime
# something changes (OK -> WARNING, CRITICAL -> OK, etc)
@@ -53,11 +93,7 @@ graph_strategy cgi
#
# For those with Nagios, the following might come in handy. In addition,
# the services must be defined in the Nagios server as well.
-#contact.nagios.command /usr/sbin/send_nsca -H nagios.host.com -c /etc/send_nsca.cfg
-
-contacts me
-contact.me.command mail -s "Munin notification ${var:group} :: ${var:host} :: ${var:graph_title}" root
-contact.me.always_send warning critical
+#contact.nagios.command /usr/bin/send_nsca nagios.host.comm -c /etc/nsca.conf
# a simple host tree
#[localhost]
diff --git a/files/config/host/munin.conf.header.Debian.sid b/files/config/host/munin.conf.header.Debian.sid
index 5fa2037..771d50d 120000..100644
--- a/files/config/host/munin.conf.header.Debian.sid
+++ b/files/config/host/munin.conf.header.Debian.sid
@@ -1 +1,75 @@
-munin.conf.header.Debian.squeeze \ No newline at end of file
+# Example configuration file for Munin, generated by 'make build'
+
+# The next three variables specifies where the location of the RRD
+# databases, the HTML output, and the logs, severally. They all
+# must be writable by the user running munin-cron.
+dbdir /var/lib/munin
+htmldir /var/cache/munin/www
+logdir /var/log/munin
+rundir /var/run/munin
+
+# Where to look for the HTML templates
+tmpldir /etc/munin/templates
+
+# Make graphs show values per minute instead of per second
+#graph_period minute
+
+# Drop somejuser@fnord.comm and anotheruser@blibb.comm an email everytime
+# something changes (OK -> WARNING, CRITICAL -> OK, etc)
+#contact.someuser.command mail -s "Munin notification" somejuser@fnord.comm
+#contact.anotheruser.command mail -s "Munin notification" anotheruser@blibb.comm
+#
+# For those with Nagios, the following might come in handy. In addition,
+# the services must be defined in the Nagios server as well.
+#contact.nagios.command /usr/sbin/send_nsca -H nagios.host.com -c /etc/send_nsca.cfg
+
+#contacts me
+#contact.me.command mail -s "Munin notification ${var:group} :: ${var:host} :: ${var:graph_title}" root
+#contact.me.always_send warning critical
+
+# a simple host tree
+#[localhost]
+# address 127.0.0.1
+# use_node_name yes
+
+#
+# A more complex example of a host tree
+#
+## First our "normal" host.
+# [fii.foo.com]
+# address foo
+#
+## Then our other host...
+# [fay.foo.com]
+# address fay
+#
+## Then we want totals...
+# [foo.com;Totals] #Force it into the "foo.com"-domain...
+# update no # Turn off data-fetching for this "host".
+#
+# # The graph "load1". We want to see the loads of both machines...
+# # "fii=fii.foo.com:load.load" means "label=machine:graph.field"
+# load1.graph_title Loads side by side
+# load1.graph_order fii=fii.foo.com:load.load fay=fay.foo.com:load.load
+#
+# # The graph "load2". Now we want them stacked on top of each other.
+# load2.graph_title Loads on top of each other
+# load2.dummy_field.stack fii=fii.foo.com:load.load fay=fay.foo.com:load.load
+# load2.dummy_field.draw AREA # We want area instead the default LINE2.
+# load2.dummy_field.label dummy # This is needed. Silly, really.
+#
+# # The graph "load3". Now we want them summarised into one field
+# load3.graph_title Loads summarised
+# load3.combined_loads.sum fii.foo.com:load.load fay.foo.com:load.load
+# load3.combined_loads.label Combined loads # Must be set, as this is
+# # not a dummy field!
+#
+## ...and on a side note, I want them listen in another order (default is
+## alphabetically)
+#
+# # Since [foo.com] would be interpreted as a host in the domain "com", we
+# # specify that this is a domain by adding a semicolon.
+# [foo.com;]
+# node_order Totals fii.foo.com fay.foo.com
+#
+
diff --git a/files/config/host/munin.conf.header.Debian.wheezy b/files/config/host/munin.conf.header.Debian.wheezy
index 5fa2037..771d50d 120000..100644
--- a/files/config/host/munin.conf.header.Debian.wheezy
+++ b/files/config/host/munin.conf.header.Debian.wheezy
@@ -1 +1,75 @@
-munin.conf.header.Debian.squeeze \ No newline at end of file
+# Example configuration file for Munin, generated by 'make build'
+
+# The next three variables specifies where the location of the RRD
+# databases, the HTML output, and the logs, severally. They all
+# must be writable by the user running munin-cron.
+dbdir /var/lib/munin
+htmldir /var/cache/munin/www
+logdir /var/log/munin
+rundir /var/run/munin
+
+# Where to look for the HTML templates
+tmpldir /etc/munin/templates
+
+# Make graphs show values per minute instead of per second
+#graph_period minute
+
+# Drop somejuser@fnord.comm and anotheruser@blibb.comm an email everytime
+# something changes (OK -> WARNING, CRITICAL -> OK, etc)
+#contact.someuser.command mail -s "Munin notification" somejuser@fnord.comm
+#contact.anotheruser.command mail -s "Munin notification" anotheruser@blibb.comm
+#
+# For those with Nagios, the following might come in handy. In addition,
+# the services must be defined in the Nagios server as well.
+#contact.nagios.command /usr/sbin/send_nsca -H nagios.host.com -c /etc/send_nsca.cfg
+
+#contacts me
+#contact.me.command mail -s "Munin notification ${var:group} :: ${var:host} :: ${var:graph_title}" root
+#contact.me.always_send warning critical
+
+# a simple host tree
+#[localhost]
+# address 127.0.0.1
+# use_node_name yes
+
+#
+# A more complex example of a host tree
+#
+## First our "normal" host.
+# [fii.foo.com]
+# address foo
+#
+## Then our other host...
+# [fay.foo.com]
+# address fay
+#
+## Then we want totals...
+# [foo.com;Totals] #Force it into the "foo.com"-domain...
+# update no # Turn off data-fetching for this "host".
+#
+# # The graph "load1". We want to see the loads of both machines...
+# # "fii=fii.foo.com:load.load" means "label=machine:graph.field"
+# load1.graph_title Loads side by side
+# load1.graph_order fii=fii.foo.com:load.load fay=fay.foo.com:load.load
+#
+# # The graph "load2". Now we want them stacked on top of each other.
+# load2.graph_title Loads on top of each other
+# load2.dummy_field.stack fii=fii.foo.com:load.load fay=fay.foo.com:load.load
+# load2.dummy_field.draw AREA # We want area instead the default LINE2.
+# load2.dummy_field.label dummy # This is needed. Silly, really.
+#
+# # The graph "load3". Now we want them summarised into one field
+# load3.graph_title Loads summarised
+# load3.combined_loads.sum fii.foo.com:load.load fay.foo.com:load.load
+# load3.combined_loads.label Combined loads # Must be set, as this is
+# # not a dummy field!
+#
+## ...and on a side note, I want them listen in another order (default is
+## alphabetically)
+#
+# # Since [foo.com] would be interpreted as a host in the domain "com", we
+# # specify that this is a domain by adding a semicolon.
+# [foo.com;]
+# node_order Totals fii.foo.com fay.foo.com
+#
+
diff --git a/files/plugins/kvm_cpu b/files/plugins/kvm_cpu
new file mode 100644
index 0000000..f48d9f0
--- /dev/null
+++ b/files/plugins/kvm_cpu
@@ -0,0 +1,101 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+# vim: set fileencoding=utf-8
+#
+# Munin plugin to show CPU used by vm
+#
+# Copyright Maxence Dunnewind, Rodolphe Quiédeville
+#
+# License : GPLv3
+#
+# parsed environment variables:
+# vmsuffix: part of vm name to be removed
+#
+#%# capabilities=autoconf
+#%# family=contrib
+
+import re, os, sys
+from subprocess import Popen, PIPE
+
+def config(vm_names):
+ ''' Print the plugin's config
+ @param vm_names : a list of "cleaned" vms' name
+ '''
+ percent = len(filter(lambda x: x[0:3] == 'cpu' and x[3] != ' ', open('/proc/stat', 'r').readlines())) * 100
+
+ base_config = """graph_title KVM Virtual Machine CPU usage
+graph_vlabel %%
+graph_category KVM
+graph_scale no
+graph_period second
+graph_info This graph shows the current CPU used by virtual machines
+graph_args --base 1000 -r --lower-limit 0 --upper-limit %d""" % percent
+ print base_config
+ draw = "AREA"
+ for vm in vm_names:
+ print "%s_cpu.label %s" % (vm, vm)
+ print "%s_cpu.min 0" % vm
+ print "%s_cpu.type DERIVE" % vm
+ print "%s_cpu.draw %s" % (vm, draw)
+ print "%s_cpu.info percent of cpu time used by virtual machine" % vm
+ draw = "STACK"
+
+
+def clean_vm_name(vm_name):
+ ''' Replace all special chars
+ @param vm_name : a vm's name
+ @return cleaned vm's name
+ '''
+
+ # suffix part defined in conf
+ suffix = os.getenv('vmsuffix')
+ if suffix:
+ vm_name = re.sub(suffix,'',vm_name)
+
+ return re.sub(r"[^a-zA-Z0-9_]", "_", vm_name)
+
+def detect_kvm():
+ ''' Check if kvm is installed
+ '''
+ kvm = Popen("which kvm", shell=True, stdout=PIPE)
+ kvm.communicate()
+ return not bool(kvm.returncode)
+
+def find_vm_names(pids):
+ '''Find and clean vm names from pids
+ @return a dictionnary of {pids : cleaned vm name}
+ '''
+ result = {}
+ for pid in pids:
+ cmdline = open("/proc/%s/cmdline" % pid, "r")
+ result[pid] = clean_vm_name(re.sub(r"^.*-name\x00([a-zA-Z0-9.-]*)\x00\-.*$",r"\1", cmdline.readline()))
+ return result
+
+def list_pids():
+ ''' Find the pid of kvm processes
+ @return a list of pids from running kvm
+ '''
+ pid = Popen("pidof qemu-kvm kvm", shell=True, stdout=PIPE)
+ return pid.communicate()[0].split()
+
+def fetch(vms):
+ ''' Fetch values for a list of pids
+ @param dictionnary {kvm_pid: cleaned vm name}
+ '''
+ for ( pid, name ) in vms.iteritems():
+ ( user, system ) = open("/proc/%s/stat" % pid, 'r').readline().split(' ')[13:15]
+ print '%s_cpu.value %d' % ( name, int(user) + int(system) )
+
+if __name__ == "__main__":
+ if len(sys.argv) > 1:
+ if sys.argv[1] in ['autoconf', 'detect']:
+ if detect_kvm():
+ print "yes"
+ else:
+ print "no"
+ elif sys.argv[1] == "config":
+ config(find_vm_names(list_pids()).values())
+ else:
+ fetch(find_vm_names(list_pids()))
+ else:
+ fetch(find_vm_names(list_pids()))
diff --git a/files/plugins/kvm_io b/files/plugins/kvm_io
new file mode 100644
index 0000000..43941f5
--- /dev/null
+++ b/files/plugins/kvm_io
@@ -0,0 +1,109 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+# vim: set fileencoding=utf-8
+#
+# Munin plugin to show io by vm
+#
+# Copyright Maxence Dunnewind, Rodolphe Quiédeville
+#
+# License : GPLv3
+#
+# parsed environment variables:
+# vmsuffix: part of vm name to be removed
+#
+#%# capabilities=autoconf
+#%# family=contrib
+
+import re, os, sys
+from subprocess import Popen, PIPE
+
+def config(vm_names):
+ ''' Print the plugin's config
+ @param vm_names : a list of "cleaned" vms' name
+ '''
+ base_config = """graph_title KVM Virtual Machine IO usage
+graph_vlabel Bytes read(-)/written(+) per second
+graph_category KVM
+graph_info This graph shows the block device I/O used of virtual machines
+graph_args --base 1024"""
+ print base_config
+
+ for vm in vm_names:
+ print "%s_read.label %s" % (vm, vm)
+ print "%s_read.type COUNTER" % vm
+ print "%s_read.min 0" % vm
+ print "%s_read.draw LINE1" % vm
+ print "%s_read.info I/O used by virtual machine %s" % (vm, vm)
+ print "%s_write.label %s" % (vm, vm)
+ print "%s_write.type COUNTER" % vm
+ print "%s_write.min 0" % vm
+ print "%s_write.draw LINE1" % vm
+ print "%s_write.negative %s_read" % (vm, vm)
+ print "%s_write.info I/O used by virtual machine %s" % (vm, vm)
+
+def clean_vm_name(vm_name):
+ ''' Replace all special chars
+ @param vm_name : a vm's name
+ @return cleaned vm's name
+ '''
+ # suffix part defined in conf
+ suffix = os.getenv('vmsuffix')
+ if suffix:
+ vm_name = re.sub(suffix,'',vm_name)
+
+ return re.sub(r"[^a-zA-Z0-9_]", "_", vm_name)
+
+def fetch(vms):
+ ''' Fetch values for a list of pids
+ @param dictionnary {kvm_pid: cleaned vm name}
+ '''
+ res = {}
+ for pid in vms:
+ f = open("/proc/%s/io" % pid, "r")
+ for line in f.readlines():
+ if "read_bytes" in line:
+ read = line.split()[1]
+ print "%s_read.value %s" % (vms[pid], read)
+ if "write_bytes" in line:
+ write = line.split()[1]
+ print "%s_write.value %s" % (vms[pid], write)
+ break
+ f.close()
+
+def detect_kvm():
+ ''' Check if kvm is installed
+ '''
+ kvm = Popen("which kvm", shell=True, stdout=PIPE)
+ kvm.communicate()
+ return not bool(kvm.returncode)
+
+def find_vm_names(pids):
+ '''Find and clean vm names from pids
+ @return a dictionnary of {pids : cleaned vm name}
+ '''
+ result = {}
+ for pid in pids:
+ cmdline = open("/proc/%s/cmdline" % pid, "r")
+ result[pid] = clean_vm_name(re.sub(r"^.*-name\x00([a-zA-Z0-9.-]*)\x00\-.*$",r"\1", cmdline.readline()))
+ return result
+
+def list_pids():
+ ''' Find the pid of kvm processes
+ @return a list of pids from running kvm
+ '''
+ pid = Popen("pidof qemu-kvm kvm", shell=True, stdout=PIPE)
+ return pid.communicate()[0].split()
+
+if __name__ == "__main__":
+ if len(sys.argv) > 1:
+ if sys.argv[1] in ['autoconf', 'detect']:
+ if detect_kvm():
+ print "yes"
+ else:
+ print "no"
+ elif sys.argv[1] == "config":
+ config(find_vm_names(list_pids()).values())
+ else:
+ fetch(find_vm_names(list_pids()))
+ else:
+ fetch(find_vm_names(list_pids()))
diff --git a/files/plugins/kvm_mem b/files/plugins/kvm_mem
new file mode 100644
index 0000000..14fb793
--- /dev/null
+++ b/files/plugins/kvm_mem
@@ -0,0 +1,106 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+# vim: set fileencoding=utf-8
+#
+# Munin plugin to show amount of memory used by vm
+#
+# Copyright Maxence Dunnewind, Rodolphe Quiédeville, Adrien Pujol
+#
+# License : GPLv3
+#
+# parsed environment variables:
+# vmsuffix: part of vm name to be removed
+#
+#%# capabilities=autoconf
+#%# family=contrib
+
+import re, os, sys
+from subprocess import Popen, PIPE
+
+def config(vm_names):
+ ''' Print the plugin's config
+ @param vm_names : a list of "cleaned" vms' name
+ '''
+ base_config = """graph_title KVM Virtual Machine Memory usage
+graph_vlabel Bytes
+graph_category KVM
+graph_info This graph shows the current amount of memory used by virtual machines
+graph_args --base 1024"""
+ print base_config
+ draw = "AREA"
+ for vm in vm_names:
+ print "%s_mem.label %s" % (vm, vm)
+ print "%s_mem.type GAUGE" % vm
+ if draw == 'AREA':
+ print "%s_mem.min 0" % vm
+ print "%s_mem.draw %s" % (vm, draw)
+ print "%s_mem.info memory used by virtual machine %s" % (vm, vm)
+ draw = "STACK"
+
+
+def clean_vm_name(vm_name):
+ ''' Replace all special chars
+ @param vm_name : a vm's name
+ @return cleaned vm's name
+ '''
+ # suffix part defined in conf
+ suffix = os.getenv('vmsuffix')
+ if suffix:
+ vm_name = re.sub(suffix,'',vm_name)
+
+ return re.sub(r"[^a-zA-Z0-9_]", "_", vm_name)
+
+def fetch(vms):
+ ''' Fetch values for a list of pids
+ @param dictionnary {kvm_pid: cleaned vm name}
+ '''
+ res = {}
+ for pid in vms:
+ try:
+ cmdline = open("/proc/%s/cmdline" % pid, "r")
+ amount = re.sub(r"^.*-m\x00(.*)\x00-smp.*$",r"\1", cmdline.readline())
+ ammount = int(amount) * 1024 * 1024
+ print "%s_mem.value %s" % (vms[pid], ammount)
+ except:
+ cmdline = open("/proc/%s/cmdline" % pid, "r")
+ amount = re.sub(r"^.*-m\x00(\d+).*$",r"\1", cmdline.readline())
+ ammount = int(amount) * 1024 * 1024
+ print "%s_mem.value %s" % (vms[pid], ammount)
+
+def detect_kvm():
+ ''' Check if kvm is installed
+ '''
+ kvm = Popen("which kvm", shell=True, stdout=PIPE)
+ kvm.communicate()
+ return not bool(kvm.returncode)
+
+def find_vm_names(pids):
+ '''Find and clean vm names from pids
+ @return a dictionnary of {pids : cleaned vm name}
+ '''
+ result = {}
+ for pid in pids:
+ cmdline = open("/proc/%s/cmdline" % pid, "r")
+ result[pid] = clean_vm_name(re.sub(r"^.*-name\x00([a-zA-Z0-9.-]*)\x00\-.*$",r"\1", cmdline.readline()))
+ return result
+
+def list_pids():
+ ''' Find the pid of kvm processes
+ @return a list of pids from running kvm
+ '''
+ pid = Popen("pidof qemu-kvm kvm", shell=True, stdout=PIPE)
+ return pid.communicate()[0].split()
+
+if __name__ == "__main__":
+ if len(sys.argv) > 1:
+ if sys.argv[1] in ['autoconf', 'detect']:
+ if detect_kvm():
+ print "yes"
+ else:
+ print "no"
+ elif sys.argv[1] == "config":
+ config(find_vm_names(list_pids()).values())
+ else:
+ fetch(find_vm_names(list_pids()))
+ else:
+ fetch(find_vm_names(list_pids()))
diff --git a/files/plugins/kvm_net b/files/plugins/kvm_net
new file mode 100644
index 0000000..c7b5aca
--- /dev/null
+++ b/files/plugins/kvm_net
@@ -0,0 +1,148 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+# vim: set fileencoding=utf-8
+#
+# Munin plugin to show the network I/O per vm
+# On redhat based systems
+#
+# Copyright Igor Borodikhin
+# Copyright Peter Meier
+#
+# License : GPLv3
+#
+#
+# parsed environment variables:
+# vmsuffix: part of vm name to be removed
+#
+#%# capabilities=autoconf
+#%# family=contrib
+
+import re, os, sys
+from subprocess import Popen, PIPE
+
+def config(vms):
+ ''' Print the plugin's config
+ @param vm_names : a list of "cleaned" vms' name
+ '''
+ base_config = """graph_title KVM Network I/O
+graph_vlabel Bytes rx(-)/tx(+) per second
+graph_category KVM
+graph_info This graph shows the network I/O of the virtual machines
+graph_args --base 1024"""
+ print base_config
+ for pid in vms:
+ macs = get_vm_macs(pid)
+ i = 0
+ for mac in macs:
+ print "%s_eth%s_in.label %s_eth%s" % (vms[pid],i, vms[pid], i)
+ print "%s_eth%s_in.type COUNTER" % (vms[pid], i)
+ print "%s_eth%s_in.min 0" % (vms[pid],i)
+ print "%s_eth%s_in.draw LINE2" % (vms[pid],i)
+ print "%s_eth%s_out.negative %s_eth%s_in" % (vms[pid], i, vms[pid], i)
+ print "%s_eth%s_out.label %s_eth%s" % (vms[pid], i, vms[pid], i)
+ print "%s_eth%s_out.type COUNTER" % (vms[pid], i)
+ print "%s_eth%s_out.min 0" % (vms[pid], i)
+ print "%s_eth%s_out.draw LINE2" % (vms[pid], i)
+ i += 1
+
+def clean_vm_name(vm_name):
+ ''' Replace all special chars
+ @param vm_name : a vm's name
+ @return cleaned vm's name
+ '''
+ # suffix part defined in conf
+ suffix = os.getenv('vmsuffix')
+ if suffix:
+ vm_name = re.sub(suffix,'',vm_name)
+
+ return re.sub(r"[^a-zA-Z0-9_]", "_", vm_name)
+
+def fetch(vms):
+ ''' Fetch values for a list of pids
+ @param dictionnary {kvm_pid: cleaned vm name}
+ '''
+ res = {}
+ macs_to_inf = find_macs_to_inf()
+ interfaces = {}
+ for e in Popen('cat /proc/net/dev | awk \'{ print $1 ":" $9 }\'', shell=True, stdout=PIPE).communicate()[0].split('\n'):
+ s = e.split(':')
+ if len(s) == 3:
+ interfaces[s[0]] = (s[1],s[2])
+ for pid in vms:
+ macs = get_vm_macs(pid)
+ i = 0
+ for mac in macs:
+ inf = macs_to_inf[mac]
+ values = interfaces[inf]
+ if len(values) == 2:
+ print "%s_eth%s_in.value %s" % (vms[pid], i, values[0])
+ print "%s_eth%s_out.value %s" % (vms[pid], i, values[1])
+ i += 1
+
+def detect_kvm():
+ ''' Check if kvm is installed
+ '''
+ kvm = Popen("which kvm", shell=True, stdout=PIPE)
+ kvm.communicate()
+ return not bool(kvm.returncode)
+
+def find_vm_names(pids):
+ '''Find and clean vm names from pids
+ @return a dictionnary of {pids : cleaned vm name}
+ '''
+ result = {}
+ for pid in pids:
+ cmdline = open("/proc/%s/cmdline" % pid, "r")
+ result[pid] = clean_vm_name(re.sub(r"^.*-name\x00([a-zA-Z0-9.-]*)\x00\-.*$",r"\1", cmdline.readline()))
+ return result
+
+def get_vm_macs(pid):
+ '''Find macs for a pid
+ @return the mac addresses for a specified pid
+ '''
+ cmdline = open("/proc/%s/cmdline" % pid, "r")
+ line = cmdline.readline()
+ # macs are fe:... on the host
+ macs = [ re.sub(r"^\d{2}",'fe',p.split('=')[1]) for p in line.split(",") if re.match(r"^mac(addr)?=",p) ]
+ return macs
+
+def list_pids():
+ ''' Find the pid of kvm processes
+ @return a list of pids from running kvm
+ '''
+ pid = Popen("pidof qemu-kvm kvm", shell=True, stdout=PIPE)
+ return pid.communicate()[0].split()
+
+def find_macs_to_inf():
+ ''' Find interfaces for vms
+ @return a dictionary of macs to inf
+ '''
+ result = {}
+ inf = ""
+ kvm = Popen("ip a | grep -E -A 1 '(tap|vnet)' | awk '{print $2}' | grep -v '^$'", shell=True, stdout=PIPE)
+ res = kvm.communicate()[0].split('\n')
+ for line in res:
+ if len(line) > 0:
+ if re.match(r"^tap.*", line):
+ inf = re.sub(r"(tap[^:]+):", r"\1", line)
+ elif re.match(r"^vnet.*", line):
+ inf = re.sub(r"(vnet[^:]+):", r"\1", line)
+ else:
+ result[line] = inf
+
+ return result
+
+if __name__ == "__main__":
+ if len(sys.argv) > 1:
+ if sys.argv[1] in ['autoconf', 'detect']:
+ if detect_kvm():
+ print "yes"
+ else:
+ print "no"
+ elif sys.argv[1] == "config":
+ config(find_vm_names(list_pids()))
+ else:
+ fetch(find_vm_names(list_pids()))
+ else:
+ fetch(find_vm_names(list_pids()))
+
diff --git a/manifests/client.pp b/manifests/client.pp
index 0ff5b79..934d23a 100644
--- a/manifests/client.pp
+++ b/manifests/client.pp
@@ -3,17 +3,26 @@
# See LICENSE for the full license granted to you.
# Adapted and improved by admin(at)immerda.ch
-class munin::client {
-
- case $::operatingsystem {
- openbsd: { include munin::client::openbsd }
- darwin: { include munin::client::darwin }
- debian,ubuntu: { include munin::client::debian }
- gentoo: { include munin::client::gentoo }
- centos: { include munin::client::package }
- default: { include munin::client::base }
- }
- if $use_shorewall {
- include shorewall::rules::munin
+class munin::client(
+ $allow = [ '127.0.0.1' ],
+ $host = '*',
+ $port = '4949',
+ $manage_shorewall = false,
+ $shorewall_collector_source = 'net'
+) {
+ case $::operatingsystem {
+ openbsd: { include munin::client::openbsd }
+ darwin: { include munin::client::darwin }
+ debian,ubuntu: { include munin::client::debian }
+ gentoo: { include munin::client::gentoo }
+ centos: { include munin::client::package }
+ default: { include munin::client::base }
+ }
+ if $munin::client::manage_shorewall {
+ class{'shorewall::rules::munin':
+ munin_port => $port,
+ munin_collector => delete($allow,'127.0.0.1'),
+ collector_source => $shorewall_collector_source,
}
+ }
}
diff --git a/manifests/client/base.pp b/manifests/client/base.pp
index 0c7a62a..84ba9b2 100644
--- a/manifests/client/base.pp
+++ b/manifests/client/base.pp
@@ -1,23 +1,26 @@
-class munin::client::base(
- $munin_allow = hiera('munin_allow','127.0.0.1')
-) {
- service { 'munin-node':
- ensure => running,
- enable => true,
- hasstatus => true,
- hasrestart => true,
- }
- file {'/etc/munin':
- ensure => directory,
- mode => 0755, owner => root, group => 0;
- }
- file {'/etc/munin/munin-node.conf':
- content => template("munin/munin-node.conf.${::operatingsystem}"),
- notify => Service['munin-node'],
- mode => 0644, owner => root, group => 0,
- }
- munin::register { $::fqdn:
- config => [ 'use_node_name yes', 'load.load.warning 5', 'load.load.critical 10'],
- }
- include munin::plugins::base
+class munin::client::base {
+ service { 'munin-node':
+ ensure => running,
+ enable => true,
+ hasstatus => true,
+ hasrestart => true,
+ }
+ file {'/etc/munin':
+ ensure => directory,
+ mode => 0755, owner => root, group => 0;
+ }
+ file {'/etc/munin/munin-node.conf':
+ content => template("munin/munin-node.conf.${::operatingsystem}"),
+ notify => Service['munin-node'],
+ mode => 0644, owner => root, group => 0,
+ }
+ munin::register { $::fqdn:
+ host => $munin::client::host ? {
+ '*' => $::fqdn,
+ default => $munin::client::host
+ },
+ port => $munin::client::port,
+ config => [ 'use_node_name yes', 'load.load.warning 5', 'load.load.critical 10'],
+ }
+ include munin::plugins::base
}
diff --git a/manifests/client/centos.pp b/manifests/client/centos.pp
index 42e8c59..3a7151b 100644
--- a/manifests/client/centos.pp
+++ b/manifests/client/centos.pp
@@ -1,3 +1,3 @@
class munin::client::centos inherits munin::client::package {
- include munin::plugins::centos
+ include munin::plugins::centos
}
diff --git a/manifests/client/debian.pp b/manifests/client/debian.pp
index 903fb2d..e67ac26 100644
--- a/manifests/client/debian.pp
+++ b/manifests/client/debian.pp
@@ -1,15 +1,15 @@
class munin::client::debian inherits munin::client::package {
- # the plugin will need that
- package { "iproute": ensure => installed }
+ # the plugin will need that
+ package { "iproute": ensure => installed }
- Service["munin-node"]{
- # sarge's munin-node init script has no status
- hasstatus => $::lsbdistcodename ? { sarge => false, default => true }
- }
- File["/etc/munin/munin-node.conf"]{
- content => template("munin/munin-node.conf.${::operatingsystem}.${::lsbdistcodename}"),
- }
- # workaround bug in munin_node_configure
- plugin { "postfix_mailvolume": ensure => absent }
- include munin::plugins::debian
+ Service["munin-node"]{
+ # sarge's munin-node init script has no status
+ hasstatus => $::lsbdistcodename ? { sarge => false, default => true }
+ }
+ File["/etc/munin/munin-node.conf"]{
+ content => template("munin/munin-node.conf.${::operatingsystem}.${::lsbdistcodename}"),
+ }
+ # workaround bug in munin_node_configure
+ plugin { "postfix_mailvolume": ensure => absent }
+ include munin::plugins::debian
}
diff --git a/manifests/client/gentoo.pp b/manifests/client/gentoo.pp
index c24d317..6a01050 100644
--- a/manifests/client/gentoo.pp
+++ b/manifests/client/gentoo.pp
@@ -4,5 +4,5 @@ class munin::client::gentoo inherits munin::client::package {
category => 'net-analyzer',
}
- include munin::plugins::gentoo
+ include munin::plugins::gentoo
}
diff --git a/manifests/client/openbsd.pp b/manifests/client/openbsd.pp
index e1742d2..88d0640 100644
--- a/manifests/client/openbsd.pp
+++ b/manifests/client/openbsd.pp
@@ -1,59 +1,59 @@
# currently we install munin on openbsd by targz
# :(
class munin::client::openbsd inherits munin::client::base {
- if $::operatingsystemrelease == '4.3' {
- file{'/usr/src/munin_openbsd.tar.gz':
- source => "puppet:///modules/munin/openbsd/package/munin_openbsd.tar.gz",
- owner => root, group => 0, mode => 0600;
- }
- exec{'extract_openbsd':
- command => 'cd /;tar xzf /usr/src/munin_openbsd.tar.gz',
- unless => 'test -d /opt/munin',
- require => File['/usr/src/munin_openbsd.tar.gz'],
- before => File['/var/run/munin'],
- }
- package{'p5-Compress-Zlib':
- ensure => installed,
- before => File['/var/run/munin'],
- }
- } else {
- package{'munin-node':
- ensure => installed,
- }
+ if $::operatingsystemrelease == '4.3' {
+ file{'/usr/src/munin_openbsd.tar.gz':
+ source => "puppet:///modules/munin/openbsd/package/munin_openbsd.tar.gz",
+ owner => root, group => 0, mode => 0600;
}
- package{ [ 'p5-Crypt-SSLeay', 'p5-HTML-Parser', 'p5-HTML-Tagset', 'p5-HTTP-GHTTP',
- 'p5-LWP-UserAgent-Determined', 'p5-Net-SSLeay', 'p5-Net-Server',
- 'p5-URI', 'p5-libwww', 'pcre', 'curl' ]:
- ensure => installed,
- before => File['/var/run/munin'],
+ exec{'extract_openbsd':
+ command => 'cd /;tar xzf /usr/src/munin_openbsd.tar.gz',
+ unless => 'test -d /opt/munin',
+ require => File['/usr/src/munin_openbsd.tar.gz'],
+ before => File['/var/run/munin'],
}
- file{[ '/var/run/munin', '/var/log/munin' ]:
- ensure => directory,
- owner => root, group => 0, mode => 0755;
+ package{'p5-Compress-Zlib':
+ ensure => installed,
+ before => File['/var/run/munin'],
}
- openbsd::rc_local{'munin-node':
- binary => $::operatingsystemrelease ? {
- '4.3' => '/opt/munin/sbin/munin-node',
- default => '/usr/local/sbin/munin-node'
- },
- require => File['/var/run/munin'],
- }
- Service['munin-node']{
- restart => '/bin/kill -HUP `/bin/cat /var/run/munin/munin-node.pid`',
- stop => '/bin/kill `/bin/cat /var/run/munin/munin-node.pid`',
- start => $::operatingsystemrelease ? {
- '4.3' => '/opt/munin/sbin/munin-node',
- default => '/usr/local/sbin/munin-node'
- },
- status => 'test -e /var/run/munin/munin-node.pid && (ps ax | egrep -q "^$(cat /var/run/munin/munin-node.pid).*munin-node")',
- hasstatus => true,
- hasrestart => true,
- require => [ File['/var/run/munin'], File['/var/log/munin'] ],
- }
- cron{'clean_munin_logfile':
- command => 'rm /var/log/munin/munin-node.log; kill -HUP `cat /var/run/munin/munin-node.pid`',
- minute => 0,
- hour => 2,
- weekday => 0,
+ } else {
+ package{'munin-node':
+ ensure => installed,
}
+ }
+ package{ [ 'p5-Crypt-SSLeay', 'p5-HTML-Parser', 'p5-HTML-Tagset', 'p5-HTTP-GHTTP',
+ 'p5-LWP-UserAgent-Determined', 'p5-Net-SSLeay', 'p5-Net-Server',
+ 'p5-URI', 'p5-libwww', 'pcre', 'curl' ]:
+ ensure => installed,
+ before => File['/var/run/munin'],
+ }
+ file{[ '/var/run/munin', '/var/log/munin' ]:
+ ensure => directory,
+ owner => root, group => 0, mode => 0755;
+ }
+ openbsd::rc_local{'munin-node':
+ binary => $::operatingsystemrelease ? {
+ '4.3' => '/opt/munin/sbin/munin-node',
+ default => '/usr/local/sbin/munin-node'
+ },
+ require => File['/var/run/munin'],
+ }
+ Service['munin-node']{
+ restart => '/bin/kill -HUP `/bin/cat /var/run/munin/munin-node.pid`',
+ stop => '/bin/kill `/bin/cat /var/run/munin/munin-node.pid`',
+ start => $::operatingsystemrelease ? {
+ '4.3' => '/opt/munin/sbin/munin-node',
+ default => '/usr/local/sbin/munin-node'
+ },
+ status => 'test -e /var/run/munin/munin-node.pid && (ps ax | egrep -q "^$(cat /var/run/munin/munin-node.pid).*munin-node")',
+ hasstatus => true,
+ hasrestart => true,
+ require => [ File['/var/run/munin'], File['/var/log/munin'] ],
+ }
+ cron{'clean_munin_logfile':
+ command => 'rm /var/log/munin/munin-node.log; kill -HUP `cat /var/run/munin/munin-node.pid`',
+ minute => 0,
+ hour => 2,
+ weekday => 0,
+ }
}
diff --git a/manifests/client/package.pp b/manifests/client/package.pp
index 18566b8..58f40da 100644
--- a/manifests/client/package.pp
+++ b/manifests/client/package.pp
@@ -1,11 +1,11 @@
class munin::client::package inherits munin::client::base {
- package { 'munin-node': ensure => installed }
- Service['munin-node']{
- require => Package[munin-node],
- }
- File['/etc/munin/munin-node.conf']{
- # this has to be installed before the package, so the postinst can
- # boot the munin-node without failure!
- before => Package['munin-node'],
- }
+ package { 'munin-node': ensure => installed }
+ Service['munin-node']{
+ require => Package[munin-node],
+ }
+ File['/etc/munin/munin-node.conf']{
+ # this has to be installed before the package, so the postinst can
+ # boot the munin-node without failure!
+ before => Package['munin-node'],
+ }
}
diff --git a/manifests/host.pp b/manifests/host.pp
index e81f08f..b828e35 100644
--- a/manifests/host.pp
+++ b/manifests/host.pp
@@ -2,7 +2,9 @@
# Copyright (C) 2007 David Schmitt <david@schmitt.edv-bus.at>
# See LICENSE for the full license granted to you.
-class munin::host {
+class munin::host(
+ $cgi_graphing = false
+) {
package {"munin": ensure => installed, }
include concat::setup
@@ -10,10 +12,10 @@ class munin::host {
concat::fragment{'munin.conf.header':
target => '/etc/munin/munin.conf',
- source => [ "puppet:///modules/site-munin/config/host/${::fqdn}/munin.conf.header",
- "puppet:///modules/site-munin/config/host/munin.conf.header.${::operatingsystem}.${::lsbdistcodename}",
- "puppet:///modules/site-munin/config/host/munin.conf.header.${::operatingsystem}",
- "puppet:///modules/site-munin/config/host/munin.conf.header",
+ source => [ "puppet:///modules/site_munin/config/host/${::fqdn}/munin.conf.header",
+ "puppet:///modules/site_munin/config/host/munin.conf.header.${::operatingsystem}.${::lsbdistcodename}",
+ "puppet:///modules/site_munin/config/host/munin.conf.header.${::operatingsystem}",
+ "puppet:///modules/site_munin/config/host/munin.conf.header",
"puppet:///modules/munin/config/host/munin.conf.header.${::operatingsystem}.${::lsbdistcodename}",
"puppet:///modules/munin/config/host/munin.conf.header.${::operatingsystem}",
"puppet:///modules/munin/config/host/munin.conf.header" ],
@@ -26,7 +28,7 @@ class munin::host {
include munin::plugins::muninhost
- if $munin_do_cgi_graphing {
+ if $munin::host::cgi_graphing {
include munin::host::cgi
}
@@ -35,7 +37,7 @@ class munin::host {
content => "4,34 * * * * root if $(ps ax | grep -v grep | grep -q munin-run); then killall munin-run; fi\n",
owner => root, group => 0, mode => 0644;
}
- if $use_shorewall {
+ if $munin::host::manage_shorewall {
include shorewall::rules::out::munin
}
}
diff --git a/manifests/host/cgi.pp b/manifests/host/cgi.pp
index 283a243..9980856 100644
--- a/manifests/host/cgi.pp
+++ b/manifests/host/cgi.pp
@@ -1,16 +1,16 @@
class munin::host::cgi {
- exec{'set_modes_for_cgi':
- command => 'chgrp apache /var/log/munin /var/log/munin/munin-graph.log && chmod g+w /var/log/munin /var/log/munin/munin-graph.log && find /var/www/html/munin/* -maxdepth 1 -type d -exec chgrp -R apache {} \; && find /var/www/html/munin/* -maxdepth 1 -type d -exec chmod -R g+w {} \;',
- refreshonly => true,
- subscribe => File['/etc/munin/munin.conf.header'],
- }
+ exec{'set_modes_for_cgi':
+ command => 'chgrp apache /var/log/munin /var/log/munin/munin-graph.log && chmod g+w /var/log/munin /var/log/munin/munin-graph.log && find /var/www/html/munin/* -maxdepth 1 -type d -exec chgrp -R apache {} \; && find /var/www/html/munin/* -maxdepth 1 -type d -exec chmod -R g+w {} \;',
+ refreshonly => true,
+ subscribe => File['/etc/munin/munin.conf.header'],
+ }
- file{'/etc/logrotate.d/munin':
- source => [ "puppet:///modules/site-munin/config/host/${::fqdn}/logrotate",
- "puppet:///modules/site-munin/config/host/logrotate.${::operatingsystem}",
- "puppet:///modules/site-munin/config/host/logrotate",
- "puppet:///modules/munin/config/host/logrotate.${::operatingsystem}",
- "puppet:///modules/munin/config/host/logrotate" ],
- owner => root, group => 0, mode => 0644;
- }
+ file{'/etc/logrotate.d/munin':
+ source => [ "puppet:///modules/site_munin/config/host/${::fqdn}/logrotate",
+ "puppet:///modules/site_munin/config/host/logrotate.${::operatingsystem}",
+ "puppet:///modules/site_munin/config/host/logrotate",
+ "puppet:///modules/munin/config/host/logrotate.${::operatingsystem}",
+ "puppet:///modules/munin/config/host/logrotate" ],
+ owner => root, group => 0, mode => 0644;
+ }
}
diff --git a/manifests/plugin.pp b/manifests/plugin.pp
index 9f799aa..af8b44a 100644
--- a/manifests/plugin.pp
+++ b/manifests/plugin.pp
@@ -4,65 +4,54 @@
# adapted and improved by admin(at)immerda.ch
define munin::plugin (
- $ensure = "present",
- $script_path_in = '',
- $config = '')
-{
- include munin::plugin::scriptpaths
- $real_script_path = $script_path_in ? { '' => $munin::plugin::scriptpaths::script_path, default => $script_path_in }
+ $ensure = "present",
+ $script_path_in = '',
+ $config = ''
+) {
+ include munin::plugin::scriptpaths
+ $real_script_path = $script_path_in ? { '' => $munin::plugin::scriptpaths::script_path, default => $script_path_in }
- $plugin_src = $ensure ? { "present" => $name, default => $ensure }
- $plugin = "/etc/munin/plugins/$name"
- $plugin_conf = "/etc/munin/plugin-conf.d/$name.conf"
+ $plugin_src = $ensure ? { "present" => $name, default => $ensure }
+ $plugin = "/etc/munin/plugins/${name}"
+ $plugin_conf = "/etc/munin/plugin-conf.d/${name}.conf"
- include munin::plugins::setup
- case $ensure {
- "absent": {
- file { $plugin: ensure => absent, }
- }
- default: {
- case $::kernel {
- openbsd: { $basic_require = File['/var/run/munin'] }
- default: { $basic_require = Package['munin-node'] }
- }
- if $require {
- $real_require = [ $require, $basic_require ]
- } else {
- $real_require = $basic_require
- }
- file { $plugin:
- ensure => "${real_script_path}/${plugin_src}",
- require => $real_require,
- notify => Service['munin-node'];
- }
- if ($::selinux == 'true') and (($::operatingsystem != 'CentOS') or ($::operatingsystem == 'CentOS' and $::lsbmajdistrelease != '5')){
- File[$plugin]{
- seltype => 'munin_etc_t',
- }
- }
+ include munin::plugins::setup
+ case $ensure {
+ "absent": {
+ file { $plugin: ensure => absent, }
+ }
+ default: {
+ file { $plugin:
+ ensure => "${real_script_path}/${plugin_src}",
+ require => $::kernel ? {
+ OpenBSD => File['/var/run/munin'],
+ default => Package['munin-node']
+ },
+ notify => Service['munin-node'];
+ }
+ if ($::selinux == 'true') and (($::operatingsystem != 'CentOS') or ($::operatingsystem == 'CentOS' and $::lsbmajdistrelease != '5')){
+ File[$plugin]{
+ seltype => 'munin_etc_t',
}
+ }
+ }
+ }
+ case $config {
+ '': {
+ file { $plugin_conf: ensure => absent }
}
- case $config {
- '': {
- file { $plugin_conf: ensure => absent }
+ default: {
+ case $ensure {
+ absent: {
+ file { $plugin_conf: ensure => absent }
}
default: {
- case $ensure {
- absent: {
- file { $plugin_conf: ensure => absent }
- }
- default: {
- file { $plugin_conf:
- content => "[${name}]\n$config\n",
- mode => 0644, owner => root, group => 0,
- }
- if $require {
- File[$plugin_conf]{
- require +> $require,
- }
- }
- }
- }
+ file { $plugin_conf:
+ content => "[${name}]\n$config\n",
+ mode => 0644, owner => root, group => 0,
+ }
}
+ }
}
+ }
}
diff --git a/manifests/plugin/deploy.pp b/manifests/plugin/deploy.pp
index 5003153..9e74afb 100644
--- a/manifests/plugin/deploy.pp
+++ b/manifests/plugin/deploy.pp
@@ -1,43 +1,43 @@
define munin::plugin::deploy($source = '', $ensure = 'present', $config = '') {
- $plugin_src = $ensure ? {
- 'present' => $name,
- 'absent' => $name,
- default => $ensure
- }
- $real_source = $source ? {
- '' => "munin/plugins/$plugin_src",
- default => $source
- }
- include munin::plugin::scriptpaths
- file { "munin_plugin_${name}":
- path => "$munin::plugin::scriptpaths::script_path/${name}",
- source => "puppet:///modules/$real_source",
- mode => 0755, owner => root, group => 0;
- }
+ $plugin_src = $ensure ? {
+ 'present' => $name,
+ 'absent' => $name,
+ default => $ensure
+ }
+ $real_source = $source ? {
+ '' => "munin/plugins/$plugin_src",
+ default => $source
+ }
+ include munin::plugin::scriptpaths
+ file { "munin_plugin_${name}":
+ path => "${munin::plugin::scriptpaths::script_path}/${name}",
+ source => "puppet:///modules/${real_source}",
+ mode => 0755, owner => root, group => 0;
+ }
- if ($::selinux == 'true') and (($::operatingsystem != 'CentOS') or ($::operatingsystem == 'CentOS' and $::lsbmajdistrelease != '5')){
- File["munin_plugin_${name}"]{
- seltype => 'munin_exec_t',
- }
+ if ($::selinux == 'true') and (($::operatingsystem != 'CentOS') or ($::operatingsystem == 'CentOS' and $::lsbmajdistrelease != '5')){
+ File["munin_plugin_${name}"]{
+ seltype => 'munin_exec_t',
}
+ }
- case $::kernel {
- openbsd: { $basic_require = File['/var/run/munin'] }
- default: { $basic_require = Package['munin-node'] }
- }
- if $require {
- File["munin_plugin_${name}"]{
- require => [ $basic_require, $require ],
- }
- } else {
- File["munin_plugin_${name}"]{
- require => $basic_require,
- }
+ case $::kernel {
+ openbsd: { $basic_require = File['/var/run/munin'] }
+ default: { $basic_require = Package['munin-node'] }
+ }
+ if $require {
+ File["munin_plugin_${name}"]{
+ require => [ $basic_require, $require ],
}
- # register the plugin
- if $require {
- munin::plugin{$name: ensure => $ensure, config => $config, require => $require }
- } else {
- munin::plugin{$name: ensure => $ensure, config => $config }
+ } else {
+ File["munin_plugin_${name}"]{
+ require => $basic_require,
}
+ }
+ # register the plugin
+ if $require {
+ munin::plugin{$name: ensure => $ensure, config => $config, require => $require }
+ } else {
+ munin::plugin{$name: ensure => $ensure, config => $config }
+ }
}
diff --git a/manifests/plugin/scriptpaths.pp b/manifests/plugin/scriptpaths.pp
index f4bd39b..2cad97b 100644
--- a/manifests/plugin/scriptpaths.pp
+++ b/manifests/plugin/scriptpaths.pp
@@ -1,12 +1,12 @@
class munin::plugin::scriptpaths {
- case $::operatingsystem {
- gentoo: { $script_path = "/usr/libexec/munin/plugins" }
- debian: { $script_path = "/usr/share/munin/plugins" }
- centos: { $script_path = "/usr/share/munin/plugins" }
- openbsd: { $script_path = $::operatingsystemrelease ? {
- '4.3' => '/opt/munin/lib/plugins/',
- default => '/usr/local/libexec/munin/plugins/'
- } }
- default: { $script_path = "/usr/share/munin/plugins" }
- }
+ case $::operatingsystem {
+ gentoo: { $script_path = "/usr/libexec/munin/plugins" }
+ debian: { $script_path = "/usr/share/munin/plugins" }
+ centos: { $script_path = "/usr/share/munin/plugins" }
+ openbsd: { $script_path = $::operatingsystemrelease ? {
+ '4.3' => '/opt/munin/lib/plugins/',
+ default => '/usr/local/libexec/munin/plugins/'
+ } }
+ default: { $script_path = "/usr/share/munin/plugins" }
+ }
}
diff --git a/manifests/plugins/base.pp b/manifests/plugins/base.pp
index 972a674..c6b88ed 100644
--- a/manifests/plugins/base.pp
+++ b/manifests/plugins/base.pp
@@ -5,6 +5,11 @@ class munin::plugins::base {
processes, swap, uptime, users, vmstat ]:
ensure => present,
}
+ file{'/etc/munin/plugin-conf.d/df':
+ content => "[df*]\nenv.exclude none unknown iso9660 squashfs udf romfs ramfs debugfs binfmt_misc rpc_pipefs fuse.gvfs-fuse-daemon\n",
+ require => Munin::Plugin[df],
+ owner => root, group => 0, mode => 0644;
+ }
include munin::plugins::interfaces
case $::kernel {
@@ -17,7 +22,7 @@ class munin::plugins::base {
}
}
- case $virtual {
+ case $::virtual {
physical: { include munin::plugins::physical }
xen0: { include munin::plugins::dom0 }
}
diff --git a/manifests/plugins/gentoo.pp b/manifests/plugins/gentoo.pp
index 25c1626..27d4689 100644
--- a/manifests/plugins/gentoo.pp
+++ b/manifests/plugins/gentoo.pp
@@ -1,5 +1,5 @@
class munin::plugins::gentoo {
- munin::plugin::deploy { 'gentoo_lastupdated':
- config => "user portage\nenv.logfile /var/log/emerge.log\nenv.tail /usr/bin/tail\nenv.grep /bin/grep"
- }
+ munin::plugin::deploy { 'gentoo_lastupdated':
+ config => "user portage\nenv.logfile /var/log/emerge.log\nenv.tail /usr/bin/tail\nenv.grep /bin/grep"
+ }
}
diff --git a/manifests/plugins/interfaces.pp b/manifests/plugins/interfaces.pp
index b2c448b..cc79259 100644
--- a/manifests/plugins/interfaces.pp
+++ b/manifests/plugins/interfaces.pp
@@ -1,19 +1,19 @@
# handle if_ and if_err_ plugins
class munin::plugins::interfaces {
- $ifs = regsubst(split($interfaces, " |,"), "(.+)", "if_\\1")
+ $ifs = regsubst(split($::interfaces, " |,"), "(.+)", "if_\\1")
munin::plugin {
$ifs: ensure => "if_";
}
case $::operatingsystem {
openbsd: {
- $if_errs = regsubst(split($interfaces, " |,"), "(.+)", "if_errcoll_\\1")
+ $if_errs = regsubst(split($::interfaces, " |,"), "(.+)", "if_errcoll_\\1")
munin::plugin{
$if_errs: ensure => "if_errcoll_";
}
}
default: {
- $if_errs = regsubst(split($interfaces, " |,"), "(.+)", "if_err_\\1")
+ $if_errs = regsubst(split($::interfaces, " |,"), "(.+)", "if_err_\\1")
munin::plugin{
$if_errs: ensure => "if_err_";
}
diff --git a/manifests/plugins/kvm.pp b/manifests/plugins/kvm.pp
new file mode 100644
index 0000000..7a1430f
--- /dev/null
+++ b/manifests/plugins/kvm.pp
@@ -0,0 +1,7 @@
+class munin::plugins::kvm {
+ munin::plugin::deploy {
+ [ 'kvm_cpu', 'kvm_mem', 'kvm_net' ]:;
+ 'kvm_io':
+ config => 'user root';
+ }
+}
diff --git a/manifests/plugins/linux.pp b/manifests/plugins/linux.pp
index 30e0af6..a73de63 100644
--- a/manifests/plugins/linux.pp
+++ b/manifests/plugins/linux.pp
@@ -3,6 +3,6 @@ class munin::plugins::linux {
[ df_abs, forks, df_inode, irqstats, entropy, open_inodes ]:
ensure => present;
acpi:
- ensure => $acpi_available;
+ ensure => $::acpi_available;
}
}
diff --git a/manifests/register.pp b/manifests/register.pp
index 254eaaf..9257ca1 100644
--- a/manifests/register.pp
+++ b/manifests/register.pp
@@ -1,31 +1,16 @@
define munin::register (
- $host = 'absent',
- $port = 'absent',
+ $host = $::fqdn,
+ $port = '4949',
$description = 'absent',
$config = []
)
{
- $fhost = $name
- $client_type = 'client'
+ $fhost = $name
+ $client_type = 'client'
- $munin_port_real = $port ? {
- 'absent' => hiera('munin_port','4949'),
- default => $port
- }
-
- $hiera_munin_host = hiera('munin_host','')
- $munin_host_real = $host ? {
- 'absent' => $hiera_munin_host ? {
- '' => $::fqdn,
- 'fqdn' => $::fqdn,
- default => $hiera_munin_host
- },
- default => $host
- }
-
- @@concat::fragment{ "munin_client_${fhost}_${munin_port_real}":
- target => '/etc/munin/munin.conf',
- content => template("munin/client.erb"),
- tag => 'munin',
- }
+ @@concat::fragment{ "munin_client_${fhost}_${port}":
+ target => '/etc/munin/munin.conf',
+ content => template("munin/client.erb"),
+ tag => 'munin',
+ }
}
diff --git a/manifests/register/snmp.pp b/manifests/register/snmp.pp
index acd1e03..78c3e91 100644
--- a/manifests/register/snmp.pp
+++ b/manifests/register/snmp.pp
@@ -1,27 +1,21 @@
define munin::register::snmp (
$community = 'public',
$description = 'absent',
- $port = 'absent'
-)
-{
- $fhost = $name
- $munin_host_real = $::fqdn
- $client_type = 'snmp'
- $config = [ 'use_node_name no' ]
+ $port = '4949',
+ $host = $::fqdn
+) {
+ $fhost = $name
+ $client_type = 'snmp'
+ $config = [ 'use_node_name no' ]
- $munin_port_real = $port ? {
- 'absent' => hiera('munin_port','4949'),
- default => $port
- }
+ exec { "munin_register_snmp_${fhost}":
+ command => "munin-node-configure --snmp ${fhost} --snmpcommunity ${community} --shell | sh",
+ unless => "ls /etc/munin/plugins/snmp_${fhost}_* &> /dev/null",
+ }
- exec { "munin_register_snmp_${fhost}":
- command => "munin-node-configure --snmp ${fhost} --snmpcommunity ${community} --shell | sh",
- unless => "ls /etc/munin/plugins/snmp_${fhost}_* &> /dev/null",
- }
-
- @@concat::fragment{ "munin_snmp_${fhost}":
- target => '/etc/munin/munin.conf',
- content => template("munin/client.erb"),
- tag => 'munin',
- }
+ @@concat::fragment{ "munin_snmp_${fhost}":
+ target => '/etc/munin/munin.conf',
+ content => template("munin/client.erb"),
+ tag => 'munin',
+ }
}
diff --git a/manifests/remoteplugin.pp b/manifests/remoteplugin.pp
index ce87492..603cb66 100644
--- a/manifests/remoteplugin.pp
+++ b/manifests/remoteplugin.pp
@@ -1,18 +1,18 @@
define munin::remoteplugin($ensure = "present", $source, $config = '') {
- case $ensure {
- "absent": { munin::plugin{ $name: ensure => absent } }
- default: {
- file {
- "/var/lib/puppet/modules/munin/plugins/${name}":
- source => $source,
- mode => 0755, owner => root, group => 0;
- }
- munin::plugin { $name:
- ensure => $ensure,
- config => $config,
- script_path_in => "/var/lib/puppet/modules/munin/plugins",
- }
- }
+ case $ensure {
+ "absent": { munin::plugin{ $name: ensure => absent } }
+ default: {
+ file {
+ "/var/lib/puppet/modules/munin/plugins/${name}":
+ source => $source,
+ mode => 0755, owner => root, group => 0;
+ }
+ munin::plugin { $name:
+ ensure => $ensure,
+ config => $config,
+ script_path_in => "/var/lib/puppet/modules/munin/plugins",
+ }
}
+ }
}
diff --git a/templates/client.erb b/templates/client.erb
index 8c93cc5..7131ade 100644
--- a/templates/client.erb
+++ b/templates/client.erb
@@ -1,19 +1,19 @@
<%
# Downcase all information
dom = scope.lookupvar('::domain').downcase
- host = scope.lookupvar('::hostname').downcase
+ h = scope.lookupvar('::hostname').downcase
%>
### Munin client from Puppet template
# Domain: <%= dom %>
-# Registered on: <%= host %>
+# Registered on: <%= h %>
# Type: <%= client_type %>
<% if description != 'absent' -%>
# Description: <%= description.gsub!(/\n/, ' ') %>
<% end -%>
[<%= fhost.downcase %>]
- address <%= munin_host_real %>
- port <%= munin_port_real %>
+ address <%= host %>
+ port <%= port %>
<% if config -%><% config.each do |val| -%>
<%= val -%>
<% end -%><% end -%>
diff --git a/templates/munin-node.conf.Debian.etch b/templates/munin-node.conf.Debian.etch
index 17162d8..44638e7 100644
--- a/templates/munin-node.conf.Debian.etch
+++ b/templates/munin-node.conf.Debian.etch
@@ -9,8 +9,8 @@ background 1
setseid 1
# Which host/port to bind to;
-host <%= scope.function_hiera('munin_host','*') %>
-port <%= scope.function_hiera('munin_port','4949') %>
+host <%= scope.lookupvar('munin::client::host') %>
+port <%= scope.lookupvar('munin::client::port') %>
user root
group root
setsid yes
@@ -33,7 +33,7 @@ host_name <%= fqdn %>
# regular expression, due to brain damage in Net::Server, which
# doesn't understand CIDR-style network notation. You may repeat
# the allow line as many times as you'd like
-<% scope.function_hiera('munin_allow',['127.0.0.1']).each do |allow| -%>
+<% scope.lookupvar('munin::client::allow').each do |allow| -%>
allow <%= "^#{Regexp.escape(allow)}$" %>
<% end -%>
diff --git a/templates/munin-node.conf.default b/templates/munin-node.conf.default
index adc2408..9684bd5 100644
--- a/templates/munin-node.conf.default
+++ b/templates/munin-node.conf.default
@@ -37,7 +37,7 @@ host_name <%= fqdn %>
# network notation unless the perl module Net::CIDR is installed. You
# may repeat the allow line as many times as you'd like
-<% scope.function_hiera('munin_allow',['127.0.0.1']).each do |allow| -%>
+<% scope.lookupvar('munin::client::allow').each do |allow| -%>
allow <%= "^#{Regexp.escape(allow)}$" %>
<% end -%>
@@ -53,9 +53,9 @@ allow <%= "^#{Regexp.escape(allow)}$" %>
# cidr_deny 192.0.2.42/32
# Which address to bind to;
-host <%= scope.function_hiera('munin_host','*') %>
+host <%= scope.lookupvar('munin::client::host') %>
# host 127.0.0.1
# And which port
-port <%= scope.function_hiera('munin_port','4949') %>
+port <%= scope.lookupvar('munin::client::port') %>