モジュールの作成 (チュートリアル)

これは、シンプルなZabbixフロントエンドモジュールを作成する方法を示すステップバイステップのチュートリアルです。 このモジュールのすべてのファイルをZIPアーカイブとしてダウンロードできます: MyAddress.zip

作成するもの

このチュートリアルでは、まず新しい My Address メニューセクションを追加するWebインターフェースモジュールを作成し、 次にそれを https://api.seeip.org にHTTPリクエストを送信して、その応答、つまりあなたのコンピュータのIPアドレスを、 新しく作成した My Address メニューセクション内の新しいページに表示する、より高度なWebインターフェースモジュールへと変換します。 完成したモジュールは次のようになります。

パート I - 新しいメニューセクション

Zabbix Webインターフェースに空のモジュールを追加する
  1. Zabbix Webインターフェースのインストール先の modules ディレクトリに MyAddress ディレクトリを作成します(例: zabbix/ui/modules)。

  2. 基本的なモジュールメタデータを含む manifest.json ファイルを作成します(サポートされている parameters の説明を参照してください)。

ui/modules/MyAddress/manifest.json

{
    "manifest_version": 2.0,
    "id": "my-address",
    "name": "My IP Address",
    "version": "1.0",
    "namespace": "MyAddress",
    "description": "My External IP Address."
}
  1. Zabbix Webインターフェースで、Administration → General → Modules セクションに移動し、Scan directory ボタンをクリックします。

  1. 一覧から新しいモジュール My IP Address を見つけ、"Disabled" ハイパーリンクをクリックして、モジュールのステータスを "Disabled" から "Enabled" に変更します(モジュールが一覧に表示されない場合は、troubleshooting セクションを参照してください)。

これでモジュールは Webインターフェースに登録されました。ただし、まだモジュールの機能を定義していないため、表示はされません。 モジュールディレクトリにコンテンツを追加すると、ページを更新した際に Zabbix Webインターフェースで変更がすぐに反映されます。

メニューセクションを作成する
  1. MyAddress ディレクトリに Module.php ファイルを作成します。

このファイルは、デフォルトの CModule クラスを継承する新しい Module クラスを実装します。 Module クラスは、メインメニューに新しい My Address メニューセクションを追加します。

setAction() メソッドは、メニューセクションをクリックしたときに実行するアクションを指定します。 まずは、あらかじめ定義されている userprofile.edit アクションを使用できます。これにより User profile ページが開きます。 このチュートリアルの part III では、カスタムアクションの作成方法を学びます。

ui/modules/MyAddress/Module.php

<?php

namespace Modules\MyAddress;

use Zabbix\Core\CModule,
    APP,
    CMenuItem;

class Module extends CModule {

    public function init(): void {
        APP::Component()->get('menu.main')
            ->add((new CMenuItem(_('My Address')))
            ->setAction('userprofile.edit'));
    }
}

'userprofile.edit' は他のアクションに置き換えることができます。たとえば、'charts.view'(カスタムグラフを開く)、'problems.view'Monitoring → Problems を開く)、'report.status'System information レポートを開く)などです。

  1. Zabbix Webインターフェースを更新します。これで、Zabbix のメインメニューの下部に新しい My Address セクションが表示されます。 My Address をクリックすると、User profile ページが開きます。

パート II - メニューセクションの位置変更

このパートでは、My Addressメニューセクションを監視データセクションに移動しし、そこにネストされたメニューを追加します。 その結果、ユーザーは監視データ → マイ アドレスメニューセクションから2つのサブメニューページにアクセスできるようになります。

  1. Module.phpファイルを開いて編集します。

ui/modules/MyAddress/Module.php

<?php

namespace Modules\MyAddress;

use Zabbix\Core\CModule,
    APP,
    CMenuItem;

class Module extends CModule {

    public function init(): void {
        APP::Component()->get('menu.main')
            ->findOrAdd(_('Monitoring'))
            ->getSubmenu()
            ->insertAfter(_('Discovery'),
                (new CMenuItem(_('My Address')))->setAction('userprofile.edit')
            );
    }
}
  1. Zabbixフロントエンドを更新します。 監視データメニューセクションを展開し、My addressセクションがディスカバリセクションの下にあることを確認します。

  1. ネストされたページをMy Addressメニューセクションに追加するには、Module.phpファイルを再度開いて編集します。

