今回は以下のような構成でGrafanaが動作するhost2からRouter1のメトリクス可視化をゴールとする。
HostはCentOS7を使っている。
Prometheus
Prometheusのインストールと設定
まずはPrometheusのインストールから行う。
基本的にPrometheusの公式ドキュメントの通りにインストールすればいい。
上のLinkからPrometheusをダウンロードしインストールを行う。
インストールするVersionに合わせて実行してください。
ここでは2.34をインストールしています。
# Download
wget https://github.com/prometheus/prometheus/releases/download/v2.34.0-rc.0/prometheus-2.34.0-rc.0.linux-amd64.tar.gz
# Checksumを計算
sha256sum prometheus-2.34.0-rc.0.linux-amd64.tar.gz
# 展開 展開先のPathは任意
tar xvfz prometheus-2.34.0-rc.0.linux-amd64.tar.gz -C /opt/
# デフォルトを確認
cd /opt/prometheus-2.34.0-rc.0.linux-amd64
cat prometheus.yml
# prometheus.yml
# my global config
global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets:
rule_files:
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
Prometheusの起動は以下のようなコマンドを実行する。
./prometheus --config.file=prometheus.yml
systemdで起動
起動コマンドをsystemdで実行できるようにserviceファイルを作成する。
※私の環境ではprometheusユーザーを作成して実行しています。
# vim /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus Server
[Service]
Type=simple
Restart=always
User=prometheus
ExecStart=/opt/prometheus-2.34.0-rc.0.linux-amd64/prometheus --config.file=/opt/prometheus-2.34.0-rc.0.linux-amd64/prometheus.yml --storage.tsdb.path=/opt/prometheus-2.34.0-rc.0.linux-amd64/data
ExecReload=/bin/kill -HUP $MAINPID
TimeoutStopSec=20s
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
systemdで起動
systemctl daemon-reload
systemctl start prometheus
systemctl enable prometheus
snmp_exporterのインストールと設定
SNMP ExporterはPrometheusでSNMPを取得するのに便利なExpoter
snmpwalk
SNMP Expoterはsnmpwalkを利用するため、まずはsnmpwalkをインストールする。
yum install net-snmp net-snmp-utils net-snmp-libs net-snmp-devel
snmpwalkのインストールが完了したら、実際に動作するか試してみる。
SNMPの設定がNW機器にまだの場合は後で動く確認しておくとよい。
※このコマンドは人それぞれなので環境に合わせる
snmpwalk -v 2c -c <community> <target_ip>
SNMPv2-MIB::sysDescr.0 = STRING: Cisco IOS Software, C800 Software (C800-UNIVERSALK9-M), Version 15.8(3)M7, RELEASE SOFTWARE (fc2)
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2021 by Cisco Systems, Inc.
Compiled Wed 25-Aug-21 13:03 by mcpre
SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.9.1.1858
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (68687134) 7 days, 22:47:51.34
SNMPv2-MIB::sysContact.0 = STRING:
SNMPv2-MIB::sysName.0 = STRING: RT1.C891FJ
SNMPv2-MIB::sysLocation.0 = STRING:
SNMPv2-MIB::sysServices.0 = INTEGER: 78
snmpwalkはデフォルトである程度のMIBは用意されている。上の図のSNMPv2-MIBなど
しかし、Ciscoなどのベンダー独自のMIBは含まれていない。
例えばCisco独自のcpmCPUTotal5minRev
を取得してみる。
[izumin@test2 ~]$ snmpwalk -v 2c -c <community> <target_ip> cpmCPUTotal5minRev
cpmCPUTotal5minRev: Unknown Object Identifier (Sub-id not found: (top) -> cpmCPUTotal5minRev)
上のようにOIDが不明となる。拡張MIBを用意する必要がある。
MIBの準備
snmpwalkはデフォルトで/usr/share/snmp/mibs
からMIBを取得している。
このディレクトリに新たに追加しても動作するが、渡しの場合は別のディレクトリから読み込むように変更している。
mkdir /etc/snmp/ex-mib
vim /etc/snmp/snmp.conf
MIBDIRS /usr/share/snmp/mibs:/etc/snmp/ex-mib
mibs all
上のように追記することで/etc/snmp/ex-mib
からもMIBを読み込んでくれるようになる。
ここからはcpmCPUTotal5minRev
を取得できるようにする前提で確認していく。
必要なMIBのDownloadについては以下のサイトが活用できる。
//MIB Locator
https://cfnng.cisco.com/mibs
//Object Navigator
https://snmp.cloudapps.cisco.com/Support/SNMP/do/BrowseOID.do?local=en
Object Navigatorで検索してみるとCISCO-PROCESS-MIB
が必要なことがわかる。
CISCO-PROCESS-MIBを確認すると必要なMIBの一覧が表示される。
必要なMIBをDownloadして/etc/snmp/ex-mib
に格納する
必要なMIBを読み込むことができるようになるとsnmpwalkも成功する。
[izumin@test2 ex-mib]$ snmpwalk -v 2c -c <community> <target_ip> cpmCPUTotal5minRev
CISCO-PROCESS-MIB::cpmCPUTotal5minRev.1 = Gauge32: 3 percent
SNMP Exporter Config Generator
SNMP Exporterを利用するのに便利なConfig Generatorがある。
これを利用することで簡単に設定ファイルが生成できる。
SNMP ExporterはMIBファイルを活用してOIDに変換するが、その時$HOME/.snmp/mibs
からMIBを読み込む。したがって、シンボリックリンクを生成しておく。
mkdir ~/.snmp
ln -s /etc/snmp/ex-mib /home/izumin/.snmp/mibs
次にGeneratorはgoを利用するためgoをインストールする。
wget https://go.dev/dl/go1.18.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.18.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
# go version
go version go1.18 linux/amd64
Goのインストールが完了した。
Generatorをインストールする。generatorという実行ファイルがあればOK
go install github.com/prometheus/snmp_exporter/generator@latest
cd ${GOPATH-$HOME/go}/bin/
Generatorの準備ができたら、実行ファイルと同じ場所でgenerator.ymlを作成する。
この設定で収集したいObjectを指定する。
※これは一例なので必要なObject名を書く。
# generator.yml
modules:
cisco:
walk:
- sysName
- sysUpTime
- cpmCPUTotal1minRev
- cpmCPUTotal5minRev
- ifIndex
- ifDescr
- ifName
- ifAlias
- ifAdminStatus
- ifOperStatus
- ifSpeed
- ifHCOutOctets
- ifHCInOctets
- ifInDiscards
- ifOutDiscards
- ifInErrors
- ifOutErrors
version: 2
retries: 3
timeout: 3s
lookups:
- source_indexes: [ifIndex]
lookup: ifDescr
auth:
community: hogehoge
// ファイル生成
./generator generate
// ディレクトリの中身確認
ls
generator generator.yml snmp.yml
snmp.ymlが生成されている。
このsnmp.ymlはSNMP Exporterで利用する。
SNMP Exporterのインストールと設定
以下のリポジトリのマニュアル通りに進めれば良い。
wget https://github.com/prometheus/snmp_exporter/releases/download/v0.20.0/snmp_exporter-0.20.0.linux-amd64.tar.gz
tar xvzf snmp_exporter-0.20.0.linux-amd64.tar.gz -C /opt/
cd /opt/snmp_exporter-0.20.0.linux-amd64
SNMP Exporterはsnmp.ymlから設定を読み込むのでsnmp.ymlを持ってくる。
mv snmp.yml snmp.yml.bak
mv ~/go/bin/snmp.yml ./
SNMP Exporterを実行する。
./snmp_exporter
systemdで実行する場合はPrometheus同様に作成する。
# vim /etc/systemd/system/snmp-exporter.service
[Unit]
Description=SNMP Exporter for Prometheus
[Service]
Type=simple
Restart=always
User=prometheus
ExecStart=/opt/snmp_exporter-0.20.0.linux-amd64/snmp_exporter --config.file=/opt/snmp_exporter-0.20.0.linux-amd64/snmp.yml
ExecReload=/bin/kill -HUP $MAINPID
TimeoutStopSec=20s
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable snmp-exporter
systemctl start snmp-exporter
ここまででインストールが完了。
動作を確認する。SNMP ExporterはPort 9116で動作する。
ブラウザからアクセスしてみると、以下のようなページが現れる。
TargetはSNMP先、Moduleはgenerator.ymlで設定した値。上の例ではcisco
Prometheusの設定編集
Prometheus.ymlを修正する。
targetsの中に取得したいRouterのIPを記述。
moduleはgenerator.ymlの設定値。その他は下記のとおりに入れる。
scrape_configs:
- job_name: 'snmp'
static_configs:
- targets:
- 192.168.0.1
- 192.168.0.2
metrics_path: /snmp
params:
module:
- cisco
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: localhost:9116
systemctl restart prometheus
Grafana
Grafanaの設定
Grafanaのインストールは割愛。
Data sourceとしてPrometheusを設定し、PromQLで値を抽出する。
問題なければ正常に値が取得できる。
Cisco
CiscoのSNMP設定
CiscoにはSNMPの設定を入れておく。
各自の環境に合わせて作成します。
snmp-server community hogehoge RO MY_NETWORK
ip access-list standard MY_NETWORK
permit 192.168.0.0 0.0.0.255
permit 192.168.1.0 0.0.0.255
動作確認
とりあえず問題なくSNMPの情報が取得できている。
あとはGrafanaで適当に表示できるようにすれば良い。
下のようにダッシュボードを作ってみた。ダサすぎたので整理しなきゃ。。