痛いところは煙に巻く

製造業のしがない社内SEが日記代わりにいろいろ書く

Hello,World

Üben Sie es nur recht fleißig, so wird es schon gehen

【Zabbix】ホストインベントリ一覧の表示カラムをカスタマイズする

おはこんばんにちは、ビショップです。
久々の記事は備忘録。

最近Zabbixをからかってます。会社で運用する上で色々と体系化しておかないといけないので、勤め先の要件に合うような形でガイドラインを作成しています。そんな中で、ちょっとカスタマイズしたいなというところがあったので、そのやり方を備忘録として書いておこうかなと。

やりたいこと

Zabbixのホストインベントリの一覧に表示されているカラムを変更したい。拠点が多いので、場所とかそういうインベントリ情報を出していきたいなと。
ホストインベントリページのソースは/usr/share/zabbix/hostinventories.phpです。リスト自体は、ソースコード内にも記述されていますが、/usr/share/zabbix/include/views/inventory.host.list.phpで生成されているようです。というわけで、この2つのソースをカスタマイズしていきます。
今回の条件としては、以下とします。

  • Zabbix 5.0
  • 追加する項目は「備考」
  • ソートもちゃんと設定する

項目の追記にはちゃんとしたZabbix上での正しいフィールド名が必要です。テーブルのカラム名なんだと思いますが、マニュアルにある、サポートされているマクロのインベントリの説明を見れば分かるので、参考にしてください。「備考」は「notes」です。

では、実際にカスタマイズしていきましょう。
※ソースコードはシンタックスハイライトの関係で?phpが最初に書いてあります。

hostinventories.phpのカスタマイズ

ソート用フィールドの追加

だいたい39行目くらいから各フィールドの設定が記述されているので、その中のソートの部分に追記します。他にならって”pr_notes”というソートフィールドを追記します。

<?php
$fields = [
   'hostid' => [T_ZBX_INT, O_OPT, P_SYS,       DB_ID,          null],
   // filter
   'filter_set' =>  [T_ZBX_STR, O_OPT, P_SYS,       null,           null],
   'filter_rst' => [T_ZBX_STR, O_OPT, P_SYS,       null,           null],
   'filter_field' =>  [T_ZBX_STR, O_OPT, null,        null,           null],
   'filter_field_value' => [T_ZBX_STR, O_OPT, null,        null,           null],
   'filter_exact' =>  [T_ZBX_INT, O_OPT, null,        'IN(0,1)',      null],
   'filter_groups' => [T_ZBX_INT, O_OPT, null,        DB_ID,          null],
   // actions
   'cancel' =>  [T_ZBX_STR, O_OPT, P_SYS,               null,   null],
   // sort and sortorder
   'sort' =>   [T_ZBX_STR, O_OPT, P_SYS,
              // ここに追記
              //IN('"name","pr_macaddress_a","pr_name","pr_os","pr_serialno_a","pr_tag","pr_type"'),
              IN('"name","pr_macaddress_a","pr_name","pr_os","pr_serialno_a","pr_tag","pr_type","pr_notes"'),
              null
          ],
   'sortorder' => [T_ZBX_STR, O_OPT, P_SYS, IN('"'.ZBX_SORT_DOWN.'","'.ZBX_SORT_UP.'"'),  null]
];

インベントリデータ取得用のフィールド追加

実際のインベントリデータの取得に使うフィールドを指定してるっぽいところに追記します。
だいたい200行目くらいのところからインベントリデータの取得設定があり、その中の'selectInventory'の中を変更します。

<?php
$options = [             // 201行目くらい
     'output' => ['hostid', 'name', 'status'],
     // ここに追記
     //'selectInventory' => ['name', 'type', 'os', 'serialno_a', 'tag', 'macaddress_a', $data['filter']['field']],
     'selectInventory' => ['name', 'type', 'os', 'serialno_a', 'tag', 'macaddress_a', 'notes', $data['filter']['field']],
     'selectGroups' => API_OUTPUT_EXTEND,
     'groupids' => $filter_groupids,
     'filter' => ['inventory_mode' => [HOST_INVENTORY_MANUAL, HOST_INVENTORY_AUTOMATIC]]
  ];

