ねぇMunin……( ゚д゚ )クワッ!!
うちのMinipcですがディスクが16GBほどです。Linux用途なので8GBもあれば十分ジャロとか思ってたのですが、containersが気が付けば6GBも消費して、Journalが2GBとかログも増えれば最近はgoやnpm,Denoとかがガンガンディスクを消費していきます。
dnf updateに失敗したよ(´・ω:;.:...
というわけで超久々にMunin先生にご登場いただくことにしたわけですが、HTMLで吐き出されても見にくいので情報はnc(or telnet)で拾うことにしました。
サーバにmunin-nodeを入れたら終わりなので、かなり環境にやさしい方法だと思います。
サーバにmunin-nodeを入れる
まずはサーバ側での作業です。
munin-nodeのインストール
munin-nodeをインストールしてconfを書き換えます。最低限必要なのはアクセスするホストをallow(正規表現)することで、cidr_allowを使えばサブネット単位で許可を出せます。
$ sudo dnf install munin-node
$ sudo vi /etc/munin/munin-node.conf
...
allow ^127\.0\.0\.1$
allow ^::1$
# この辺に追加
cidr_allow 192.168.0.0/24
cidr_allow 192.168.1.0/24
設定を入れたら起動しておきましょう。
$ sudo systemctl enable --now munin-node
Firewallの設定
残念ながらFirewalldにはmunin-nodeのサービス定義ファイルがなかったので、4949ポートを直接開きます。
$ sudo firewall-cmd --add-port=4949/tcp --permanent
$ sudo firewall-cmd --reload
クライアントから接続する
今回やらかしたのはディスクスペースなので、muninのfetch dfというコマンドでディスク使用量を取得します。
サーバのmunin-node.confで許可したホストからコマンドを流してみましょう。コマンドはechoを使って作って、ncにリダイレクトしてサーバに流します。
$ echo "fetch df" | nc minipc.home 4949
# munin node at minipc.home
_dev_mapper_fedora_root.value 66.7628332162003
_dev_shm.value 0.00109062444694186
_run.value 0.0692793706111705
_tmp.value 0.0321238473462876
_dev_sda2.value 47.15087890625
_dev_sda1.value 1.25383260486659
_dev_md0.value 31.7416755955017
.
#始まりの行はコメントで、名前と値のペアがずっとならんで、.始まりの行で終了です。これがMuninの基本的な応答の様式です。
どんなコマンドがあるかはサーバの/etc/munin/plugins下を見てください。fetchコマンドを送るとここのコマンドが叩かれているようです。
$ ls /etc/munin/plugins/
acpi@ diskstats@ fw_packets@ interrupts@ open_files@ smart_sda@ threads@
cpu@ entropy@ hddtemp_smartctl@ irqstats@ open_inodes@ smart_sdb@ uptime@
cpuspeed@ forks@ if_enp0s20f0u1@ load@ proc_pri@ smart_sdc@ users@
df@ fw_conntrack@ if_enp1s0@ memory@ processes@ smart_sdd@ vmstat@
df_inode@ fw_forwarded_local@ if_wlo1@ netstat@ selinux_avcstat@ swap@
チェックする
こんな感じで出力を色付けしてみます。
最初Pythonでスクリプト書いたけど、ssh接続時にほんのりもさっとした気がしたので結局go_(:3」∠)_
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"github.com/fatih/color"
)
const (
thCrit = 90
thWarn = 70
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
line := strings.TrimSpace(scanner.Text())
if line == "" || strings.HasPrefix(line, "#") {
continue
}
if strings.HasPrefix(line, ".") {
break
}
fields := strings.Fields(line)
if len(fields) < 2 {
fmt.Printf("Invalid input: %s\n", line)
continue
}
labelRaw := fields[0]
value, err := strconv.ParseFloat(fields[1], 64)
if err != nil {
fmt.Printf("Invalid input: %s\n", line)
continue
}
label := strings.TrimSuffix(labelRaw, ".value")
switch {
case value > thCrit:
color.HiRed("%s | %-30s : %5.1f%%\n", "CRITICAL", label, value)
case value > thWarn:
color.HiYellow("%s | %-30s : %5.1f%%\n", "WARNING ", label, value)
}
}
if err := scanner.Err(); err != nil {
fmt.Fprintf(os.Stderr, "failed to read input: %v\n", err)
os.Exit(1)
}
}
ssh接続時のチェックであれば、munin-node.confへのallowの追加もfirewallの穴あけも不要です。
echo "fetch df" | nc localhost 4949 | grep -v "^#" | sort -rk 2 | head -n 1
