概要
ZabbixServerで取得できる値をAPI的に他のサーバーからも取得したいという案件で考えたことをメモ。
単純に要件を満たすだけなら、zabbix_getコマンドを使えば可能ではあるけど・・・
それぞれのサーバーからバラバラにzabbix_getコマンドが発行されると管理がしにくいので、
どうにか一元管理したいなぁ、と思ったりして。
そこで他サーバーから値を取得する用のアイテムをZabbixServer側に作成して、
そのアイテムを各サーバーからzabbix_getすることで、
管理はZabbixServerで一元化しつつ、各サーバーから柔軟に値を取得できるように構成する。
前提
- RHEL8
- Zabbix Server 4系
- Zabbix ServerにZabbix Agentを導入しておく
- Zabbix Serverにzabbix_getコマンドを導入しておく
- API的に実行するサーバーにzabbix_getコマンドwお導入しておく
流れ
Zabbix ServerにAPI実行用アイテムの作成
Zabbixサーバーでzabbix_getコマンドを実行するために、
新たに任意のキーを作成し、
それをzabbix_getコマンドを発行するためのシェルスクリプトに処理を投げるようにする
/etc/zabbix_agent/zabbix_agentd.confで下記を追加
UserParameter=api.zabbix_get[*],[スクリプトへのpath]/zabbix_get.sh "$1" "$2" "$3"
Zabbixのアイテムキーとしては、api.zabbix_get[*] として、
引数によって値を取得するサーバーや対象とするキーを設定する。
スクリプトに渡す引数については後述。
Zabbix Serverにzabbix_get実行用スクリプトを作成
以下のようにスクリプトを作成
#!/bin/sh -
export LANG=C
if [ -n "${3}" ]; then
key=${2}[${3}]
else
key=${2}
fi
zabbix_get -s ${1} -p 10050 -k $key
exit 0
- 第一引数:zabbix_getの宛先IPホスト
- 第二引数:取得するアイテムのキー
- 第三引数:取得するアイテムのキーに設定する引数
なぜ取得するキーと引数を別々にしているかというと、Zabbixのアイテムキーに渡す引数はネストができないから
多段階のパラメータ配列、例えば
[a,[b,[c,d]],e] のような複数レベルのパラメータ配列は許可されません。
例えば、api.zabbix_get[127.0.0.1,cpu.load[,avg]]みたいな書き方はできない
そのため、api.zabbix_get[対象ホスト,キー,引数] として渡して、
それぞれの値を使って、シェルスクリプト側でzabbix_getコマンドを生成する。
引数がないアイテムもあるので、第三引数が空でない場合のみキーに引数を付与している。
ZabbixServerのAgentへのアクセス許可を設定
他のサーバーからzabbix_getコマンドを使って、Zabbix ServerのAgentにアクセスできるようにする。
最低限、zabbix_agentd.confを下記に設定
Server=[zabbix_getコマンドを実行するサーバーのホスト名、IPアドレス(レンジも可)]
また、必要に応じて下記も確認すること
- サーバーのF/W
- ネットワーク側の制限など
不必要なサーバーからの実行はできないように設定すべき
試す
ここまで出来れば準備完了なので、任意のサーバーからzabbix_getコマンドを使って値を取得する。
# zabbix_get -s [zabbixサーバー] -p 10050 -k api.zabbix_get[対象ホスト,"agent.version"]
4.0.31
# zabbix_get -s [zabbixサーバー] -p 10050 -k api.zabbix_get[対象ホスト,"system.cpu.load","percpu,avg5"]
0.100000
できた。
終わり
構成だけみると、やりたいことに対して逆に複雑なものになってしまっている感じもするが・・・
個人的には、管理しにくい手段というのは往々にしてセキュリティリスクに繋がると考えてます。
管理しにくい→なぁなぁになっていく→放置→どこからどこに通信が許可されているのかわからん→リスクに繋がるかも...
一元管理してたら全部安心かというとそうでもないんですが、
限られた人員でうまく管理していくにはこういう方法もありなのかなぁ。