TECHSTEP

ITインフラ関連の記事を公開してます。

SNMP Generatorの使い方 ~Net-SNMPとの組み合わせ~

はじめに

先日SNMP Exporterの使い方を簡単に紹介しましたが、その時に触れなかったSNMP Generator (SNMP Exporter Config Generator)について紹介します。実際に使ってみると変なところで詰まったりうまくいかなかったりしたため、私のような初心者エンジニアの方には参考になるかもしれません。

SNMP Generatorとは

SNMP Generatorとは、SNMP Exporterのコンフィグファイルであるsnmp.ymlの作成をサポートしてくれるツールです。snmp.ymlは行数も多く内容が複雑なため、手動での変更は推奨されていません。その代わりとして、SNMP Generatorの利用が推奨されています。 今回はNet-SNMPを導入したサーバに対しての設定を行うことを想定しています。

検証環境

検証環境は別記事と同じ環境です。詳細はそちらをご覧ください。 また、監視対象とするサーバにはすでにNet-SNMPが導入・起動されている状態です。Net-SNMPの導入についてはこちらの記事を参照ください。

  • OS: Centos 7
  • Kubernetes Version: 1.13.1
  • User: 以下の作業は全てrootユーザで実行しています。

  • 監視サーバ: k8s-master

  • 監視対象サーバ: k8s-node-1

snmpwalkでOIDを検出する

まずは監視対象サーバ (今回はk8s-node-1)からsnmpwalkを取れるか確認します。またその際に利用可能なOIDも確認します。 監視サーバ (今回はk8s-master)からsnmpwalkコマンドを実行します。snmpwalkコマンドを実行するにはnet-snmp-utilsがインストールされている必要があります。

# すべてのMIBから取得するOIDの件数を確認
[root@k8s-master ~]# snmpwalk -v 1 -c public <k8s-node-1のプライベートIPアドレス> | wc -l
4242
[root@k8s-master ~]# 

# 標準MIBのひとつであるsystemの件数を確認
[root@k8s-master ~]# snmpwalk -v 1 -c public <k8s-node-1のプライベートIPアドレス> system | wc -l
37
[root@k8s-master ~]# 

# systemの情報を表示
[root@k8s-master ~]# snmpwalk -v 1 -c public <k8s-node-1のプライベートIPアドレス> system
SNMPv2-MIB::sysDescr.0 = STRING: Linux k8s-node-1 3.10.0-957.1.3.el7.x86_64 #1 SMP Thu Nov 29 14:49:43 UTC 2018 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (10215266) 1 day, 4:22:32.66
SNMPv2-MIB::sysContact.0 = STRING: root <root@localhost>
SNMPv2-MIB::sysName.0 = STRING: k8s-node-1
SNMPv2-MIB::sysLocation.0 = STRING: Centos 7, Linux Server
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORID.1 = OID: SNMP-MPD-MIB::snmpMPDCompliance
SNMPv2-MIB::sysORID.2 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance
SNMPv2-MIB::sysORID.3 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance
SNMPv2-MIB::sysORID.4 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.5 = OID: TCP-MIB::tcpMIB
SNMPv2-MIB::sysORID.6 = OID: IP-MIB::ip
SNMPv2-MIB::sysORID.7 = OID: UDP-MIB::udpMIB
SNMPv2-MIB::sysORID.8 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup
SNMPv2-MIB::sysORID.9 = OID: SNMP-NOTIFICATION-MIB::snmpNotifyFullCompliance
SNMPv2-MIB::sysORID.10 = OID: NOTIFICATION-LOG-MIB::notificationLogMIB
SNMPv2-MIB::sysORDescr.1 = STRING: The MIB for Message Processing and Dispatching.
SNMPv2-MIB::sysORDescr.2 = STRING: The management information definitions for the SNMP User-based Security Model.
SNMPv2-MIB::sysORDescr.3 = STRING: The SNMP Management Architecture MIB.
SNMPv2-MIB::sysORDescr.4 = STRING: The MIB module for SNMPv2 entities
SNMPv2-MIB::sysORDescr.5 = STRING: The MIB module for managing TCP implementations
SNMPv2-MIB::sysORDescr.6 = STRING: The MIB module for managing IP and ICMP implementations
SNMPv2-MIB::sysORDescr.7 = STRING: The MIB module for managing UDP implementations
SNMPv2-MIB::sysORDescr.8 = STRING: View-based Access Control Model for SNMP.
SNMPv2-MIB::sysORDescr.9 = STRING: The MIB modules for managing SNMP Notification, plus filtering.
SNMPv2-MIB::sysORDescr.10 = STRING: The MIB module for logging SNMP Notifications.
SNMPv2-MIB::sysORUpTime.1 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORUpTime.2 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORUpTime.3 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORUpTime.4 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORUpTime.5 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORUpTime.6 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORUpTime.7 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORUpTime.8 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORUpTime.9 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORUpTime.10 = Timeticks: (3) 0:00:00.03
[root@k8s-master ~]# 

