Yamaha SWX3100を導入したのでZabbix監視用テンプレートを作成する  LLD itemprototypes 編

# ことの起こり
お家のスイッチングハブをマネージドタイプのL3SWに取り換えたので
豊富な管理機能を生かすべく、snmpサービスを起動してzabbixで監視する事にしました
snmp自体は基本マルチベンダプロトコルでして
zabbixにもネットワーク機器のsnmp OIDに対応した汎用テンプレートがあらかじめ用意されているので
これをそのまま適用しても良いのですが

- そのままだと無駄に監視項目が多い
- ベンダー独自の拡張OIDは含まれない(ベンダーによっては用意されていたりする)

ので、勉強がてら自分ではじめからテンプレートを作成してみる事にしました

# 調査から作成まで
では実際に始めてみます

## snmp機能の有効化
まずはスイッチでsnmpエージェント機能を起動します
コミュニティストリング(監視対象をグループで管理するための識別子みたいなものです)
をmonitorで定義し、roで読み取りのみ行えるようにします

SWX3100はマネージャ(監視サーバ)からスイッチに情報を問い合わせるポーリングのほか
イベントを引き金に自発的に情報を送信するトラップにも対応しています
enable trapでトラップを有効化し、ポートステートがup/down、err-disableの
いずれかの状態に切り替わった時にトラップを送信するようにします

最後にトラップ送信先ホストとバージョン、コミュニティを指定します

```configuration:SWX3100
SWX3100#show running-config snmp
!
snmp-server community monitor ro
snmp-server enable trap linkdown linkup errdisable
snmp-server host 192.168.1.252 traps version 2c monitor
!
```

## SNMPの検証
実際にポーリングとトラップが動作しているか
net-snmpのsnmp-walkコマンドを使って確認します

