Zabbixメモ

## 目的
* 新規テンプレートを作成した際のメモ
* ArubaInstantOn 1830 のI/Fステータスやトラフィック情報をSNMPにて取得
* テンプレートやディスカバリルールを作ってみる
* ディスカバリにて依存アイテムを使ってみる

- - -

## 実践
### テンプレートの新規作成

<table>
<caption>テンプレート設定例</caption>
<thead>
<tr><th>項目名</th><th>値</th></tr>
</thead>
<tr><td>テンプレート名</td><td>InstantOn1830</td></tr>
<tr><td>表示名</td><td>InstantOn1830</td></tr>
<tr><td>テンプレート</td><td>空欄</td></tr>
<tr><td>グループ</td><td>Network</td></tr>
<tr><td>説明</td><td>空欄</td></tr>
</table>

### 値のマッピング
SNMPのインタフェースステータス用に設定

:::note info
参考情報
https://datatracker.ietf.org/doc/html/rfc2863

<details><summary>ifOperStatus定義抜粋</summary>

```
ifOperStatus OBJECT-TYPE
    SYNTAX  INTEGER {
                up(1),        -- ready to pass packets
                down(2),
                testing(3),   -- in some test mode
                unknown(4),   -- status can not be determined
                              -- for some reason.
                dormant(5),
                notPresent(6),    -- some component is missing
                lowerLayerDown(7) -- down due to state of
                                  -- lower-layer interface(s)
            }
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
            "The current operational state of the interface.  The
            testing(3) state indicates that no operational packets can
            be passed.  If ifAdminStatus is down(2) then ifOperStatus
            should be down(2).  If ifAdminStatus is changed to up(1)
            then ifOperStatus should change to up(1) if the interface is
            ready to transmit and receive network traffic; it should
            change to dormant(5) if the interface is waiting for
            external actions (such as a serial line waiting for an
            incoming connection); it should remain in the down(2) state
            if and only if there is a fault that prevents it from going
            to the up(1) state; it should remain in the notPresent(6)
            state if the interface has missing (typically, hardware)
            components."
    ::= { ifEntry 8 }

```

```
    
</details>

    
<table>
<caption>Interface Status</caption>
<thead>
<tr><th>タイプ</th><th>値</th><th>マッピング文字列</th></tr>
</thead>
<tr><td>等しい</td><td>1</td><td>up</td></tr>
<tr><td>等しい</td><td>2</td><td>down</td></tr>
<tr><td>等しい</td><td>3</td><td>testing</td></tr>
<tr><td>等しい</td><td>4</td><td>unknown</td></tr>
<tr><td>等しい</td><td>5</td><td>dormant</td></tr>
<tr><td>等しい</td><td>6</td><td>notPresent</td></tr>
<tr><td>等しい</td><td>7</td><td>lowerLayerDown</td></tr>
</table>

- - -

### テンプレートアイテム の作成
実際に監視を行う際のマスターアイテムを登録

:::note warn
ディスカバリのアイテムプロトタイプではなく、テンプレートのアイテムとして登録します。本アイテムをマスターアイテムとして依存アイテムの作成を行います。
:::

<table>
<caption>監視用マスターアイテム</caption>
<thead>
<tr><th>項目名</th><th>値</th></tr>
</thead>
<tr><td>名前</td><td>master.if</td></tr>
<tr><td>タイプ</td><td>SNMPエージェント</td></tr>
<tr><td>キー</td><td>master.if</td></tr>
<tr><td>データ型</td><td>テキスト</td></tr>
<tr><td>SNMP OID</td><td>discovery[{#STATUS},ifOperStatus,{#IFIN},ifHCInOctets,{#IFOUT},ifHCOutOctets,{#IFNAME},ifName]</td></tr>
<tr><td>監視間隔</td><td>3m</td></tr>
</table>

:::note info
Zabbixでは、SNMP結果をマスターアイテムとする場合、結果をJSON形式のテキストとして処理されるっぽい。
{#STATUS｝などのラベルはJSONファイル内の項目名としても用いられます。
:::

<table>
<caption>保存前処理</caption>
<thead>
<tr><th>名前</th><th colspan=2>パラメータ</th></tr>
</thead>
<tr><td>置換</td><td>{#STATUS}</td><td>status</td></tr>
<tr><td>置換</td><td>{#IFIN}</td><td>in</td></tr>
<tr><td>置換</td><td>{#IFOUT}</td><td>out</td></tr>
<tr><td>置換</td><td>{#IFNAME}</td><td>name</td></tr>
</table>

:::note info
{#STATUS｝などの項目名では、文字列とマクロの混同を防止すること。及び、JSON Path指定時にシンプルな記載とするため「置換」を行っています。
:::

- - -

### ディスカバリルール の作成
#### やりたいことを整理する
* 設定されているI/Fに対し、以下の情報を取得する
    * インタフェースのステータス（Up/Downなど）
    * Inboundのトラフィック（Mbps）取得
    * Outboundのトラフィック（Mbps）取得
* 取得対象のインタフェースは？
    * ハードウェアとして実装されているインタフェース
    * TRKポートとして有効化されているインタフェース
* 取得対象外のインタフェースとは？
    * 設定していないTRKポート
    * VLANなどの仮想インタフェース

#### ディスカバリの計画
* ifTypeにて、Ethernet又はTRK（LAG）インタフェースを対象とする
* 上記タイプのうち、ifOperStatusにて「notPresent」は除外する

:::note info
参考情報
https://www.iana.org/assignments/ianaiftype-mib/ianaiftype-mib

<details><summary>ifType（IANAifType）定義抜粋</summary>

```
ethernetCsmacd(6), -- for all ethernet-like interfaces,
                   -- regardless of speed, as per RFC3635
