はじめに
先日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]#
なお、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でしか指定していませんが、ファイルの記載内容からget
やmetrics
を自動で作成してくれます。この辺りは手動で修正するよりは確かに便利だと感じました。