このステップでは、2つのサブセクションが作成されます。

  • 次の手順で定義する新しい'my.address'アクションを実行するExternal IP
  • User profileページを開くための事前定義された'userprofile.edit'アクションを実行するUser profile

ネストされたメニューの場合は、前の手順で使用したクラスに加えてCMenuクラスを使用する必要があることに注意してください。

ui/modules/MyAddress/Module.php

<?php

namespace Modules\MyAddress;

use Zabbix\Core\CModule,
    APP,
    CMenu,
    CMenuItem;

class Module extends CModule {

    public function init(): void {
        APP::Component()->get('menu.main')
            ->findOrAdd(_('Monitoring'))
            ->getSubmenu()
            ->insertAfter(_('Discovery'),
                (new CMenuItem(_('My Address')))->setSubMenu(
                    new CMenu([
                        (new CMenuItem(_('External IP')))->setAction('my.address'),
                        (new CMenuItem(_('User profile')))->setAction('userprofile.edit')
                    ])
                )
            );
    }
}
  1. Zabbixフロントエンドを更新します。My addressメニューセクションに、External IPUser profileの2ページからなる第3レベルのメニューが含まれていることを確認します。

パート III - モジュールアクション

アクションは 2 つのファイルで実装されます - actions/MyAddress.phpviews/my.address.php です。
actions/MyAddress.php ファイルはビジネスロジックの実装を担当し、views/my.address.php ファイルはビューを担当します。

  1. MyAddress ディレクトリ内に actions ディレクトリを作成します。

  2. actions ディレクトリ内に MyAddress.php ファイルを作成します。

アクションロジックは MyAddress クラスで定義されます。
このアクションクラスは init(), checkInput(), checkPermissions(), doAction() の 4 つの関数を実装します。
Zabbix Webインターフェースは、アクションが要求されたときに doAction() 関数を呼び出します。
この関数は、モジュールのビジネスロジックを担当します。

データは連想配列として整理する必要があります。
配列は多次元にすることができ、ビューで想定される任意のデータを含めることができます。

ui/modules/MyAddress/actions/MyAddress.php

<?php

namespace Modules\MyAddress\Actions;

use CController,
    CControllerResponseData;

class MyAddress extends CController {

    public function init(): void {
        $this->disableCsrfValidation();
    }

    protected function checkInput(): bool {
        return true;
    }

    protected function checkPermissions(): bool {
        return true;
    }

    protected function doAction(): void {
        $data = ['my-ip' => file_get_contents("https://api.seeip.org")];
        $response = new CControllerResponseData($data);
        $this->setResponse($response);
    }
}
  1. MyAddress ディレクトリ内に新しい views ディレクトリを作成します。

  2. views ディレクトリ内に my.address.php ファイルを作成し、モジュールビューを定義します。

変数 $data は、特に定義しなくてもビュー内で利用できることに注意してください。
フレームワークが連想配列を自動的にビューへ渡します。

ui/modules/MyAddress/views/my.address.php

<?php

(new CHtmlPage())
    ->setTitle(_('My Address ページの HTML タイトル'))
    ->addItem(new CDiv($data['my-ip']))
    ->show();
  1. モジュールアクションは manifest.json ファイルに登録する必要があります。manifest.json を開き、次の内容を含む新しい actions オブジェクトを追加します。
  • アクションキーは、小文字 (a-z) で記述し、単語をドットで区切ったアクション名にします(例: my.address)。
  • my.address オブジェクトの class キーの値として、アクションクラス名 (MyAddress) を指定します。
  • my.address オブジェクトの view キーの値として、アクションビュー名 (my.address) を指定します。

ui/modules/MyAddress/manifest.json

{
    "manifest_version": 2.0,
    "id": "my-address",
    "name": "My IP Address",
    "version": "1.0",
    "namespace": "MyAddress",
    "description": "My External IP Address.",
    "actions": {
        "my.address": {
            "class": "MyAddress",
            "view": "my.address"
        }
    }
}
  1. Zabbix Webインターフェースを更新します。My address → External IP をクリックすると、コンピューターの IP アドレスを確認できます。