paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

Homelabにモニタリングサーバ導入1 prometheusデプロイ

Homelabが動き出して2週間ほどですがそろそろ監視系のサーバも欲しくなってきました。 でもこれはHomelab。欲しかったら作れます。

構成

監視サーバもswarm内に立ててもいいですが、切り分けもしやすいしまずは単体のゲスト作成でやってみます。
構成はこんな感じでコンテナ環境とpfsenseのリソース監視をやります。

監視ツール

仕事では監視の設定は別部隊がいるので実はがっつりやったことありません。 なのでほぼ1からですから有名なもので作ってみたいと思います。

2、3年前から存在を知ったprometheusを作ってみます。
エージェントレスなのが試しやすくていいですね。

prometheus.io

dockerのリソースはcAdvisorで取れることは検証環境で確認済みなので今回はまずpfsenseのリソース取得をします。
デフォルトはsnmpの機能は無くモジュールのsnmp exporterというのを導入すれば取れるみたい。

監視サーバ用OSデプロイ

ovaとってあったubuntuvirtualboxにimport。
割愛。

prometheusインストール

ダウンロードしたファイル内のバイナリを実行すればとりあえず使えるようです。

masashi@lab-monitor1:~$ wget https://github.com/prometheus/prometheus/releases/download/v2.37.8/prometheus-2.37.8.linux-amd64.tar.gztar xfvz prometheus-2.37.8.linux-amd64.tar.gz
masashi@lab-monitor1:~$ cd prometheus-2.37.8.linux-amd64/
masashi@lab-monitor1:~$ ./prometheus

9090ポートで接続。

とりあえず簡単にデプロイ完了。

exporterインストール

こちらはgit clone。

masashi@lab-monitor1:~$ git clone https://github.com/prometheus/snmp_exporter.git
masashi@lab-monitor1:~$ cd snmp_exporter/
masashi@lab-monitor1:~/snmp_exporter$ ls
CHANGELOG.md        config           Dockerfile  go.mod   main.go         Makefile.common  SECURITY.md  testdata
CODE_OF_CONDUCT.md  config_test.go   examples    go.sum   MAINTAINERS.md  NOTICE           snmp-mixin   VERSION
collector           CONTRIBUTING.md  generator   LICENSE  Makefile        README.md        snmp.yml

pfsense用のmibを取り込んで設定ファイルに書く必要があります。
ここでgeneratorの出番。

masashi@lab-monitor1:~/snmp_exporter$ cd generator/
masashi@lab-monitor1:~/snmp_exporter/generator$ ls
config.go   Dockerfile-local  generator      generator.yml.org  Makefile  net_snmp.go  snmp.yml  tree_test.go
Dockerfile  FORMAT.md         generator.yml  main.go            mibs      README.md    tree.go

mibファイルを作ります。

masashi@lab-monitor1:~/snmp_exporter$ make generator mibs

メジャーどこのmibをgenerateしたらpfsenseのmibをコピー。

