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

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

作成するもの

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

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

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

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

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インターフェースで、管理 > 一般設定 > モジュール セクションに移動し、ディレクトリをスキャン ボタンをクリックします。

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

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

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

このファイルでは、デフォルトの CModule クラスを拡張する新しい Module クラスを実装します。 Module クラスによって、メインメニューに新しい My Address メニューセクションが追加されます。

setAction() メソッドでは、メニューセクションをクリックしたときに実行するアクションを指定します。 まずは、定義済みのアクション userprofile.edit を使用できます。このアクションを使用すると、ユーザープロフィール ページが開きます。 このチュートリアルのパート 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'(監視 > 障害 を開く)、'report.status'(システム情報 レポートを開く)などです。

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

パート II - メニューセクションの場所を変更する

このパートでは、My Address メニューセクションを Monitoring セクションに移動し、その中にネストされたメニューを追加します。 これにより、ユーザーは Monitoring > 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のWebインターフェースを更新します。 Monitoring メニューセクションを展開し、My address セクションが Discovery セクションの下に移動していることを確認します。

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

この手順では、次の2つのサブセクションを作成します。

  • 次の手順で定義する新しい 'my.address' アクションを実行する External IP。
  • 事前定義された 'userprofile.edit' アクションを実行して User profile ページを開く 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のWebインターフェースを更新します。 My address メニューセクションに、External IP と User profile の2つのページを含む第3レベルのメニューが追加されていることを確認します。

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

アクションは、actions/MyAddress.php と views/my.address.php の2つのファイルで実装します。 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(_('The HTML Title of My Address Page'))
    ->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アドレスが表示されます。