parent
12d9a77f56
commit
2046bf50cc
17 changed files with 738 additions and 46 deletions
|
@ -1,45 +0,0 @@
|
||||||
version: '3'
|
|
||||||
services:
|
|
||||||
munin:
|
|
||||||
container_name: "munin-master"
|
|
||||||
image: registry.mgrote.net/munin-server:latest
|
|
||||||
restart: always
|
|
||||||
environment:
|
|
||||||
MAILCONTACT: michael.grote@posteo.de
|
|
||||||
MAILSERVER: postfix
|
|
||||||
MAILPORT: 25
|
|
||||||
MAILFROM: munin@mgrote.net
|
|
||||||
MAILUSER: munin@mgrote.net
|
|
||||||
MAILNAME: Munin
|
|
||||||
MAILDOMAIN: mgrote.net
|
|
||||||
MAILPASSWORD: ""
|
|
||||||
TZ: Europe/Berlin
|
|
||||||
CRONDELAY: 5
|
|
||||||
NODES: |
|
|
||||||
fileserver3.mgrote.net:fileserver3.mgrote.net
|
|
||||||
ansible2.mgrote.net:ansible2.mgrote.net
|
|
||||||
pve5.mgrote.net:pve5.mgrote.net
|
|
||||||
forgejo.mgrote.net:forgejo.mgrote.net
|
|
||||||
docker10.mgrote.net:docker10.mgrote.net
|
|
||||||
pbs.mgrote.net:pbs.mgrote.net
|
|
||||||
blocky.mgrote.net:blocky.mgrote.net
|
|
||||||
ldap.mgrote.net:ldap.mgrote.net
|
|
||||||
munin-container:localhost
|
|
||||||
# z.B.
|
|
||||||
# computer-test.mgrote.net:192.68.2.4
|
|
||||||
# computer.mgrote.net:computer.mgrote.net
|
|
||||||
volumes:
|
|
||||||
- db:/var/lib/munin
|
|
||||||
- logs:/var/log/munin
|
|
||||||
- cache:/var/cache/munin
|
|
||||||
ports:
|
|
||||||
- 1234:80
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
db:
|
|
||||||
logs:
|
|
||||||
cache:
|
|
||||||
|
|
||||||
networks:
|
|
||||||
postfix:
|
|
||||||
external: true
|
|
|
@ -213,8 +213,8 @@ munin_node_disabled_plugins:
|
||||||
- squid_traffic # proxmox
|
- squid_traffic # proxmox
|
||||||
- timesync
|
- timesync
|
||||||
- docker_volumesize2
|
- docker_volumesize2
|
||||||
|
|
||||||
- docker_multi
|
- docker_multi
|
||||||
|
|
||||||
munin_node_plugins:
|
munin_node_plugins:
|
||||||
- name: chrony
|
- name: chrony
|
||||||
src: https://git.mgrote.net/mirrors/munin-contrib/raw/branch/master/plugins/chrony/chrony
|
src: https://git.mgrote.net/mirrors/munin-contrib/raw/branch/master/plugins/chrony/chrony
|
||||||
|
|
|
@ -91,6 +91,8 @@ blocky_custom_lookups: # optional
|
||||||
ip: 192.168.5.1
|
ip: 192.168.5.1
|
||||||
- name: ldap.mgrote.net
|
- name: ldap.mgrote.net
|
||||||
ip: 192.168.2.47
|
ip: 192.168.2.47
|
||||||
|
- name: munin.mgrote.net
|
||||||
|
ip: 192.168.2.41
|
||||||
|
|
||||||
### mgrote_munin_node
|
### mgrote_munin_node
|
||||||
# kann git.mgrote.net nicht auflösen, deshalb hiermit IP
|
# kann git.mgrote.net nicht auflösen, deshalb hiermit IP
|
||||||
|
|
76
group_vars/munin.yml
Normal file
76
group_vars/munin.yml
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
---
|
||||||
|
### oefenweb.ufw
|
||||||
|
ufw_rules:
|
||||||
|
- rule: allow
|
||||||
|
to_port: 22
|
||||||
|
protocol: tcp
|
||||||
|
comment: 'ssh'
|
||||||
|
from_ip: 0.0.0.0/0
|
||||||
|
- rule: allow
|
||||||
|
to_port: 80 #TODO passt?
|
||||||
|
protocol: tcp
|
||||||
|
comment: 'munin'
|
||||||
|
|
||||||
|
### mgrote_restic
|
||||||
|
restic_folders_to_backup: "/usr/local /etc /root /home /var/lib/munin"
|
||||||
|
|
||||||
|
### geerlingguy.apache
|
||||||
|
apache_vhosts:
|
||||||
|
# Additional optional properties: 'serveradmin, serveralias, extra_parameters'.
|
||||||
|
- servername: "munin.mgrote.net"
|
||||||
|
documentroot: "/var/cache/munin/www"
|
||||||
|
|
||||||
|
### mrlesmithjr.ansible-manage-lvm
|
||||||
|
lvm_groups:
|
||||||
|
- vgname: vg_munin
|
||||||
|
disks:
|
||||||
|
- /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1
|
||||||
|
create: true
|
||||||
|
lvnames:
|
||||||
|
- lvname: lv_munin
|
||||||
|
size: +100%FREE
|
||||||
|
create: true
|
||||||
|
filesystem: xfs
|
||||||
|
mount: true
|
||||||
|
mntp: /var/lib/munin
|
||||||
|
manage_lvm: true
|
||||||
|
pvresize_to_max: true
|
||||||
|
|
||||||
|
### mgrote_munin_node
|
||||||
|
munin_node_bind_host: "127.0.0.1"
|
||||||
|
munin_node_bind_port: "4949"
|
||||||
|
munin_node_allowed_cidrs: [127.0.0.1]
|
||||||
|
|
||||||
|
### mgrote_munin_master
|
||||||
|
munin_mail_user: munin@mgrote.net
|
||||||
|
munin_mail_server: "{{ postfix_smtp_server }}"
|
||||||
|
munin_mail_port: "{{ 1025 }}"
|
||||||
|
munin_mail_tls: false
|
||||||
|
munin_enable_alerts: false
|
||||||
|
munin_alerts_to: info@mgrote.net
|
||||||
|
|
||||||
|
munin_hosts:
|
||||||
|
- name: "{{ ansible_fqdn }}.mgrote.net"
|
||||||
|
address: "127.0.0.1"
|
||||||
|
extra: ["use_node_name yes"]
|
||||||
|
- name: fileserver3.mgrote.net
|
||||||
|
address: fileserver3.mgrote.net
|
||||||
|
extra: ["use_node_name yes"]
|
||||||
|
- name: pve5.mgrote.net
|
||||||
|
address: pve5.mgrote.net
|
||||||
|
extra: ["use_node_name yes"]
|
||||||
|
- name: forgejo.mgrote.net
|
||||||
|
address: forgejo.mgrote.net
|
||||||
|
extra: ["use_node_name yes"]
|
||||||
|
- name: docker10.mgrote.net
|
||||||
|
address: docker10.mgrote.net
|
||||||
|
extra: ["use_node_name yes"]
|
||||||
|
- name: pbs.mgrote.net
|
||||||
|
address: pbs.mgrote.net
|
||||||
|
extra: ["use_node_name yes"]
|
||||||
|
- name: blocky.mgrote.net
|
||||||
|
address: blocky.mgrote.net
|
||||||
|
extra: ["use_node_name yes"]
|
||||||
|
- name: ldap.mgrote.net
|
||||||
|
address: ldap.mgrote.net
|
||||||
|
extra: ["use_node_name yes"]
|
|
@ -15,6 +15,9 @@ all:
|
||||||
ansible:
|
ansible:
|
||||||
hosts:
|
hosts:
|
||||||
ansible2.mgrote.net:
|
ansible2.mgrote.net:
|
||||||
|
munin:
|
||||||
|
hosts:
|
||||||
|
munin.mgrote.net:
|
||||||
docker:
|
docker:
|
||||||
hosts:
|
hosts:
|
||||||
docker10.mgrote.net:
|
docker10.mgrote.net:
|
||||||
|
@ -49,6 +52,7 @@ all:
|
||||||
pbs.mgrote.net:
|
pbs.mgrote.net:
|
||||||
blocky.mgrote.net:
|
blocky.mgrote.net:
|
||||||
ldap.mgrote.net:
|
ldap.mgrote.net:
|
||||||
|
munin.mgrote.net:
|
||||||
test:
|
test:
|
||||||
hosts:
|
hosts:
|
||||||
vm-test-2204.mgrote.net:
|
vm-test-2204.mgrote.net:
|
||||||
|
|
BIN
keepass_db.kdbx
BIN
keepass_db.kdbx
Binary file not shown.
6
playbooks/3_service/munin.yml
Normal file
6
playbooks/3_service/munin.yml
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
- hosts: munin
|
||||||
|
roles:
|
||||||
|
- role: mgrote_munin_server
|
||||||
|
tags: "munin"
|
||||||
|
become: true
|
40
roles/mgrote_munin_server/defaults/main.yml
Normal file
40
roles/mgrote_munin_server/defaults/main.yml
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
---
|
||||||
|
munin_packages:
|
||||||
|
- cron
|
||||||
|
- munin
|
||||||
|
- apache2
|
||||||
|
- wget
|
||||||
|
- libapache2-mod-fcgid
|
||||||
|
- libcgi-fast-perl
|
||||||
|
- ssmtp
|
||||||
|
- perl
|
||||||
|
- mailutils
|
||||||
|
- curl
|
||||||
|
- tzdata
|
||||||
|
- munin-node
|
||||||
|
- libfile-readbackwards-perl
|
||||||
|
munin_servername: "{{ ansible_fqdn }}.mgrote.net"
|
||||||
|
munin_dirs:
|
||||||
|
- /var/run/munin
|
||||||
|
- /etc/munin/plugins
|
||||||
|
- /var/cache/munin/www
|
||||||
|
- /var/lib/munin
|
||||||
|
- /var/cache/munin
|
||||||
|
munin_server_plugins:
|
||||||
|
- munin_stats
|
||||||
|
- munin_update
|
||||||
|
munin_cron_job: present
|
||||||
|
munin_dbdir: "/var/lib/munin"
|
||||||
|
|
||||||
|
munin_enable_alerts: false
|
||||||
|
munin_mail_server: mail.server.com
|
||||||
|
munin_mail_port: 25
|
||||||
|
munin_mail_tls: false
|
||||||
|
munin_alerts_to: nobody@nowhere.com
|
||||||
|
|
||||||
|
munin_mode: cgi # or cron
|
||||||
|
|
||||||
|
munin_hosts:
|
||||||
|
- name: "{{ ansible_fqdn }}"
|
||||||
|
address: "127.0.0.1"
|
||||||
|
extra: ["use_node_name yes"]
|
17
roles/mgrote_munin_server/handlers/main.yml
Normal file
17
roles/mgrote_munin_server/handlers/main.yml
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
---
|
||||||
|
- name: "restart apache2"
|
||||||
|
become: true
|
||||||
|
ansible.builtin.systemd:
|
||||||
|
name: apache2
|
||||||
|
enabled: true
|
||||||
|
masked: false
|
||||||
|
state: restarted
|
||||||
|
|
||||||
|
- name: "restart munin"
|
||||||
|
become: true
|
||||||
|
ansible.builtin.systemd:
|
||||||
|
name: munin
|
||||||
|
enabled: true
|
||||||
|
masked: false
|
||||||
|
state: restarted
|
||||||
|
...
|
86
roles/mgrote_munin_server/tasks/main.yml
Normal file
86
roles/mgrote_munin_server/tasks/main.yml
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
---
|
||||||
|
- name: ensure packages are installed
|
||||||
|
become: true
|
||||||
|
ansible.builtin.package:
|
||||||
|
name: "{{ munin_packages }}"
|
||||||
|
state: present
|
||||||
|
|
||||||
|
- name: Ensure needed dirs exists
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "{{ item }}"
|
||||||
|
state: directory
|
||||||
|
mode: '0755'
|
||||||
|
owner: munin
|
||||||
|
group: munin
|
||||||
|
loop: "{{ munin_dirs }}"
|
||||||
|
|
||||||
|
- name: Ensure permissions are set
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /var/lib/munin/cgi-tmp
|
||||||
|
mode: 'ugo+rw'
|
||||||
|
state: directory
|
||||||
|
owner: munin
|
||||||
|
group: munin
|
||||||
|
recurse: true
|
||||||
|
|
||||||
|
- name: Template apache config
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: apache.conf
|
||||||
|
dest: /etc/apache2/sites-available/000-default.conf
|
||||||
|
mode: '0644'
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
notify: "restart apache2"
|
||||||
|
|
||||||
|
- name: Enable fgcid
|
||||||
|
community.general.apache2_module:
|
||||||
|
state: present
|
||||||
|
name: fcgid
|
||||||
|
|
||||||
|
- name: Template munin-server plugins
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: "{{ item }}"
|
||||||
|
dest: "/etc/munin/plugins/{{ item }}"
|
||||||
|
mode: '0755'
|
||||||
|
loop: "{{ munin_server_plugins }}"
|
||||||
|
|
||||||
|
- name: Template munin config
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: munin.conf
|
||||||
|
dest: /etc/munin/munin.conf
|
||||||
|
mode: '0644'
|
||||||
|
owner: munin
|
||||||
|
group: munin
|
||||||
|
notify: "restart munin"
|
||||||
|
|
||||||
|
- name: Enable or disable the munin cron job.
|
||||||
|
ansible.builtin.lineinfile:
|
||||||
|
dest: /etc/cron.d/munin
|
||||||
|
state: "{{ munin_cron_job }}"
|
||||||
|
regexp: "^\\*/5 \\* \\* \\* \\*"
|
||||||
|
line: "*/5 * * * * munin if [ -x /usr/bin/munin-cron ]; then /usr/bin/munin-cron; fi"
|
||||||
|
create: true
|
||||||
|
mode: '0644'
|
||||||
|
|
||||||
|
- name: check if munin has been run
|
||||||
|
ansible.builtin.stat:
|
||||||
|
path: /var/cache/munin/www/index.html
|
||||||
|
register: placeholder
|
||||||
|
|
||||||
|
- name: Template website placeholder
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: placeholder.html
|
||||||
|
dest: /var/cache/munin/www/index.html
|
||||||
|
mode: '0644'
|
||||||
|
owner: munin
|
||||||
|
group: munin
|
||||||
|
when: not placeholder.stat.exists
|
||||||
|
|
||||||
|
- name: Template ssmtp config
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: ssmtp.conf
|
||||||
|
dest: /etc/ssmtp/ssmtp.conf
|
||||||
|
mode: '0644'
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
...
|
24
roles/mgrote_munin_server/templates/apache.conf
Normal file
24
roles/mgrote_munin_server/templates/apache.conf
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
<VirtualHost *:80>
|
||||||
|
ServerName {{ munin_servername }}
|
||||||
|
|
||||||
|
# Redirect requests without /munin to /munin
|
||||||
|
RedirectMatch ^/$ /munin/
|
||||||
|
|
||||||
|
# Existing configuration for serving /munin
|
||||||
|
Alias /munin /var/cache/munin/www
|
||||||
|
<Directory /var/cache/munin/www>
|
||||||
|
Require all granted
|
||||||
|
Options None
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
ScriptAlias /munin-cgi/munin-cgi-graph /usr/lib/munin/cgi/munin-cgi-graph
|
||||||
|
<Location /munin-cgi/munin-cgi-graph>
|
||||||
|
Require all granted
|
||||||
|
<IfModule mod_fcgid.c>
|
||||||
|
SetHandler fcgid-script
|
||||||
|
</IfModule>
|
||||||
|
<IfModule !mod_fcgid.c>
|
||||||
|
SetHandler cgi-script
|
||||||
|
</IfModule>
|
||||||
|
</Location>
|
||||||
|
</VirtualHost>
|
115
roles/mgrote_munin_server/templates/munin.conf
Normal file
115
roles/mgrote_munin_server/templates/munin.conf
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
includedir /etc/munin/munin-conf.d
|
||||||
|
|
||||||
|
# Example configuration file for Munin, generated by 'make build'
|
||||||
|
|
||||||
|
# The next three variables specifies where the location of the RRD
|
||||||
|
# databases, the HTML output, logs and the lock/pid files. They all
|
||||||
|
# must be writable by the user running munin-cron. They are all
|
||||||
|
# defaulted to the values you see here.
|
||||||
|
#
|
||||||
|
dbdir {{ munin_dbdir }}
|
||||||
|
#htmldir /var/cache/munin/www
|
||||||
|
#logdir /var/log/munin
|
||||||
|
#rundir /var/run/munin
|
||||||
|
|
||||||
|
# Where to look for the HTML templates
|
||||||
|
#
|
||||||
|
#tmpldir /etc/munin/templates
|
||||||
|
|
||||||
|
# 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).
|
||||||
|
#
|
||||||
|
# cgitmpdir /var/lib/munin/cgi-tmp
|
||||||
|
|
||||||
|
# (Exactly one) directory to include all files from.
|
||||||
|
includedir /etc/munin/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 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 {{ munin_mode }}
|
||||||
|
|
||||||
|
# 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
|
||||||
|
# consumption to the degree that the system can thrash. Again the default is
|
||||||
|
# 6. Most likely the optimal number for max_cgi_graph_jobs is the same as
|
||||||
|
# max_graph_jobs.
|
||||||
|
#
|
||||||
|
#munin_cgi_graph_jobs 6
|
||||||
|
|
||||||
|
# If the automatic CGI url is wrong for your system override it here:
|
||||||
|
#
|
||||||
|
#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
|
||||||
|
|
||||||
|
# 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 {{ munin_mode }}
|
||||||
|
|
||||||
|
# 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_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)
|
||||||
|
# test with: sudo -u munin /usr/share/munin/munin-limits --contact someuser --force
|
||||||
|
{% if munin_enable_alerts is sameas true %}
|
||||||
|
contact.someuser.command mail -aFROM:munin@mgrote.net -s "Munin ${var:worst}: ${var:group}::${var:host}::${var:plugin}" {{ munin_alerts_to }}
|
||||||
|
{% endif %}
|
||||||
|
#contact.anotheruser.command mail -s "Munin ${var:worst}: ${var:group}::${var:host}::${var:plugin}" 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/bin/send_nsca nagios.host.comm -c /etc/nsca.conf
|
||||||
|
|
||||||
|
|
||||||
|
# Munin hosts.
|
||||||
|
{% for host in munin_hosts %}
|
||||||
|
[{{ host.name }}]
|
||||||
|
{% if host.address is defined %}
|
||||||
|
address {{ host.address }}
|
||||||
|
{% endif %}
|
||||||
|
{% if host.extra is defined %}
|
||||||
|
{% for extra in host.extra %}
|
||||||
|
{{ extra }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% endfor %}
|
118
roles/mgrote_munin_server/templates/munin_stats
Normal file
118
roles/mgrote_munin_server/templates/munin_stats
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
#
|
||||||
|
# Copyright (C) 2006-2009 Rodolphe Quiédeville <rodolphe@quiedeville.org>
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or
|
||||||
|
# modify it under the terms of the GNU General Public License
|
||||||
|
# as published by the Free Software Foundation; version 2 dated June,
|
||||||
|
# 1991.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Magic markers (used by munin-node-configure and some installation scripts):
|
||||||
|
#%# family=auto
|
||||||
|
#%# capabilities=autoconf
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
use Munin::Plugin;
|
||||||
|
|
||||||
|
|
||||||
|
my $missing_module = undef;
|
||||||
|
$missing_module = "File::ReadBackwards" unless (eval "require File::ReadBackwards");
|
||||||
|
|
||||||
|
my @logs = qw/update graph html limits/;
|
||||||
|
my $logdir = ($ENV{'logdir'} || $ENV{'MUNIN_LOGDIR'} || '/var/log/munin');
|
||||||
|
|
||||||
|
if ($ENV{'fields'}) {
|
||||||
|
@logs = split(/ +/, $ENV{'fields'});
|
||||||
|
}
|
||||||
|
|
||||||
|
sub uses_graph_cron {
|
||||||
|
my $log_file = $_[0];
|
||||||
|
my $bw = File::ReadBackwards->new($log_file) or
|
||||||
|
die "can't read 'log_file' $!";
|
||||||
|
if (defined(my $log_line = $bw->readline)) {
|
||||||
|
if ($log_line =~ ('.*graphing is cgi, do nothing$')) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ($ARGV[0] and $ARGV[0] eq 'autoconf') {
|
||||||
|
my $munin_update_location =
|
||||||
|
"$Munin::Common::Defaults::MUNIN_LIBDIR/munin-update";
|
||||||
|
|
||||||
|
if (! -e $munin_update_location) {
|
||||||
|
print "no (munin-update was not found at $munin_update_location)\n";
|
||||||
|
} elsif (! -x $munin_update_location) {
|
||||||
|
print "no ($munin_update_location was found, but is not executable)\n";
|
||||||
|
} elsif (defined($missing_module)) {
|
||||||
|
print "no (missing Perl module: '$missing_module')\n";
|
||||||
|
} else {
|
||||||
|
print "yes\n";
|
||||||
|
}
|
||||||
|
exit 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($ARGV[0] and $ARGV[0] eq "config") {
|
||||||
|
print "graph_title Munin processing time\n",
|
||||||
|
"graph_info This graph shows the run time of the four different processes making up a munin-master run. Munin-master is run from cron every 5 minutes and we want each of the programmes in munin-master to complete before the next instance starts. If munin-update uses too long time to run please see the munin-update graph to determine which host is slowing it down.\n",
|
||||||
|
"graph_args --base 1000 -l 0\n",
|
||||||
|
"graph_scale yes\n",
|
||||||
|
"graph_vlabel seconds\n",
|
||||||
|
"graph_category munin\n";
|
||||||
|
foreach my $log (@logs) {
|
||||||
|
print "$log.label munin $log\n";
|
||||||
|
print "$log.draw AREASTACK\n";
|
||||||
|
|
||||||
|
next unless $log eq "update" || $log eq "graph";
|
||||||
|
|
||||||
|
print_thresholds("$log", undef, undef, 240, 285);
|
||||||
|
}
|
||||||
|
exit 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (defined($missing_module)) {
|
||||||
|
die "Failed to run due to missing Perl module '$missing_module'";
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach my $log (@logs) {
|
||||||
|
my $logfile = "$logdir/munin-$log.log";
|
||||||
|
my $time = 'U';
|
||||||
|
|
||||||
|
if (! -r $logfile) {
|
||||||
|
print "$log.extinfo Can't open $logfile for reading\n";
|
||||||
|
print "$log.value $time\n";
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $bw = File::ReadBackwards->new("$logdir/munin-$log.log") or
|
||||||
|
die "can't read 'log_file' $!";
|
||||||
|
my $found_previous_finished = 0;
|
||||||
|
while(defined(my $log_line = $bw->readline) && $found_previous_finished == 0) {
|
||||||
|
if ($log_line =~ (/(finished|generated) \((\d+\.\d+)\ssec\)$/)) {
|
||||||
|
$time = $2;
|
||||||
|
$found_previous_finished = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($log ne "graph" || uses_graph_cron("$logdir/munin-$log.log")) {
|
||||||
|
print "$log.value $time\n";
|
||||||
|
}
|
||||||
|
}
|
123
roles/mgrote_munin_server/templates/munin_update
Normal file
123
roles/mgrote_munin_server/templates/munin_update
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
: <<=cut
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
munin_update - Munin plugin to graph the time to query about each host from the nodes.
|
||||||
|
|
||||||
|
=head1 APPLICABLE SYSTEMS
|
||||||
|
|
||||||
|
Munin master servers.
|
||||||
|
|
||||||
|
=head1 CONFIGURATION
|
||||||
|
|
||||||
|
Normally needs no configuration. You may configure it with the
|
||||||
|
following parameter:
|
||||||
|
|
||||||
|
[munin*]
|
||||||
|
env.UPDATE_STATSFILE .../munin-update.stats
|
||||||
|
env.MUNIN_UPDATE_LOCACTION .../munin-update
|
||||||
|
|
||||||
|
The first is the statistics file for munin update.
|
||||||
|
|
||||||
|
The exact location of this file is package/site specific, but
|
||||||
|
munin_update will know where it is unless you have made changes.
|
||||||
|
|
||||||
|
=head1 INTERPRETATION
|
||||||
|
|
||||||
|
The script reads the munin-update "stats" file to determine how long
|
||||||
|
it takes to query the nodes about each host configured in Munin.
|
||||||
|
|
||||||
|
Munin is run from cron every 5 minutes and before the next run of
|
||||||
|
munin-update the previous run needs to be done. Each run of
|
||||||
|
munin-update forks one process pr. host that needs to get data
|
||||||
|
collected, so all collection runs in parallel.
|
||||||
|
|
||||||
|
Any host that is slow, for example slower than 4 miniutes, causes a
|
||||||
|
risk that the next run of munin-update must be canceled due to the
|
||||||
|
lateness of the previous run. In such cases there will be single line
|
||||||
|
gaps in the "by day" graph.
|
||||||
|
|
||||||
|
Keep your hosts updating quickly and all will be well.
|
||||||
|
|
||||||
|
=head1 MAGIC MARKERS
|
||||||
|
|
||||||
|
#%# family=manual
|
||||||
|
#%# capabilities=autoconf
|
||||||
|
|
||||||
|
=head1 BUGS
|
||||||
|
|
||||||
|
Munin-update is always run at the same time as this plugin runs -
|
||||||
|
therefore the stats file may be incompletely written and the plugin
|
||||||
|
will likely show a incomplete list of hosts. It should be using
|
||||||
|
munin-update.old-stats, which is not currently even made.
|
||||||
|
|
||||||
|
Munin-update removes the "domain" information on all hosts. If there
|
||||||
|
are two hosts with the same host name in different domains then one of
|
||||||
|
them will be disappeared by the munin-update collection process.
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
The munin_update plugin has been included in munin for many years (at
|
||||||
|
least 2004). The most likely author is one of the original munin team.
|
||||||
|
|
||||||
|
Documentation and updating to 2009 for Munin 1.4 by Nicolai Langfeldt.
|
||||||
|
|
||||||
|
(C) 2004-2009 The Munin Team, Redpill Linpro AS
|
||||||
|
|
||||||
|
=head1 LICENSE
|
||||||
|
|
||||||
|
GPLv2
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
. "$MUNIN_LIBDIR/plugins/plugin.sh"
|
||||||
|
|
||||||
|
|
||||||
|
UPDATE_STATSFILE=${UPDATE_STATSFILE:-$MUNIN_DBDIR/munin-update.stats}
|
||||||
|
MUNIN_UPDATE_LOCATION=${MUNIN_UPDATE_LOCATION:-$MUNIN_LIBDIR/munin-update}
|
||||||
|
|
||||||
|
|
||||||
|
if [ "$1" = "autoconf" ]; then
|
||||||
|
if [ -e "$MUNIN_UPDATE_LOCATION" ] ; then
|
||||||
|
echo "yes"
|
||||||
|
else
|
||||||
|
echo "no ($MUNIN_UPDATE_LOCATION is not present so this is not a munin-master)"
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$1" = "config" ]; then
|
||||||
|
[ -f "$UPDATE_STATSFILE" ] || {
|
||||||
|
echo 'graph_title Plugin error'
|
||||||
|
echo "graph_info Plugin cannot read stats file $UPDATE_STATSFILE"
|
||||||
|
echo 'error.label Error'
|
||||||
|
echo 'error.critical 1'
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
echo 'graph_title Munin-update'
|
||||||
|
echo 'graph_vlabel seconds'
|
||||||
|
echo 'graph_category munin'
|
||||||
|
echo 'graph_info This graph shows the time it takes to collect data from each hosts that munin collects data on. Munin-master is run from cron every 5 minutes and we want each of the munin-update runs to complete before the next one starts. If munin-update uses too long time to run on one host run it with --debug to determine which plugin(s) are slow and solve the problem with them if possible.'
|
||||||
|
sed '/^UD|/!d; s/.*;//; s/|/ /;' < "$UPDATE_STATSFILE" | sort |
|
||||||
|
while read -r i j; do
|
||||||
|
name="$(clean_fieldname "$i")"
|
||||||
|
echo "$name.label $i"
|
||||||
|
warning=${warning:-240} critical=${critical:-285} print_thresholds "$name"
|
||||||
|
done
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
[ -f "$UPDATE_STATSFILE" ] || {
|
||||||
|
echo 'error.value 1'
|
||||||
|
echo "error.extinfo Plugin cannot read stats file $UPDATE_STATSFILE"
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
sed '/^UD|/!d; s/.*;//; s/|/ /;' < "$UPDATE_STATSFILE" | sort |
|
||||||
|
while read -r i j; do
|
||||||
|
name="$(clean_fieldname "$i")"
|
||||||
|
echo "$name.value $j"
|
||||||
|
done
|
8
roles/mgrote_munin_server/templates/placeholder.html
Normal file
8
roles/mgrote_munin_server/templates/placeholder.html
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Munin</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
Munin has not run yet. Please try again in a few moments.
|
||||||
|
</body>
|
||||||
|
</html>
|
106
roles/mgrote_munin_server/templates/run.sh
Normal file
106
roles/mgrote_munin_server/templates/run.sh
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# timezone settings
|
||||||
|
TZ=${TZ:="Europe/Paris"}
|
||||||
|
echo $TZ > /etc/timezone
|
||||||
|
# workaround https://bugs.launchpad.net/ubuntu/+source/tzdata/+bug/1554806
|
||||||
|
rm /etc/localtime
|
||||||
|
dpkg-reconfigure -f noninteractive tzdata
|
||||||
|
|
||||||
|
# change cron setting for updates
|
||||||
|
CRONDELAY=${CRONDELAY:=5}
|
||||||
|
sed -i "s/\*\/5/\*\/$CRONDELAY/g" /etc/cron.d/munin
|
||||||
|
|
||||||
|
# configure default node name
|
||||||
|
THISNODENAME=${THISNODENAME:="munin"}
|
||||||
|
sed -i "s/^\[localhost\.localdomain\]/\[$THISNODENAME\]/g" /etc/munin/munin.conf
|
||||||
|
|
||||||
|
# configure default node IP
|
||||||
|
THISNODEIP=${THISNODEIP:="127.0.0.1"}
|
||||||
|
sed -i "s/^\( *address\) 127\.0\.0\.1\$/\1 $THISNODEIP/" /etc/munin/munin.conf
|
||||||
|
|
||||||
|
# configure default servername
|
||||||
|
THISSERVERNAME=${SERVERNAME:="munin"}
|
||||||
|
sed -i "s/^\[localhost\.localdomain\]/\[$SERVERNAME\]/g" /etc/apache2/sites-available/000-default.conf
|
||||||
|
|
||||||
|
# configure mail notification
|
||||||
|
if [[ -n "$MAILCONTACT" && -n "$MAILSERVER" && -n "$MAILPORT" && -n "$MAILUSER" && -n "$MAILPASSWORD" && -n "$MAILDOMAIN" ]] ; then
|
||||||
|
MAILCONTACT=${MAILCONTACT:="contact@domain.test"}
|
||||||
|
sed -i "s/mailcontact/$MAILCONTACT/g" /etc/ssmtp/ssmtp.conf
|
||||||
|
sed -i "s/mailcontact/$MAILCONTACT/g" /etc/munin/munin-conf.d/munin_mail.conf
|
||||||
|
MAILSERVER=${MAILSERVER:="mail.domain.test"}
|
||||||
|
sed -i "s/mailserver/$MAILSERVER/g" /etc/ssmtp/ssmtp.conf
|
||||||
|
sed -i "s/mailserver/$MAILSERVER/g" /etc/ssmtp/revaliases
|
||||||
|
MAILPORT=${MAILPORT:="25"}
|
||||||
|
sed -i "s/mailport/$MAILPORT/g" /etc/ssmtp/ssmtp.conf
|
||||||
|
sed -i "s/mailport/$MAILPORT/g" /etc/ssmtp/revaliases
|
||||||
|
MAILUSER=${MAILUSER:="alert@domain.test"}
|
||||||
|
sed -i "s/mailuser/$MAILUSER/g" /etc/ssmtp/ssmtp.conf
|
||||||
|
MAILFROM=${MAILFROM:="munin@domain.test"}
|
||||||
|
sed -i "s/mailfrom/$MAILFROM/g" /etc/ssmtp/revaliases
|
||||||
|
MAILPASSWORD=${MAILPASSWORD:="XXXXXXXXX"}
|
||||||
|
sed -i "s/mailpassword/$MAILPASSWORD/g" /etc/ssmtp/ssmtp.conf
|
||||||
|
MAILDOMAIN=${MAILDOMAIN:="domain.test"}
|
||||||
|
sed -i "s/maildomain/$MAILDOMAIN/g" /etc/ssmtp/ssmtp.conf
|
||||||
|
sed -i "s/mailhost/$MAILDOMAIN/g" /etc/ssmtp/ssmtp.conf
|
||||||
|
MAILNAME=${MAILNAME:="Munin"}
|
||||||
|
sed -i "s/munin application user/$MAILNAME/g" /etc/passwd
|
||||||
|
else
|
||||||
|
rm /etc/munin/munin-conf.d/munin_mail.conf /etc/ssmtp/ssmtp.conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
# generate node list
|
||||||
|
NODES=${NODES:-}
|
||||||
|
for NODE in $NODES
|
||||||
|
do
|
||||||
|
NAME=`echo $NODE | cut -d ':' -f1`
|
||||||
|
HOST=`echo $NODE | cut -d ':' -f2`
|
||||||
|
grep -q "${HOST}$" /etc/munin/munin.conf || cat << EOF >> /etc/munin/munin.conf
|
||||||
|
[$NAME]
|
||||||
|
address $HOST
|
||||||
|
use_node_name yes
|
||||||
|
|
||||||
|
EOF
|
||||||
|
done
|
||||||
|
|
||||||
|
# placeholder html to prevent permission error
|
||||||
|
if [ ! -f /var/cache/munin/www/index.html ]; then
|
||||||
|
cat << EOF > /var/cache/munin/www/index.html
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Munin</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
Munin has not run yet. Please try again in a few moments.
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
EOF
|
||||||
|
chown -R munin: /var/cache/munin/www/index.html
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ensure munin folder exist and have right permission
|
||||||
|
mkdir -p /var/lib/munin/cgi-tmp /var/cache/munin/www
|
||||||
|
chown -R munin:munin /var/lib/munin /var/cache/munin
|
||||||
|
chmod -R ugo+rw /var/lib/munin/cgi-tmp
|
||||||
|
chown munin:munin /var/log/munin/munin-graph.log
|
||||||
|
chown munin:munin /var/log/munin/munin-limits.log
|
||||||
|
chown munin:munin /var/log/munin/munin-html.log
|
||||||
|
|
||||||
|
# start cron
|
||||||
|
/usr/sbin/cron &
|
||||||
|
|
||||||
|
# start local munin-node
|
||||||
|
/usr/sbin/munin-node > /dev/null 2>&1 &
|
||||||
|
|
||||||
|
# confirm nodes
|
||||||
|
echo "Using the following munin nodes:"
|
||||||
|
echo " $THISNODENAME"
|
||||||
|
echo " $NODES"
|
||||||
|
|
||||||
|
# start apache
|
||||||
|
/usr/sbin/apache2ctl start
|
||||||
|
|
||||||
|
# display logs
|
||||||
|
touch /var/log/munin/munin-update.log
|
||||||
|
chown munin:munin /var/log/munin/munin-update.log
|
||||||
|
tail -f /var/log/munin/munin-*.log
|
12
roles/mgrote_munin_server/templates/ssmtp.conf
Normal file
12
roles/mgrote_munin_server/templates/ssmtp.conf
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
# The user that gets all the mails (UID < 1000, usually the admin)
|
||||||
|
root={{ munin_alerts_to }}
|
||||||
|
|
||||||
|
# The mail server (where the mail is sent to), both port 465 or 587 should be acceptable
|
||||||
|
# See also https://support.google.com/mail/answer/78799
|
||||||
|
mailhub={{ munin_mail_server }}:{{ munin_mail_port }}
|
||||||
|
|
||||||
|
# The full hostname. Must be correctly formed, fully qualified domain name or GMail will reject connection.
|
||||||
|
hostname={{ munin_servername }}
|
||||||
|
|
||||||
|
# Use implicit TLS (port 465). When using port 587, change UseSTARTTLS=Yes
|
||||||
|
UseTLS={{ munin_mail_tls }}
|
Loading…
Reference in a new issue