masashi@lab-monitor1:~/snmp_exporter/generator/mibs$ scp admin@192.168.0.101:/usr/share/snmp/mibs/* .

generator.ymlに取りたい情報を書いて設定ファイルを作ります。
サンプルでこんな感じで追記。

masashi@lab-monitor1:~/snmp_exporter/generator$ tail generator.yml
        # pfSense

  pfsense:
    walk:
      - ifEntry
      - pfStatus
      - pfStateTable
      - pfInterfaces
    auth:
      community: public

OS上ではgeneratorがmake出来なかったのでOS内でdockerコンテナ(standalone)を立ち上げでsnmp.yml書き出し。

masashi@lab-monitor1:~/snmp_exporter$ sudo docker build -t snmp-generator .
masashi@lab-monitor1:~/snmp_exporter$ sudo docker run --rm -ti   -v "${PWD}:/opt/"   snmp-generator generate
masashi@lab-monitor1:~/snmp_exporter/generator$ grep -A10 pfsense snmp.yml
pfsense:
  walk:
  - 1.3.6.1.2.1.2.2.1
  - 1.3.6.1.4.1.12325.1.200.1.1
  - 1.3.6.1.4.1.12325.1.200.1.3
  - 1.3.6.1.4.1.12325.1.200.1.8
  metrics:
  - name: ifIndex
    oid: 1.3.6.1.2.1.2.2.1.1
    type: gauge
    help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1

こう言うツール系でもコンテナは役立ちますね。

exporterアクセス

exporterの実行ファイルは別のようで違うリンクから落とします。 これもバイナリを実行するだけ。

masashi@lab-monitor1:~/snmp_exporter-0.21.0.linux-amd64$ wget https://github.com/prometheus/snmp_exporter/releases/download/v0.21.0/snmp_exporter-0.21.0.linux-amd64.tar.gz
masashi@lab-monitor1:~/snmp_exporter-0.21.0.linux-amd64$ tar xfvz snmp_exporter-0.21.0.linux-amd64.tar.gz
masashi@lab-monitor1:~/snmp_exporter-0.21.0.linux-amd64$ cd snmp_exporter-0.21.0.linux-amd64/
masashi@lab-monitor1:~/snmp_exporter-0.21.0.linux-amd64$ ./snmp_exporter
ts=2023-05-21T07:44:25.499Z caller=main.go:148 level=info msg="Starting snmp_exporter" version="(version=0.21.0, branch=HEAD, revision=0d8c3527cac0c26f1d6005b84b74413d14264c37)"
...

9116ポートでアクセス。

pfsenseのmibが取れるようになりました。

exporterのデーモン化

prometheusがexporterにアクセスして情報を取ってくるようです。
systemdで起動できるようにserviceファイルを作成。

masashi@lab-monitor1:~/snmp_exporter-0.21.0.linux-amd64$ cat /etc/systemd/system/sshd.service
[Unit]
Description=OpenBSD Secure Shell server
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run

[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=notify
RuntimeDirectory=sshd
RuntimeDirectoryMode=0755

[Install]
WantedBy=multi-user.target
Alias=sshd.service

デーモンとして起動。
読み込むファイル系もコピーしておきます。

masashi@lab-monitor1:~$ sudo cp -R snmp_exporter-0.21.0.linux-amd64 /home/prometheus/snmp_exporter
masashi@lab-monitor1:~$ sudo cp /etc/snmp_exporter/snmp.yml /home/prometheus/snmp_exporter/
masashi@lab-monitor1:~$
masashi@lab-monitor1:~$ systemctl status snmp_exporter
○ snmp_exporter.service - SNMP Exporter
     Loaded: loaded (/etc/systemd/system/snmp_exporter.service; disabled; vendor preset: enabled)
     Active: inactive (dead)
masashi@lab-monitor1:~$ sudo systemctl start snmp_exporter

prometheusの設定

ymlファイルにsnmp exporterの設定を追加して読み込めるようにします。

masashi@lab-monitor1:~/prometheus-2.37.8.linux-amd64$ grep pfsense -A10 prometheus.yml
  - job_name: "snmp_pfsense"
    static_configs:
      - targets:
        - "10.0.1.254"
    metrics_path: "/snmp"
    params:
      module: [pfsense]
    scrape_interval: 10s
    scrape_timeout: 5s
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 10.0.1.3:9116

prometheus起動

これでsnmp exporter経由でprometheusでsnmpのリソースが取れるようになりました。 再度prometheusを起動して仮のパラメータを入れてみます。

サンプルを打ち込んでみましょう。

OK!取れてます。

あと取得パラメータをチューニングすれば完成です。
追加で色々入れないといけないかもしれませんが、
cpu、memory、interface使用率、セッション数辺りは取りたいですね。

といあえず今回はここまで。

参考サイト

Brendon Matheson - A Step-by-Step Guide to Connecting Prometheus to pfSense via SNMP

Prometheus SNMP Exporter導入メモ - suueiの備忘録