[SWX3100シリーズの技術資料はこちら](http://www.rtpro.yamaha.co.jp/SW/docs/swx3100/index.html)

インターフェース情報の場合、OID:1.3.6.1.2.1.2.2.1がエントリポイントに指定されており
インターフェースの説明の場合OID:1.3.6.1.2.1.2.2.1.2を指定し、
更にインターフェースのIDを追加する必要があります

snmpwalkを使うと、この時点で一覧形式として出力してくれます

```zsh:snmp_ifDescr
%snmpwalk -v 2c -c monitor 192.168.1.254 .1.3.6.1.2.1.2.2.1.2

IF-MIB::ifDescr.301 = STRING: vlan1
IF-MIB::ifDescr.400 = STRING: vlan100
IF-MIB::ifDescr.500 = STRING: vlan200
IF-MIB::ifDescr.4501 = STRING: sa1
IF-MIB::ifDescr.4603 = STRING: po3
IF-MIB::ifDescr.5001 = STRING: port1.1
IF-MIB::ifDescr.5002 = STRING: port1.2
IF-MIB::ifDescr.5003 = STRING: port1.3
IF-MIB::ifDescr.5004 = STRING: port1.4
IF-MIB::ifDescr.5005 = STRING: port1.5
IF-MIB::ifDescr.5006 = STRING: port1.6
IF-MIB::ifDescr.5007 = STRING: port1.7
IF-MIB::ifDescr.5008 = STRING: port1.8
IF-MIB::ifDescr.5009 = STRING: port1.9
IF-MIB::ifDescr.5010 = STRING: port1.10
```

各インターフェースの名前とデータ型、更にポートに割り当てられているIDの確認ができました

MIBにはベンダーが独自で定めたプライベートMIBが用意されている場合があり
このスイッチにも、OID:1.3.6.1.4.1.1182.3から始まる形で用意されているので
こちらも確認してみます

```zsh:snmp_PrivateMIB
%snmpwalk -v 2c -c monitor 192.168.1.254 .1.3.6.1.4.1.1182.3

SNMPv2-SMI::enterprises.1182.3.1.2.0 = INTEGER: 1057333248 #メモリサイズ
SNMPv2-SMI::enterprises.1182.3.1.3.0 = INTEGER: 536870912 #FlashROMサイズ
SNMPv2-SMI::enterprises.1182.3.1.4.0 = Gauge32: 12 #メモリ使用率
SNMPv2-SMI::enterprises.1182.3.1.5.0 = Gauge32: 1 #CPU使用率(5秒間平均)
SNMPv2-SMI::enterprises.1182.3.1.6.0 = Gauge32: 0 #CPU使用率(1分間平均)
SNMPv2-SMI::enterprises.1182.3.1.7.0 = Gauge32: 0 #CPU使用率(5分間平均)
SNMPv2-SMI::enterprises.1182.3.2.2.0 = STRING: "config0" #起動コンフィグ
SNMPv2-SMI::enterprises.1182.3.2.3.0 = STRING: "SWX3100-10G Rev.4.01.24" #ファームウェアVer
SNMPv2-SMI::enterprises.1182.3.2.4.0 = Timeticks: (679281650) 78 days, 14:53:36.50 #起動時間
SNMPv2-SMI::enterprises.1182.3.2.11.0 = INTEGER: 1 #リスタートフラグ、2をセットすると再起動
SNMPv2-SMI::enterprises.1182.3.5.2.0 = INTEGER: 2 #L2MS機能関連、主要な機能が非対応なので一部設定のみ
SNMPv2-SMI::enterprises.1182.3.6.1.1.2.1 = INTEGER: 1 #errDisableでのトラップ通知(1:enable)
SNMPv2-SMI::enterprises.1182.3.6.1.1.2.2 = INTEGER: 2
SNMPv2-SMI::enterprises.1182.3.6.1.1.3.1 = INTEGER: 2 #errDisableからの自動復旧設定(1:enable)
SNMPv2-SMI::enterprises.1182.3.6.1.1.3.2 = INTEGER: 1
SNMPv2-SMI::enterprises.1182.3.6.1.1.4.1 = INTEGER: 300 #errDisableからの復旧リトライ間隔
SNMPv2-SMI::enterprises.1182.3.6.1.1.4.2 = INTEGER: 300
SNMPv2-SMI::enterprises.1182.3.6.2.0 = INTEGER: 1 #ポートエラーのトラップ送出設定(1:enable)
SNMPv2-SMI::enterprises.1182.3.6.3.1.2.5001 = INTEGER: 1 #ポートの状態(1:normal)
SNMPv2-SMI::enterprises.1182.3.6.3.1.2.5002 = INTEGER: 1
SNMPv2-SMI::enterprises.1182.3.6.3.1.2.5003 = INTEGER: 1
SNMPv2-SMI::enterprises.1182.3.6.3.1.2.5004 = INTEGER: 1
SNMPv2-SMI::enterprises.1182.3.6.3.1.2.5005 = INTEGER: 1
SNMPv2-SMI::enterprises.1182.3.6.3.1.2.5006 = INTEGER: 1
SNMPv2-SMI::enterprises.1182.3.6.3.1.2.5007 = INTEGER: 1
SNMPv2-SMI::enterprises.1182.3.6.3.1.2.5008 = INTEGER: 1
SNMPv2-SMI::enterprises.1182.3.6.3.1.2.5009 = INTEGER: 1
SNMPv2-SMI::enterprises.1182.3.6.3.1.2.5010 = INTEGER: 1
SNMPv2-SMI::enterprises.1182.3.7.1.0 = INTEGER: 1
SNMPv2-SMI::enterprises.1182.3.7.2.0 = INTEGER: 2
SNMPv2-SMI::enterprises.1182.3.8.1.0 = INTEGER: 2
SNMPv2-SMI::enterprises.1182.3.9.1.0 = INTEGER: 2
SNMPv2-SMI::enterprises.1182.3.12.1.0 = INTEGER: 2
```
非対応の機能もあるので、リファレンスより少なくなっていますが
機器の負荷やポートの健全性をトラップで受信可能なことが分かりました

これらの情報を元に監視のための設定を作成します

## zabbix テンプレートの作成
それでは、取得した情報を元にYAMAHA Switch用のZabbixテンプレートを作成します
zabbixテンプレートは読んで字の如し、複数の機器に対応できるよう
監視項目の設定や項目の整形、グラフ作成のルール等を定めた汎用的な雛形です

### LLDの設定
snmpwalkで各ポートの識別番号が確認できたので
この番号を含めたOIDを監視対象として登録すれば一応監視設定は完了なのですが
それだと将来同社の16ポートモデルに買い替えた時等にまた増分の項目登録が必要になりますし
何より面倒くさいです

そこで監視対象項目を動的に検出、登録できるLLD(ローレベルディスカバリ)を設定します

zabbixGUIを開き、configuration>template>create template>discovery rule>create discovery ruleを選択

![2021-10-01 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011077/f30b1c77-19ac-fd3c-42e7-12ca2f329ce9.png)

必要な項目を埋めていきます
重要な部分はSNMP OIDの項目で、discovery[{#VALUE}, oid]の様式で記述することで
{#VALUE}というマクロにoidで取得したデータを格納することができるようになります
また、{#SNMPINDEX}というマクロが自動で追加され、その中に先程確認したインターフェースのIDが格納されます
下にあるテストボタンをクリックして、実際に値を取得してみましょう

```json:test_result
[
    {
        "{#SNMPINDEX}": "301",
        "{#IFDESCR}": "vlan1",
        "{#IFTYPE}": "136"
    },
    {
        "{#SNMPINDEX}": "400",
        "{#IFDESCR}": "vlan100",
        "{#IFTYPE}": "136"
    },
    {
        "{#SNMPINDEX}": "500",
        "{#IFDESCR}": "vlan200",
        "{#IFTYPE}": "136"
    },
    {
        "{#SNMPINDEX}": "4501",
        "{#IFDESCR}": "sa1",
        "{#IFTYPE}": "161"
    },
    {
        "{#SNMPINDEX}": "4603",
        "{#IFDESCR}": "po3",
        "{#IFTYPE}": "161"
    },
    {
        "{#SNMPINDEX}": "5001",
        "{#IFDESCR}": "port1.1",
        "{#IFTYPE}": "6"
    },
    {
        "{#SNMPINDEX}": "5002",
        "{#IFDESCR}": "port1.2",
        "{#IFTYPE}": "6"
    },
    {
        "{#SNMPINDEX}": "5003",
        "{#IFDESCR}": "port1.3",
        "{#IFTYPE}": "6"
    }
]
```
※長くなるので一部省略してあります
このマクロを適時呼び出すことにより、複数の項目を一つの雛形から生成できるようになります


### アイテムプロトタイプの設定
次は、監視項目であるアイテムの雛形を作成します
discoveryルールを設定したテンプレートのItem prototypesを選択し、create Item prototypesをクリックします

![2021-10-01 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011077/5d8a8cdc-b1de-7185-b13b-7ec43a7afc2b.png)
今回はOID:1.3.6.1.2.1.2.2.1.10で定義されている受信オクテット総数のアイテム雛形を作ってみます
最終的に個別のアイテムが複数登録されるため、NameとKeyは一意になるようマクロから値を取るようにします
OIDは1.3.6.1.2.1.2.2.1.10.としたあと各IFのIDが入るよう{#SNMPINDEX}の値が入るようにします
データ型と単位を指定して、これで準備完了です

このままテストを実行したいところですが、プロトタイプのテストからでは
discovery ruleの評価が行われないためそのままテストを実行してもエラーになってしまいます
![2021-10-01 (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011077/f151c96b-148b-e9ad-d1ea-1ecd3d235f0f.png)
テスト画面には利用するマクロに一時的にリテラルを振る機能があるので
Macrosの右側にあるフォームに、先程取得したSNMPINDEXのいずれかを入力することでテストを実行できます
無事取得が確認できたら設定を保存します

# 確認
それでは最後に設定が有効になっているか監視画面に戻って確認してみましょう
![2021-10-01 (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011077/1c75522b-d49f-33cd-da8b-bdf2f98bb2e8.png)
設定通りにアイテム名が設定され、監視データを取得できていますね
ひとまず大丈夫のようです

# 今回はここまで
ちょっと長くなってしまったので、今回はここまでとします
さらなるアイテムの追加や必要に応じてのフィルターやトリガー追加、グラフの生成等のタスクが残っているので
追々、記事を追加していこうと思います