diff options
31 files changed, 977 insertions, 335 deletions
@@ -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') %> |