diff options
-rw-r--r-- | ansible/roles/munin/tasks/main.yml | 24 | ||||
-rw-r--r-- | ansible/roles/munin/templates/plugin.conf.j2 | 15 | ||||
-rw-r--r-- | ansible/roles/munin/templates/plugins/dovecot_maildirs.sh.j2 | 64 | ||||
-rw-r--r-- | ansible/roles/munin/templates/plugins/lovering_inheritance.py.j2 | 67 | ||||
-rw-r--r-- | ansible/roles/munin/vars/main.yml | 68 |
5 files changed, 165 insertions, 73 deletions
diff --git a/ansible/roles/munin/tasks/main.yml b/ansible/roles/munin/tasks/main.yml index aec521f..ab86a43 100644 --- a/ansible/roles/munin/tasks/main.yml +++ b/ansible/roles/munin/tasks/main.yml @@ -33,6 +33,18 @@ notify: - Restart munin-node service +- name: Template munin plugin configuration file + template: + src: plugin.conf.j2 + dest: /etc/munin/plugin-conf.d/custom + owner: root + group: root + mode: "0444" + tags: + - role::munin + notify: + - Restart munin-node service + - name: Enable non-default munin plugins file: src: "/usr/share/munin/plugins/{{ item.src }}" @@ -68,15 +80,17 @@ - Restart munin-node service - name: Copy custom munin plugins - copy: - content: "{{ item.value }}" - dest: /etc/munin/plugins/{{ item.key }} + template: + src: "{{ item }}" + # Split two levels of file extensions + dest: "/etc/munin/plugins/{{ item | basename | splitext | first | splitext | first }}" owner: root group: root mode: "0555" loop_control: - label: "{{ item.key }}" - loop: "{{ munin_node_custom_plugins | dict2items }}" + # I love representing data modification logic in YAML! + label: "{{ item | basename | splitext | first | splitext | first }}" + with_fileglob: "../templates/plugins/*" tags: - role::munin diff --git a/ansible/roles/munin/templates/plugin.conf.j2 b/ansible/roles/munin/templates/plugin.conf.j2 new file mode 100644 index 0000000..9d2c74c --- /dev/null +++ b/ansible/roles/munin/templates/plugin.conf.j2 @@ -0,0 +1,15 @@ +# Ansible managed + +[dovecot_maildirs] +user root +group vmail + +[load] +env.load_warning {{ ansible_processor_nproc * 0.7 }} +env.load_critical {{ ansible_processor_nproc * 0.85 }} + +[memory] +env.apps_warning 70% +env.apps_critical 90% +env.swap_warning 60% +env.swap_critical 80% diff --git a/ansible/roles/munin/templates/plugins/dovecot_maildirs.sh.j2 b/ansible/roles/munin/templates/plugins/dovecot_maildirs.sh.j2 new file mode 100644 index 0000000..b634df3 --- /dev/null +++ b/ansible/roles/munin/templates/plugins/dovecot_maildirs.sh.j2 @@ -0,0 +1,64 @@ +#!/bin/sh +# Ansible managed + +cd /var/vmail || exit 1 + +print_maildir_config() { + find . -maxdepth 1 -type d \ + | tail -n +2 \ + | awk -F / '{ + print $2 ".draw AREASTACK" + print $2 ".label " $2 + }' +} + +if [ "$1" = "autoconf" ]; then + echo "no" + exit +fi + +if [ "$1" = "config" ]; then + cat <<EOF +multigraph dovecot_maildir_sizes +graph_title Dovecot Maildir sizes +graph_args --base 1024 -l 0 +graph_vlabel bytes +graph_category mail +graph_info Shows the sizes of top mail directories by their respective users +graph_total Total +graph_order joe jc +EOF + print_maildir_config + cat <<EOF +multigraph dovecot_maildir_mails +graph_title Dovecot mails in maildirs +graph_args --base 1000 -l 0 +graph_vlabel mails +graph_category mail +graph_info Shows the amount of mails by user on our Dovecot server +graph_total Total +graph_order joe jc +EOF + print_maildir_config + exit 0 +fi + +echo "multigraph dovecot_maildir_sizes" +du --bytes --summarize -- * \ + | awk '{ print $2 ".value " $1 }' + +echo "multigraph dovecot_maildir_mails" +find . \ + | awk -F / ' + # Maildir e-mails have the hostname contained in them + $0 ~ "{{ ansible_fqdn }}" { + total[$2] += 1 + } + END { + for (user in total) { + print user ".value " total[user] + } + } + ' + +# vim: ft=sh.jinja2: diff --git a/ansible/roles/munin/templates/plugins/lovering_inheritance.py.j2 b/ansible/roles/munin/templates/plugins/lovering_inheritance.py.j2 new file mode 100644 index 0000000..4e6d315 --- /dev/null +++ b/ansible/roles/munin/templates/plugins/lovering_inheritance.py.j2 @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +# Ansible managed + +import datetime +import random +import sys + +if sys.argv[-1] == "autoconf": + print("no") + sys.exit(0) + +if sys.argv[-1] == "config": + + print("""\ +graph_title Lovering Inheritance +graph_args --base 1000 -l 0 +graph_vlabel £ +graph_category people +graph_info This graph shows the insurance that Chris can cash out. +graph_total Total +savings.label Savings +savings.info Base inheritance money Chris paid into his account in 2024 +savings.draw AREASTACK +interest.label Interest +interest.info Amount of money gained from interest on the base amount +interest.draw AREASTACK +inherited.label Inherited money +inherited.info Amount inherited from deaths of friends, family and victims +inherited.draw AREASTACK\ + """) + sys.exit(0) + +# Fixed seed to ensure that the bank jitter is constant +random.seed(1234) +today = datetime.date.today() +savings = 740 +interest_per_day = 0.005 +insurance_policy_start = datetime.date(2024, 8, 28) +days_griefed = (today - insurance_policy_start).days +accrued_interest = 0 +for _ in range(days_griefed): + bank_jitter = random.random() + accrued_interest += bank_jitter * (interest_per_day * (savings + accrued_interest)) + +inherited_money = 0 + +if days_griefed > 10: + # Hassan declared as KIA (he had stocks in Big Oil) + inherited_money += 10000 + +if days_griefed > 60: + # Death of Joe (prospect of sale of stolen GPUs) + inherited_money += 5000 + +if days_griefed > 170: + # Bella disappears (spent all on chicken and gifts for his wife) + inherited_money += 300 + +if days_griefed > 360: + # Lola Banks deploys her Titan missile but burns herself to death + inherited_money += 12000 + +print(f"savings.value {savings}") +print(f"interest.value {accrued_interest}") +print(f"inherited.value {inherited_money}") + +# vim: ft=python.jinja2: diff --git a/ansible/roles/munin/vars/main.yml b/ansible/roles/munin/vars/main.yml deleted file mode 100644 index 9c8245d..0000000 --- a/ansible/roles/munin/vars/main.yml +++ /dev/null @@ -1,68 +0,0 @@ ---- -munin_node_custom_plugins: - lovering_inheritance: | - #!/usr/bin/env python3 - # Ansible managed - - import datetime - import random - import sys - - if sys.argv[-1] == "autoconf": - print("no") - sys.exit(0) - - if sys.argv[-1] == "config": - - print("""\ - graph_title Lovering Inheritance - graph_args --base 1000 -l 0 - graph_vlabel £ - graph_category people - graph_info This graph shows the insurance that Chris can cash out. - graph_total Total - savings.label Savings - savings.info Base inheritance money Chris paid into his account in 2024 - savings.draw AREASTACK - interest.label Interest - interest.info Amount of money gained from interest on the base amount - interest.draw AREASTACK - inherited.label Inherited money - inherited.info Amount inherited from deaths of friends, family and victims - inherited.draw AREASTACK\ - """) - sys.exit(0) - - # Fixed seed to ensure that the bank jitter is constant - random.seed(1234) - today = datetime.date.today() - savings = 740 - interest_per_day = 0.005 - insurance_policy_start = datetime.date(2024, 8, 28) - days_griefed = (today - insurance_policy_start).days - accrued_interest = 0 - for _ in range(days_griefed): - bank_jitter = random.random() - accrued_interest += bank_jitter * (interest_per_day * (savings + accrued_interest)) - - inherited_money = 0 - - if days_griefed > 10: - # Hassan declared as KIA (he had stocks in Big Oil) - inherited_money += 10000 - - if days_griefed > 60: - # Death of Joe (prospect of sale of stolen GPUs) - inherited_money += 5000 - - if days_griefed > 170: - # Bella disappears (spent all on chicken and gifts for his wife) - inherited_money += 300 - - if days_griefed > 360: - # Lola Banks deploys her Titan missile but burns herself to death - inherited_money += 12000 - - print(f"savings.value {savings}") - print(f"interest.value {accrued_interest}") - print(f"inherited.value {inherited_money}") |