ではこの中から対象のOIDを決めます。ここでの注意点として、Generatorに利用できるものはOIDと説明されている対象だけです。上の一覧の中で「イコール」の右側で表示されているものがOIDの物しか、監視対象のwalkとして指定できません。

snmptranslateでOID番号を調べる

snmpwalkコマンドで監視対象とするOIDを指定できました。snmpwalkで表示されたOIDをSNMP Generatorで利用するには、番号に変換する必要があります。snmptranslateコマンドを使うことで、OID文字からOID番号へと変換したものがわかります。

ここでの注意点として、変換に使用するOID文字は、「= OID: <変換対象OID文字>」である事です。行頭にある方のOID文字を使用しても数字には変換されるのですが、その番号を使用してSNMP Generatorを実行してもエラーが吐かれて失敗します。

# OIDと記載のあるものだけを表示
[root@k8s-master ~]# snmpwalk -v 1 -c public <k8s-node-1のプライベートIPアドレス> system | grep OID
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
SNMPv2-MIB::sysORID.1 = OID: SNMP-MPD-MIB::snmpMPDCompliance
SNMPv2-MIB::sysORID.2 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance
SNMPv2-MIB::sysORID.3 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance
SNMPv2-MIB::sysORID.4 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.5 = OID: TCP-MIB::tcpMIB
SNMPv2-MIB::sysORID.6 = OID: IP-MIB::ip
SNMPv2-MIB::sysORID.7 = OID: UDP-MIB::udpMIB
SNMPv2-MIB::sysORID.8 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup
SNMPv2-MIB::sysORID.9 = OID: SNMP-NOTIFICATION-MIB::snmpNotifyFullCompliance
SNMPv2-MIB::sysORID.10 = OID: NOTIFICATION-LOG-MIB::notificationLogMIB
[root@k8s-master ~]# 

# SNMPv2-MIB::sysORID.1を選択し、OID番号を取得
[root@k8s-master generator]# snmptranslate -On SNMP-MPD-MIB::snmpMPDCompliance
.1.3.6.1.6.3.11.3.1.1

# こっちの番号は使えません
[root@k8s-master ~]# snmptranslate -On SNMPv2-MIB::sysORID.1
.1.3.6.1.2.1.1.9.1.2.1
[root@k8s-master ~]# 

generator.ymlの編集

続いてSNMP Generatorのコンフィグファイルに当たるgenerator.ymlの編集を行います。こちらの書き方は公式ページで紹介されているので、ご確認ください。

まずは必要なファイルをgithubのページから取得します。

git clone https://github.com/prometheus/snmp_exporter
cd snmp_exporter

generator.ymlには初期パラメータも記載されていますが、今回は新規ファイルを作成してそちらを使用します。

[root@k8s-master ~]# mv generator.yml generator.yml.org
[root@k8s-master ~]# touch generator.yml

今回のパラメータは以下のようになります。

[root@k8s-master generator]# cat generator.yml
modules:
  linux:
    version: 1
    walk: 
      - 1.3.6.1.6.3.11.3.1.1    # SNMP-MPD-MIB::snmpMPDCompliance
      - 1.3.6.1.6.3.15.2.1.1    # SNMP-USER-BASED-SM-MIB::usmMIBCompliance
      - 1.3.6.1.2.1.4.32.1.5.2.1.10.0.0.0.24    # IP-MIB::ipAddressPrefixOrigin.2.ipv4."10.0.0.0".24
    auth:
      community: public