ieee8023adLag (161),  -- IEEE 802.3ad Link Aggregate
```
:::
- - -

#### 実際に作成してみる

<table>
<caption>ディスカバリルール</caption>
<thead>
<tr><th>項目名</th><th>値</th></tr>
</thead>
<tr><td>名前</td><td>net.if.discovery</td></tr>
<tr><td>タイプ</td><td>SNMPエージェント</td></tr>
<tr><td>キー</td><td>net.if.discovery</td></tr>
<tr><td>SNMP OID</td><td>discovery[{#ALIAS},ifAlias,{#NAME},ifName,{#STATUS},ifOperStatus,{#TYPE},ifType]</td></tr>
<tr><td>監視間隔</td><td>6h</td></tr>
</table>

:::note info
本項目は、ディスカバリ及び各種プロトタイプで使用したい値を収集します。
実際の監視で用いるSNMP OIDは、前述のマスターアイテムとなります。
:::

<table>
<caption>フィルター</caption>
<thead>
<tr><th>ラベルマクロ</th><th>条件</th><th>正規表現</th></tr>
</thead>
<tr><td>{#STATUS}</td><td>一致する</td><td>^[^6]$</td></tr>
<tr><td>{#TYPE}</td><td>一致する</td><td>^(6|161)$</td></tr>
</table>

- - -

#### アイテムのプロトタイプの作成

<table>
<caption>アイテムのプロトタイプ</caption>
<thead>
<tr><th>項目名</th><th>値</th></tr>
</thead>
<tr><td>名前</td><td>Interface {#NAME}({#ALIAS}):in</td></tr>
<tr><td>タイプ</td><td>依存アイテム</td></tr>
<tr><td>キー</td><td>net.if.in[{#SNMPINDEX}]</td></tr>
<tr><td>データ型</td><td>数値（浮動小数）</td></tr>
<tr><td>マスターアイテム</td><td>InstantOn1830: master.if</td></tr>
<tr><td>単位</td><td>Mbps</td></tr>
</table>

:::note info
{#NAME}や{#ALIAS}は、ディスカバリルールのSNMP OIDで定義したマクロとなり、各種プロトタイプでの利用可能です。
{#SNMPINDEX} は、暗黙で定義されるマクロとなり、キーではユーザ定義したマクロは利用不可のようです。
:::


以上。