Raspberry PiをMuninで監視サーバにする

## はじめに
余っているRaspberryPizeroで何かできないかと考えMuninを使用して監視サーバにすることにしました。
## 前提
### 今回使用した環境
ハードウェア ： Raspberrypizero WH
OS : Raspbian GNU/Linux 12 (bookworm)
### 用語など
Muninでは監視サーバをマスタ、監視対象の端末をノードと称します。
## 構築
### マスタのインストール
まずは監視サーバの準備をしていきます。
1. Apacheのインストール
    ```:bash
    $ sudo apt-get install apache2
    ```
1. Muninのインストール
    ```:bash
    $ sudo apt-get install munin
    ```
1. Apacheの動作確認
    ローカルエリアネットワーク内の別端末からブラウザでApacheにアクセスしてみます。
    URL : http://<マスタをインストールした端末のIP or 名前>
    ![スクリーンショット 2024-11-03 9.31.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461718/021d36cc-2395-0cf2-4ff3-cd3e85e2f456.png)
1. apacheのコンフィグ設定
    ```:bash
    $ ls /etc/munin
    apache24.conf  munin-node.conf  plugin-conf.d  static
    munin-conf.d   munin.conf       plugins        templates
    ```
    バージョンによりコンフィグファイルの名称が異なる様です。今回の場合はapache24.confが対象です。おそらくですがいずれのバージョンでもapacheXX.confというファイルを探せば良いと思います。
    ```:bash
    $ sudo nano apache24.conf
    //変更前
    <Directory /var/cache/munin/www>
        Require local
        Options None
    </Directory>
    
    //変更後
    <Directory /var/cache/munin/www>
        Order allow,deny
        Allow from all
        Require all granted
        Options None
    </Directory>
    ```
    このコンフィグファイルのフォーマットもバージョンによって微妙に異なる様ですが、/var/cache/munin/wwwの部分を変更すると覚えておけば良いでしょう。
1. コンフィグファイルのシンボリックリンクをApacheのディレクトリに作成
    ```:bash
    $ sudo ln -s /etc/munin/apache24.conf /etc/apache2/sites-enabled/munin.conf
    ```
    注）変更したコンフィグファイルの名称に適ほど置き換えてください。今回はapache24.confのシンボリックリンクを作成しています。
1. Muninの動作確認
    ローカルエリアネットワーク内の別端末からブラウザでMuninにアクセスしてみます。
    URL : http://<マスタをインストールした端末のIP or 名前>/munin
    ![スクリーンショット 2024-11-03 9.52.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461718/2754d7d8-c907-7301-22db-a71f6b3be320.png)
この段階ではまだノードが登録されていないためマスタ（監視サーバ自体）のみの情報が表示できます。
### ノードの追加
それでは監視の対象になるノードの追加をしていきます。
1. ノードのインストール（ノード（監視の対象となる端末）で実施）
    ```:bash
    $ sudo apt-get install munin-node
    ```
1. Muninノードのコンフィグファイルに追加（ノード（監視の対象となる端末）で実施）
    ```:bash
    $ sudo nano /etc/munin/munin-node.conf
    //追加
    # A list of addresses that are allowed to connect.  This must be a
    # regular expression, since Net::Server does not understand CIDR-style
    # network notation unless the perl module Net::CIDR is installed.  You
    # may repeat the allow line as many times as you'd like

    allow ^127\.0\.0\.1$
    allow ^::1$
    allow ^<マスタのIPアドレス>$　⇨　追加行
    ```
1. ノードの再起動（ノード（監視の対象となる端末）で実施）
    ```:bash
    $ sudo systemctl restart munin-node
    ```
1. ノードの追加（マスタ（監視サーバ）側で実施）
    ```:bash
    $ sudo nano /etc/munin/munin.conf
    //追加
    # a simple host tree
    [localhost.localdomain]
        address 127.0.0.1
        use_node_name yes
    [<任意の名前>.localdomain]　⇨　追加行
        address <追加するノードのIPアドレスまたは名前>　⇨　追加行
        use_node_name yes　⇨　追加行
    ```