[root@k8s-master generator]# 
  • modules: ファイルの先頭に記載する。
  • linux: モジュール名
  • version: SNMPのバージョンを指定
  • walk: OID番号
  • auth: 参照権限周りの設定を指定

なお、3つ目のOIDに関してはsystemという標準MIBには含まれず、以下のようにして特定しました。

# すべてのOIDの件数を確認
[root@k8s-master generator]# snmpwalk -v 1 -c public <k8s-node-1のプライベートIPアドレス> | grep OID | wc -l
568
[root@k8s-master generator]#

# 先頭20行を表示
[root@k8s-master generator]# snmpwalk -v 1 -c public <k8s-node-1のプライベートIPアドレス> | grep OID | head -20
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
SNMPv2-MIB::sysORID.1 = OID: SNMP-MPD-MIB::snmpMPDCompliance
SNMPv2-MIB::sysORID.2 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance
SNMPv2-MIB::sysORID.3 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance
SNMPv2-MIB::sysORID.4 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.5 = OID: TCP-MIB::tcpMIB
SNMPv2-MIB::sysORID.6 = OID: IP-MIB::ip
SNMPv2-MIB::sysORID.7 = OID: UDP-MIB::udpMIB
SNMPv2-MIB::sysORID.8 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup
SNMPv2-MIB::sysORID.9 = OID: SNMP-NOTIFICATION-MIB::snmpNotifyFullCompliance
SNMPv2-MIB::sysORID.10 = OID: NOTIFICATION-LOG-MIB::notificationLogMIB
IF-MIB::ifSpecific.1 = OID: SNMPv2-SMI::zeroDotZero
IF-MIB::ifSpecific.2 = OID: SNMPv2-SMI::zeroDotZero
IF-MIB::ifSpecific.3 = OID: SNMPv2-SMI::zeroDotZero
IF-MIB::ifSpecific.4 = OID: SNMPv2-SMI::zeroDotZero
IP-MIB::ip.21.1.13.0.0.0.0 = OID: SNMPv2-SMI::zeroDotZero
IP-MIB::ip.21.1.13.10.0.0.0 = OID: SNMPv2-SMI::zeroDotZero
IP-MIB::ip.21.1.13.172.17.0.0 = OID: SNMPv2-SMI::zeroDotZero
IP-MIB::ip.21.1.13.192.168.0.0 = OID: SNMPv2-SMI::zeroDotZero
IP-MIB::ip.21.1.13.192.168.1.0 = OID: SNMPv2-SMI::zeroDotZero
[root@k8s-master generator]# 

# zeroDotZeroと書かれたOIDを番号に変換
[root@k8s-master generator]# snmptranslate -On SNMPv2-SMI::zeroDotZero
.0.0
[root@k8s-master generator]#

# zeroDotZeroは役に立たなそうなので、それを除いた件数を確認
[root@k8s-master generator]# snmpwalk -v 1 -c public <k8s-node-1のプライベートIPアドレス> | grep OID | grep -v zeroDotZero | wc -l
69
[root@k8s-master generator]#

