ZabbixとOxidizedを連携させてみた

# はじめに
ネットワーク機器のコンフィグ管理ツール[Oxidized](https://github.com/ytti/oxidized)を使っていますが、管理対象となる機器の情報は[予め用意](https://github.com/ytti/oxidized/blob/master/docs/Sources.md)される、CSV・HTTP・SQLの何れかで定義しておく必要があります。
機器の情報を多重管理するのに嫌気が差してきたので、機器の情報をZabbixに登録して、OxidizedからZabbixに機器の情報を問い合わせることができれば幸せになれそうなのでやってみました。


# 環境

- Zabbix 6.2.3 on Docker
- Oxidized v0.28.0 on Docker

# やること

![g3285.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580974/66da07ba-3868-b0cd-8462-c1ed4b1c6702.png)

+ ZabbixのマクロにOxidizedが必要な情報(model、username、password、enableとか)を登録する。
+ OxidizedからZabbixのAPIをぶっ叩いて情報を取得


# やったこと

## Zabbixのマクロを定義するテンプレートを作成

[zbx_templates_oxidized.yml](https://github.com/bluekirin55/oxidized/blob/zabbix_support/lib/oxidized/source/zbx_templates_oxidized.yaml)

マクロ定義してるだけですが、こいつをZabbixにインポートしてください。
Oxidized Templateがインポートされるはずです。



## 対象になるホストにテンプレートを適用

インポートしたOxidized Templateを対象ホストに適用します。

## 対象になるホストにマクロを設定

Oxidizedで必要になる値をZabbixのマクロで設定します。

![usermacro.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580974/9e55664f-e748-2dc8-d9fa-d6a8a6e114e0.png)

|マクロ|設定する値|設定例|
|-----|-----|-----|
|{$OXIDIZED_MODEL}|OxidizedのModel|ios|
|{$OXIDIZED_USERNAME}|機器へのログインID|admin|
|{$OXIDIZED_PASSWORD}|機器へのログインパスワード|cisco|
|{$OXIDIZED_ENABLE}|特権ユーザのパスワード|c1sc0|

## OxidizedにZabbix連携モジュール(zabbix.rb)を配置

Oxidized用のZabbix連携モジュール[zabbix.rb](https://github.com/bluekirin55/oxidized/blob/zabbix_support/lib/oxidized/source/zabbix.rb)はOxidizedの[Source](https://github.com/ytti/oxidized/blob/master/docs/Sources.md)として実装してみました。初めてRuby書いた💦

こいつを、Oxidizedのconfig等が置かれている`~/.config/oxidized/sources`に配置します。

```console
# mkdir ~/.config/oxidized/sources
# cd ~/.config/oxidized/sources
# wget 
https://raw.githubusercontent.com/bluekirin55/oxidized/zabbix_support/lib/oxidized/source/zabbix.rb
```

## Oxidizedの設定

Oxidizedの`~/.config/oxidized/config`にZabbix連携モジュールの設定をします。
以下の内容をコピペして、最低限、url、user、passwordを環境に合わせて変更すればOKです。

```yaml
source:
  default: zabbix
  zabbix:
    url: "http://localhost/api_jsonrpc.php"
    user: "Admin"
    password: "zabbix"
    token: "HOGEHOGEHOGEHOGEHOEGEHOGEHOEHEOGHOEOHEOHGOEHGOHO"
    template: "Template Oxidized"
    map:
      username: "{$OXIDIZED_USERNAME}"
      password: "{$OXIDIZED_PASSWORD}"
      model: "{$OXIDIZED_MODEL}"
    vars_map:
      enable: "{$OXIDIZED_ENABLE}"
 ```

|項目|設定する値|設定例|
|-----|-----|-----|
|url|ZabbixのJSON RPCのURL|http://localhost/api_jsonrpc.php|
|user|Zabbixにログインする際のユーザID(tokenを指定する場合は不要)|Admin|
|password|Zabbixにログインする際のパスワード(tokenを指定する場合は不要)|zabbix|
|token|Zabbixで発行したAPIトークン(user/passwordを指定する場合は不要)|HOGEHOGEEOHOGHEOHOGEGE|
|template|Oxidizedでの管理対象の機器を識別するためのZabbixテンプレート名|Oxidized Template|
|map.model|OxidizedのModelが定義されたマクロ|{$OXIDIZED_MODEL}|
|map.username|機器へのログインIDが定義されたマクロ|{$OXIDIZED_USERNAME}|
|map.password|機器へのログインパスワードが定義されたマクロ|{$OXIDIZED_PASSWORD}|
|vars_map.enable|特権ユーザのパスワードが定義されたマクロ|{$OXIDIZED_ENABLE}|

ちなみ、ホスト名やIPアドレスはZabbixのホストやホストインタフェース情報から取ってきますので、特にmapする必要はありません。


## その他

特にありません。コレで設定完了です。


# 実行

Oxidizedを再起動すると、うまくZabbixと連携できているんじゃないでしょうか。


# 最後に

思いつきで始めて見たものの、初めてのZabbix APIやRubyと格闘しながらなんとか形になりました。
Oxidizedはよくできていて、ネットワーク機器の構成管理ツールとして充分使えるレベルになっています。またRubyで簡単に拡張できるのもいいですね。