しばらくすると新しいノードが追加され確認できるようになります。
ちなみに.localdomeinの部分はグループ名と考えると良いかもしれません。こちらも任意に変更することができます。

### アラートをGmailで飛ばす
#### exim4とmailutilのインストール
```bash:bash
sudo apt install exim4
sudo apt install mailutils
```
#### exim4の設定
```bash:bash
sudo dpkg-reconfigure exim4-config
```
exim4の設定はダイアログで設定を行います。
1. General type of mail configuration:
    - mail sent by smarthost; received via SMTP or fetchmailを選択
1. System mail name:
    - 特に指定するドメインなどが無い場合　localhost を入力
1. IP-addresses to listen on for incoming SMTP connections:
    - 127.0.0.1 ; ::1　を入力
1. Machines to relay mail for:
    - 未入力
1. IP address or host name of the outgoing smarthost:
    - smtp.gmail.com:587 を入力
1. Hide local mail name in outgoing mail?
    - No を選択
1. Keep number of DNS-queries minimal (Dial-on-Demand)?
    - No を選択
1. Delivery method for local mail:
    - mbox format in /var/mail/ を入力
1. Split configuration into small files?
    - No を選択
#### /etc/exim4/passwd.clientの編集
```bash:bash
sudo nano /etc/exim4/passwd.client
```
以下を入力して保存する。この際Googleアカウントに二段階認証設定をしている場合は通常のGoogleアカウントのパスワードではなく、アプリパスワードを発行して入力する必要がある。
アプリパスワードを作成していない場合は[こちら](https://support.google.com/accounts/answer/185833?hl=ja)を参照して作成してください。

```
gmail-smtp.l.google.com:<メールアドレス>:<アプリ パスワード>
*.google.com:<メールアドレス>:<アプリ パスワード>
smtp.gmail.com:<メールアドレス>:<アプリ パスワード>
```
#### 設定を反映する
```bash:bash
sudo update-exim4.conf
```
#### テストメールを送信する
```bash:bash
sudo echo "test mail massage" | mail -s "test mail" <送信先メールアドレス>
```
### Muninのアラート設定
```bash:bash
sudo nano /etc/munin/munin.conf
```
変更箇所
```
# 送信コマンド
# フォーマット　contact.<通知先名>.command mail -s "<件名>" <送信先メールアドレス>
contact.admin.command mail -s "Munin Alart ${var:worst}: ${var:group}::${var:host}::${var:plugin}" <送信先メールアドレス>

# 送信するアラートレベル設定
# フォーマット　contact.<通知先名>.always_send <障害レベル設定>
contact.admin.always_send warning critical

# 送信設定
# フォーマット contacts <通知先名>
contacts admin

# アラートレベルと閾値を設定（ノード追加した際に追加した各ノードの項に追記する）例えばcpu80%をWarning、90%をcriticalとしたい場合
# フォーマット　<plugin名>.<インターナル名>.<障害レベル> <閾値>
# a simple host tree
[<ホスト名>]
    cpu.user.warning 80
    cpu.user.critical 100
```
- 通知先名は任意に設定可能、通知先名を分けて複数行書くこともできるので通知先エイリアスといってもいいかもしれない
- 件名部分で使用できる変数は[こちら](https://guide.munin-monitoring.org/en/latest/tutorial/alert.html#munin-alert-variables)が参考になる
- plugin名は```munin-node-configure```コマンドや```ls /etc/munin/plugins```で確認する
- インターナル名は```sudo munin-run <plugin名> config```コマンドや、実際のmuninの画面（各グラフをクリックし際に下の方に表示される表）で確認する
- 通知したくないノードがある場合は```contacts no```とすることで通知されなくなる

## その他
### プラグインの設定確認コマンド
```bash:bash
sudo munin-run <plugin名> config
```

## それでは、良きラズパイライフを！！