# 先頭20行を表示
[root@k8s-master generator]# snmpwalk -v 1 -c public <k8s-node-1のプライベートIPアドレス> | grep OID | grep -v zeroDotZero | head -20
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
SNMPv2-MIB::sysORID.1 = OID: SNMP-MPD-MIB::snmpMPDCompliance
SNMPv2-MIB::sysORID.2 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance
SNMPv2-MIB::sysORID.3 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance
SNMPv2-MIB::sysORID.4 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.5 = OID: TCP-MIB::tcpMIB
SNMPv2-MIB::sysORID.6 = OID: IP-MIB::ip
SNMPv2-MIB::sysORID.7 = OID: UDP-MIB::udpMIB
SNMPv2-MIB::sysORID.8 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup
SNMPv2-MIB::sysORID.9 = OID: SNMP-NOTIFICATION-MIB::snmpNotifyFullCompliance
SNMPv2-MIB::sysORID.10 = OID: NOTIFICATION-LOG-MIB::notificationLogMIB
IP-MIB::ipAddressPrefix.ipv4."<k8s-node-1のプライベートIPアドレス>" = OID: IP-MIB::ipAddressPrefixOrigin.2.ipv4."10.0.0.0".24
IP-MIB::ipAddressPrefix.ipv4."10.0.0.255" = OID: IP-MIB::ipAddressPrefixOrigin.2.ipv4."10.0.0.0".24
IP-MIB::ipAddressPrefix.ipv4."127.0.0.1" = OID: IP-MIB::ipAddressPrefixOrigin.1.ipv4."127.0.0.0".8
IP-MIB::ipAddressPrefix.ipv4."172.17.0.1" = OID: IP-MIB::ipAddressPrefixOrigin.3.ipv4."172.17.0.0".16
IP-MIB::ipAddressPrefix.ipv4."192.168.1.1" = OID: IP-MIB::ipAddressPrefixOrigin.4.ipv4."192.168.1.1".32
IP-MIB::ipAddressPrefix.ipv6."00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:01" = OID: IP-MIB::ipAddressPrefixOrigin.1.ipv6."00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:01".128
IP-MIB::ipAddressPrefix.ipv6."fe:80:00:00:00:00:00:00:00:42:f4:ff:fe:bc:30:8f" = OID: IP-MIB::ipAddressPrefixOrigin.3.ipv6."fe:80:00:00:00:00:00:00:00:00:00:00:00:00:00:00".64
IP-MIB::ipAddressPrefix.ipv6."fe:80:00:00:00:00:00:00:08:bd:70:ff:fe:4b:b1:b6" = OID: IP-MIB::ipAddressPrefixOrigin.2.ipv6."fe:80:00:00:00:00:00:00:00:00:00:00:00:00:00:00".64
HOST-RESOURCES-MIB::hrStorageType.1 = OID: HOST-RESOURCES-TYPES::hrStorageRam
[root@k8s-master generator]# 

# ひとつを選択して番号に変換
[root@k8s-master generator]# snmptranslate -On IP-MIB::ipAddressPrefixOrigin.2.ipv4."10.0.0.0".24
.1.3.6.1.2.1.4.32.1.5.2.1.10.0.0.0.24
[root@k8s-master generator]# 

SNMP Generatorの起動方法

ようやくSNMP Generatorを起動してsnmp.ymlの生成を行います。SNMP Generatorを起動するには、ソースからビルドして起動する方法と、Dockerイメージを作成して起動する方法があります。

今回は手軽にできるDockerからの起動を行いました。起動時のコマンドは公式のgithubページに書かれているので、そのまま実行します。

# Dockerfileのあるディレクトリで実行
# Dockerイメージを作成。最後のカンマを忘れない
docker build -t snmp-generator .

# dockerプロセスを立ち上げてgeneratorコマンドを実行
docker run -ti \
>   -v $HOME/.snmp/mibs:/root/.snmp/mibs \
>   -v $PWD/generator.yml:/opt/generator.yml:ro \
>   -v $PWD/out/:/opt/ \
>   snmp-generator generate

ファイルの生成が成功すると、以下のようなログが表示されます。

INFO[0000] Loading MIBs from $HOME/.snmp/mibs:/usr/share/snmp/mibs:/usr/share/snmp/mibs/iana:/usr/share/snmp/mibs/ietf:/usr/share/mibs/site:/usr/share/snmp/mibs:/usr/share/mibs/iana:/usr/share/mibs/ietf:/usr/share/mibs/netsnmp  source="net_snmp.go:136"
WARN[0000] NetSNMP reported 2 parse errors               source="main.go:103"
INFO[0000] Generating config for module linux            source="main.go:49"
INFO[0000] Generated 1 metrics for module linux          source="main.go:60"
INFO[0000] Config written to /opt/snmp.yml               source="main.go:85"

私が今回検証して一番多かったエラーログは以下のようになります。

INFO[0000] Loading MIBs from $HOME/.snmp/mibs:/usr/share/snmp/mibs:/usr/share/snmp/mibs/iana:/usr/share/snmp/mibs/ietf:/usr/share/mibs/site:/usr/share/snmp/mibs:/usr/share/mibs/iana:/usr/share/mibs/ietf:/usr/share/mibs/netsnmp  source="net_snmp.go:136"
WARN[0000] NetSNMP reported 2 parse errors               source="main.go:103"
INFO[0000] Generating config for module linux            source="main.go:49"
FATA[0000] Cannot find oid '1.3.6.1.2.1.1.2.0' to walk   source="tree.go:288"

