1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ZabbixServerで取得した値をAPI的に他のサーバーから取得したいという件

Posted at

概要

ZabbixServerで取得できる値をAPI的に他のサーバーからも取得したいという案件で考えたことをメモ。

単純に要件を満たすだけなら、zabbix_getコマンドを使えば可能ではあるけど・・・
それぞれのサーバーからバラバラにzabbix_getコマンドが発行されると管理がしにくいので、
どうにか一元管理したいなぁ、と思ったりして。

image.png

そこで他サーバーから値を取得する用のアイテムをZabbixServer側に作成して、
そのアイテムを各サーバーからzabbix_getすることで、
管理はZabbixServerで一元化しつつ、各サーバーから柔軟に値を取得できるように構成する。

image.png

前提

  • 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で下記を追加

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を下記に設定

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

できた。

終わり

構成だけみると、やりたいことに対して逆に複雑なものになってしまっている感じもするが・・・
個人的には、管理しにくい手段というのは往々にしてセキュリティリスクに繋がると考えてます。

管理しにくい→なぁなぁになっていく→放置→どこからどこに通信が許可されているのかわからん→リスクに繋がるかも...

一元管理してたら全部安心かというとそうでもないんですが、
限られた人員でうまく管理していくにはこういう方法もありなのかなぁ。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?