Zabbix Agent2でオリジナルのプラグインを実装してみる

Zabbix

こんにちは。プラットフォーム技術部の近藤凌です。

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の導入・運用に関する課題を解決し、最適な環境を構築します。どんなご相談でもお気軽にお問い合わせください!

  • Zabbix Enterprise Appliance
  • 低コスト・短納期で提供するまるごとおまかせZabbix