OID番号を誤って指定しているとこのようなエラーメッセージが表示されます。

また、OID番号は$HOME/.snmp/mibs/usr/share/snmp/mibsに格納された<各種MIB>.txtを参照しています。このファイルがなかったりdocker run -v <mountするディレクトリ>の指定先が間違っていたりすると失敗します。

失敗した場合は以下のようなコマンドを実行し、dockerプロセスとdockerイメージを削除し、docker buildから再実行します。

# dockerプロセスを特定
[root@k8s-master generator]# docker ps -a | grep snmp
4165385557af        snmp-generator         "/go/bin/generator..."   6 minutes ago       Exited (0) 6 minutes ago                       zealous_babbage
[root@k8s-master generator]# 

# dockerプロセスを削除
[root@k8s-master generator]# docker rm 4165385557af
4165385557af
[root@k8s-master generator]# 

# dockerイメージを特定
[root@k8s-master generator]# docker images | grep snmp
snmp-generator                       latest              034de65eca42        6 minutes ago       844 MB
[root@k8s-master generator]#

# dockerイメージを削除
[root@k8s-master generator]# docker rmi 034de65eca42
Untagged: snmp-generator:latest
Deleted: sha256:034de65eca42f145833556893c568caea2fa58cfb15a03113499761532f008f3
Deleted: sha256:284cc74db037a5d53c210d9a35a9d2111878067eb0593e119def3c45017927f5
Deleted: sha256:5679c4ed5af3d2cf34649d6a7ecba9b6dc0efe767cc4256c37abec587b28cbf8
Deleted: sha256:9f0466e7cec202a951877ed33d2c42d1f54f8d26eb576829066df47fa574e79a
Deleted: sha256:ac2557735c6cdad47ee98d6263f1a9aa273ff7a2fd69faf07d90a39cb4c46e03
Deleted: sha256:248e0d191a9cb5ecdd9748fcf14d0a161481b438989689cff85a39365e877e39
Deleted: sha256:28da4349bd455cf8d3ce3b4728318d340c064e0a9cb5774a756e9dafe9e11024
Deleted: sha256:f7475813f654c4ecc7e465b9fc17ac95da4a24841eee428d7cff57f07420285f
Deleted: sha256:ce67a0c42ff7d8c869e748707c2026f08871d1427d81282d27e3090c6d7dbaa0
Deleted: sha256:6b98e303ff15e3784a0c955977f1fc3b44e49fa96f3fb1aa4f4a76bfa08d3e84
Deleted: sha256:ac76572bd35c63bafe1267b1abc05e20a9c915bb755b6d41843ad3f699add3ec
[root@k8s-master generator]# 

snmp.ymlの確認

生成されたsnmp.ymlを確認してみます。generatorコマンドが実行されると、実行したディレクトリにoutディレクトリが作成され、その中にsnmp.ymlファイルが格納されます。

[root@k8s-master generator]# cat out/snmp.yml 
# WARNING: This file was auto-generated using snmp_exporter generator, manual changes will be lost.
linux:
  walk:
  - 1.3.6.1.6.3.11.3.1.1
  - 1.3.6.1.6.3.15.2.1.1
  get:
  - 1.3.6.1.2.1.4.32.1.5.2.1.10.0.0.0.24
  metrics:
  - name: ipAddressPrefixOrigin
    oid: 1.3.6.1.2.1.4.32.1.5
    type: gauge
    help: The origin of this prefix. - 1.3.6.1.2.1.4.32.1.5
    indexes:
    - labelname: ipAddressPrefixIfIndex
      type: gauge
    - labelname: ipAddressPrefixPrefix
      type: InetAddress
    - labelname: ipAddressPrefixLength
      type: gauge
  version: 1
  auth:
    community: public
[root@k8s-master generator]#

generator.ymlではwalkでしか指定していませんが、ファイルの記載内容からgetmetricsを自動で作成してくれます。この辺りは手動で修正するよりは確かに便利だと感じました。

参照リンク

SNMPの基本的なこと

SNMP Exporter の generatorを使う

prometheusのsnmp.ymlを作ってくれるgeneratorを動かす

generator: Cannot find oid 'laLoadInt' to walk