しっかりシングルコーテーションでくくり、カンマを付けましょう。

値設定の追記

ソート用フィールドの値設定に追記します。だいたい230行目くらいにあります。

<?php
$sort_fields = [
      'pr_name' => 'name',
      'pr_type' => 'type',
      'pr_os' => 'os',
      'pr_serialno_a' => 'serialno_a',
      'pr_tag' => 'tag',
      'pr_macaddress_a' => 'macaddress_a',
      // 追記 直前のカンマ追記など忘れずに
      'pr_notes' => 'notes'
   ];

これでhostinventories.phpの編集は完了です。上書き保存しましょう。

inventory.host.list.phpのカスタマイズ

実際にリストを生成してくれるところをカスタマイズしていきましょう。やることはヘッダー部分の追記と繰り返し値をセットする部分の項目追記になります。

ヘッダーへ追記

80行目くらいのところにヘッダー処理がありますので、そこに追記します。ソート機能をちゃんとつけたいので、make_sorting_headerとなっている項目を参考に追記しましょう。

<?php
$table = (new CTableInfo())
  ->setHeader([
      make_sorting_header(_('Host'), 'name', $this->data['sort'], $this->data['sortorder'], $url),
      _('Group'),
      make_sorting_header(_('Name'), 'pr_name', $this->data['sort'], $this->data['sortorder'], $url),
      make_sorting_header(_('Type'), 'pr_type', $this->data['sort'], $this->data['sortorder'], $url),
      make_sorting_header(_('OS'), 'pr_os', $this->data['sort'], $this->data['sortorder'], $url),
      make_sorting_header(_('Serial number A'), 'pr_serialno_a', $this->data['sort'], $this->data['sortorder'], $url),
      make_sorting_header(_('Tag'), 'pr_tag', $this->data['sort'], $this->data['sortorder'], $url),
      make_sorting_header(_('MAC address A'), 'pr_macaddress_a', $this->data['sort'], $this->data['sortorder'], $url),
      // 追記
      make_sorting_header(_('Notes'), 'pr_notes', $this->data['sort'], $this->data['sortorder'], $url)
  ]);

繰り返し処理に追記

100行目くらいのところに繰り返し処理のうち、行の設定部分が記述されています。そこに追記します。他のカラムの情報をコピペしましょう。今までもそうですが、最後尾に追加する場合は、その前の項目にカンマを付ける場合があるので、気を付けましょう。ここはカンマもちゃんと追記します。

<?php
$row = [
    (new CLink($host['name'], (new CUrl('hostinventories.php'))->setArgument('hostid', $host['hostid'])))
         ->addClass($host['status'] == HOST_STATUS_NOT_MONITORED ? ZBX_STYLE_RED : null),
    $hostGroups,
    zbx_str2links($host['inventory']['name']),
    zbx_str2links($host['inventory']['type']),
    zbx_str2links($host['inventory']['os']),
    zbx_str2links($host['inventory']['serialno_a']),
    zbx_str2links($host['inventory']['tag']),
    zbx_str2links($host['inventory']['macaddress_a']),
    // 追記 前の行にカンマを忘れずに
    zbx_str2links($host['inventory']['notes'])
];

これでinventory.host.list.phpの編集も完了しました。上書き保存して、Zabbixのページを再度見てみましょう。
f:id:bishop03428:20220311104146p:plain

イェーイ、項目追加されたー!参考画像は、初期表示の「OS」を「場所(location)」に変更してあります。これで必要な項目を表示してホストの管理しやすくできます。
ホントは別の機器管理の台帳があるので、そこと二重管理になってしまうのがネックですね。連携するようにしちゃおうかな。趣味の範囲だけど。

スポンサーリンク