

Zabbix Agent2でオリジナルのプラグインを実装してみる
こんにちは。プラットフォーム技術部の近藤凌です。
Zabbixで標準テンプレートにない項目を監視したいとき、みなさまはどのような方法で設定していますか。
例えば、
- 外部チェック
- ユーザーパラメーター
- 3rd Party製のテンプレートをダウンロード
- Zabbix Agentのプラグインを作る
…などの方法が考えられると思います。
今回は監視項目を拡張する手段の1つ、Zabbix Agent2のプラグインを実装する方法を紹介します。
Zabbix Agent2ではZabbix Agentに比べてオリジナルプラグインの実装が簡単にできるようになりました。
Zabbix Agent2とは
Zabbix Agent2について、Zabbix Agentとの比較を交えながら紹介します。
Zabbix Agent2は新世代のZabbix Agentです。Zabbix Agentと互換性があり、同じアイテムキーが使用できます。
Zabbix Agent2では以下の点が改善されています。
- アクティブチェック機能の改善
- 「監視間隔のカスタマイズ」に対応し、指定した時間帯の監視間隔をデフォルトの監視間隔と分けたり、定期実行などが可能
- 複数アイテムの監視処理を並行実行可能
- 通信の改善
- Zabbix Agentと比較して、TCPの接続数を削減
またZabbix Agent2はGo言語で開発されており、プラグインもGo言語で開発できます。Zabbix AgentではプラグインをC言語で開発する必要があるのと比較して、手軽にオリジナルプラグインを作成できます。
なおZabbix AgentとZabbix Agent2の詳しい違いは以下をご覧ください。
プラグインの基本
プラグインの基本を説明します。
公式ドキュメント(英語版)は以下のリンクから参照できます。
なおこの章以降、「Agent」と表記されたものは「Zabbix Agent2」を指します。
プラグインの概要
プラグインとは、Zabbixのプラグインインターフェースを実装したGoパッケージです。
Zabbix6.0以降では、2種類のプラグインを使用できます。
- 組み込みプラグイン
- 作成したプラグインを含めてAgentをビルドして使用する方法。Agentのソースコードが必要。
- ローダブルプラグイン
- 作成したプラグインをAgentとは別に独立させてビルドし、Agentがロードすることで使用する方法。Agentのソースコードや、再ビルドは必要ない。
プラグインインターフェース
5つのインターフェースがプラグインに利用できます。
- plugin.Exporter
- plugin.Collector
- plugin.Configurator
- plugin.Runner
- plugin.Watcher
それぞれの特徴について、紹介します。
plugin.Exporter
Exporterはメトリクスのポーリングをおこない、取得された値やエラーなどを返却するインターフェースです。5つのインターフェースのうち、唯一同時にアクセスできるインターフェースです(ただし、他のインターフェースはプラグインがタスクを完了するまで他のメソッドを実行できないため、同時にアクセスする場合は考慮する必要があります)。
plugin.Collector
Collectorはプラグインが定期的にデータを収集する必要がある場面で使用されます。ただZabbix Serverへ値の送信はできないため、Exporterタスクを合わせて使用する必要があります。
plugin.Configurator
Agentの設定ファイルで設定したパラメーターを読み込む際に使用します。
plugin.Runner
Runnerを使用することで、プラグインが開始された際に初期化処理を実行し、停止されたときにその初期化処理を解除できます。例えば、プラグイン開始・終了時になにかしらの接続開始・終了をおこないたい場面などで使用できます。
plugin.Watcher
Agentはアイテムで定義された監視間隔をもとにタスクキューを管理するスケジューラーを内部で持っていますが、Watcherはそれを使用せずに監視データの収集をおこないます。トラップ方式のプラグインを作成する際に使用されます。
実装してみる
実際にプラグインを作成して、監視データを取得してみましょう。
今回は「組み込みプラグイン」方式でOSにログイン中のユーザーを取得するプラグインを実装してみます。
検証環境
検証した環境はこちらです。今回、Zabbix ServerとAgentは同じホストにインストールします。
- Red Hat Enterprise Linux release 9.1
- Zabbix Server 6.0.13
- Zabbix Agent2 6.0.13
- postgresql15
実装してみよう
OSの準備
Agentをインストールする前に、OSを準備しておきます。
SELinux無効化
今回はSELinuxを無効化した状態で検証をおこないます。「/etc/selinux/config」を開いてSELINUX=disabledを設定し、保存します。
# vi /etc/selinux/config
---------------
SELINUX=disabled
保存したら、設定反映のためリブートします。
# reboot
必要なパッケージのインストール
必要なパッケージをインストールします。
今回はAgentをソースコードからインストールするために、5つのパッケージを導入します。
- git
- gcc
- automake
- go-toolset
- pcre2-devel
# dnf install git
# dnf install gcc
# dnf install automake
# dnf install go-toolset
# dnf install pcre2-devel
Zabbixユーザー作成
Zabbixグループ・ユーザーを作成します(Zabbix Serverをパッケージからインストール済みの場合は不要です)。
# groupadd --system zabbix
# useradd --system -g zabbix -d /usr/lib/zabbix -s /sbin/nologin -c "Zabbix Monitoring System" zabbix
Agentのソースコードを取得・インストール
AgentのソースコードをGitから取得します。Gitのクローンを配置する適当なディレクトリを作成しておきましょう。今回は「/zabbix」というディレクトリ配下に配置します。
# mkdir /zabbix
# cd /zabbix
zabbixのGitをクローンします。
# git clone https://git.zabbix.com/scm/zbx/zabbix.git --branch 6.0.13 --depth 1 --single-branch zabbix-6.0.13
# cd zabbix-6.0.13/
Gitクローンできたら、Agentをインストールします。
# ./bootstrap.sh
# ./configure --enable-agent2 --with-libpcre2 --prefix=$(pwd)
以下が出力されると、Makefileが作成されています。
Configuration:
Detected OS: linux-gnu
Install path: /zabbix/zabbix-6.0.13
Compilation arch: linux
Compiler: cc
Compiler flags: -g -O2
Library-specific flags:
Enable server: no
Enable proxy: no
Enable agent: no
Enable agent 2: yes
Enable web service: no
Enable Java gateway: no
LDAP support: no
IPv6 support: no
***********************************************************
* Now run 'make install' *
* *
* Thank you for using Zabbix! *
* <http://www.zabbix.com> *
***********************************************************
makeコマンドでAgentをインストールしましょう。
# make -s install
Agentをsystemdに登録する
Agentをsystemdへ登録して、systemctlコマンドで起動できるようにします。
まずAgent用のユニットファイルを作成・エディタで開きます。
# vi /etc/systemd/system/zabbix-agent2.service
ユニットファイルに以下を貼り付け、保存します。
[Unit]
Description=Zabbix Agent 2
After=syslog.target
After=network.target
[Service]
Environment="CONFFILE=/zabbix/zabbix-6.0.13/etc/zabbix_agent2.conf"
Type=simple
Restart=on-failure
PIDFile=/tmp/zabbix_agent2.pid
KillMode=control-group
ExecStart=/zabbix/zabbix-6.0.13/sbin/zabbix_agent2
ExecStop=/bin/kill -SIGTERM $MAINPID
RestartSec=10s
User=zabbix
Group=zabbix
[Install]
WantedBy=multi-user.target
保存したらsystemdを再読み込みしましょう。
# systemctl --system daemon-reload
これでsystemctlコマンドでAgentを起動・停止・自動起動設定できるようになりました。
プラグインの作成
それではプラグイン(Goパッケージ)を作成します。
今回はExporterインターフェースを使って「ログイン中のユーザー情報」を取得するシンプルな「who」プラグインを作成してみました(今回は手軽な検証のため、エラーハンドリングはおこなっていません)。
package who
import (
"os/exec"
"git.zabbix.com/ap/plugin-support/plugin"
)
type Plugin struct {
plugin.Base
}
var impl Plugin
func (p *Plugin) Export(key string, params []string, ctx plugin.ContextProvider) (result interface{}, err error) {
who_result, err := exec.Command("who").Output()
if err != nil {
return nil, err
}
return string(who_result), nil
}
func init() {
plugin.RegisterMetrics(&impl, "Who", "who", "Return logged in users.")
}
「/zabbix/zabbix-6.0.13/src/go/plugins/」配下へプラグインごとにディレクトリを作成します。そのディレクトリに作成したプラグインを配置します。
# mkdir /zabbix/zabbix-6.0.13/src/go/plugins/who/
# vi /zabbix/zabbix-6.0.13/src/go/plugins/who/who.go
作成したプラグインを「 /zabbix/zabbix-6.0.13/src/go/plugins/who/who.go」に貼り付け、保存します。
プラグインの中身
ここでプラグインの中身を見てみましょう。
package who
パッケージ名を指定します。今回はwhoコマンドを実行するので「who」としています。
import (
"os/exec"
"git.zabbix.com/ap/plugin-support/plugin"
)
必要なパッケージをインポートします。今回は「os/exec」と「git.zabbix.com/ap/plugin-support/plugin」を使用しました。
type Plugin struct {
plugin.Base
}
var impl Plugin
ここで構造体「Plugin」の宣言と、「plugin.Base」の埋め込みをおこないます。これで、Exporterインターフェースなどが使用できます。
func (p *Plugin) Export(key string, params []string, ctx plugin.ContextProvider) (result interface{}, err error) {
who_result, err := exec.Command("who").Output()
if err != nil {
return nil, err
}
return string(who_result), nil
}
このブロックでwhoコマンドを実行し、結果を受け取っています。
func init() {
plugin.RegisterMetrics(&impl, "Who", "who", "Return logged in users.")
}
init()はAgent起動時に実行されます。ここで、アイテムキーの定義などをおこないます。パラメーターは以下の通りです。
- 第一引数:構造体「Plugin」の実装を指定します。
- 第二引数:プラグインの名前を指定します。名前は一意である必要があり、他のプラグインと競合しないようにします。
- 第三引数:アイテムキーを定義します。
- 第四引数:アイテムの説明を記載します。大文字で始まり、ピリオドで終わる必要があります。
Agentの再コンパイル
作成したプラグインを含めてAgentを再コンパイルします。再コンパイルする前に、Agentへ先ほど作成したGoパッケージの場所を知らせましょう。
先ほど作成したディレクトリを「/zabbix/zabbix-6.0.13/src/go/plugins/plugins_linux.go」に追記することで、Agentへプラグインの存在を知らせることができます。今回は末尾に「zabbix.com/plugins/who」を追加します。
# vi /zabbix/zabbix-6.0.13/src/go/plugins/plugins_linux.go
---------------
package plugins
import (
_ "zabbix.com/plugins/ceph"
_ "zabbix.com/plugins/docker"
// ...
_ "zabbix.com/plugins/zabbix/sync"
_ "zabbix.com/plugins/who"
もしこの段階でAgentが起動していたら、いったん停止しておきます。
# systemctl stop zabbix-agent2
停止できたら、再コンパイルしましょう。
# make -s install
コマンドベースで作成したプラグインが動作するか確認できます。ランタイムコントロールオプション「-t」にアイテムキーを指定して、Agentを実行します。
# /zabbix/zabbix-6.0.13/sbin/zabbix_agent2 -t who
who [s|root tty1 2023-04-02 13:22
admin01 pts/0 2023-04-02 16:16 (192.168.0.19)
最後に次項に備えてAgentを起動しておきます。
# systemctl start zabbix-agent2
Zabbixフロントエンド上から値確認
作成したプラグイン(アイテム)を実際にホストへ設定してみます。


値が取得できました。


まとめ
今回はZabbix Agent2でオリジナルのプラグインを実装してみました。
検証ではLinuxコマンドを実行するだけという非常に単純なスクリプトを作成しましたが、そのほかにも「外部サービスのAPIをたたいて値を取得する」といった使い方もでき、監視の幅が広がりそうです。
興味のある方はぜひお試しください。
Zabbixの導入・構築でお困りですか?
Zabbixの導入・構築でお困りですか?アークシステムは、Zabbix Japan LLCの公式認定パートナーとして、豊富な実績と高い技術力でお客様をサポートします。
アークシステムが選ばれる理由
- 豊富な経験: 多くのZabbix導入・構築プロジェクトを成功に導いた実績
- 確かな技術力: Zabbix認定資格を持つエンジニアが対応
- 独自のソリューション: 「監視定義テンプレート」を活用した迅速かつ高品質な実装
- 最新情報へのアクセス: Zabbix社との強力なパートナーシップを活かした最新技術対応
こんな方に最適です
- Zabbixの新規導入を検討している
- 現行システムの運用に課題を感じている
- 大規模環境での監視体制を整えたい
アークシステムでは、Zabbixの導入・運用に関する課題を解決し、最適な環境を構築します。どんなご相談でもお気軽にお問い合わせください!