Zabbix応用事例の紹介～Zabbixの既存機能を使い倒す！～令和3年 11月19日

NTTコミュニケーションズ株式会社

田中

武信© NTT Communications Corporation All Rights Reserved.

自己紹介
田中 武信
所属
NTTコミュニケーションズ株式会社
ソリューションサービス部

出身
東京都豊島区

経歴
2000～08年 5社の運用現場を転々
2008年
NTTコムテクノロジーに入社
2011年
Zabbix関連部署に所属
Zabbixの提案/構築等のSI業務、自社製品の企画等に従事

2018年

Zabbix Summit(Riga)
Zabbix Conference Japan(Tokyo)にて登壇

2019年

Zabbix Conference Japan(Tokyo)にて登壇© NTT Communications Corporation All Rights Reserved.

2

自社紹介
NTTコミュニケーションズ株式会社
本社所在地 ：〒100-8019
東京都千代田区大手町2-3-1 大手町プレイスウエストタワー
営業開始日 ：平成11年7月1日
従業員数：5,550人（NTT Comグループ：11,600人）※2021年3月現在
事業内容：国内電気通信事業における県間通話サービス、国際通信事業、
ソリューション事業、及びそれに関する事業等© NTT Communications Corporation All Rights Reserved.

3

Zabbix事業の変遷
平成20年（2008）

2008年

NTTコムテクノロジーがZabbix社とプレミアムパートナー契約を締結
・商標の関係から「ZABICOM」の名称を使用
・日本市場向けに改修したZabbixを提供
・導入支援、Zabbix公式認定技術者研修を開始

平成30年（2018）

2014年

Zabbix 2.2 の公開に伴い、独自改修版の提供を終了
監視ソリューションサービスの名称として「ZABICOM」を使用

2015年

NTTコムソリューションズに社名を変更（グループ内再編）

2018年

ZABICOMオプション製品「PortMap」の提供を開始「L2 Discovery Module for LLDP」をオープンソースとして公開

2021年

NTTコミュニケーションズに吸収合併
Zabbix関連事業は全て継承© NTT Communications Corporation All Rights Reserved.

令和元年（2019）

4

はじめに

本セッションは、弊社のZabbix導入事例の ご紹介ではありません。

Zabbixの既存機能を利用した5つの「面白い」実装事例 をご紹介します。

© NTT Communications Corporation All Rights Reserved.

5

1. トリガーの依存関係をテンプレート化する© NTT Communications Corporation All Rights Reserved.

6課題
障害通知が多すぎる！
ネットワーク・トポロジーの上位の機器で障害が発生したら、下位の機器は発報しないようにできない？

トリガーの依存関係を使えばできますよ！
(Zabbixの模範解答)

それは知ってるけど、アノ機能は設定が煩雑だよね？
もっと簡単に設定できる方法はないの？

さて、どうしたものか・・・© NTT Communications Corporation All Rights Reserved.

7

トリガーの依存関係とは？
依存元のトリガーに対して、依存先として異なるトリガーを指定し、依存先のトリガーが障害状態の場合には、依存元のトリガーは障害を検知させない機能。

依存先

依存先が障害 ⇒ 依存元は障害を検知しない
依存先は正常 ⇒ 依存元の障害を検知する

依存元
依存先

依存元
依存先

依存元

© NTT Communications Corporation All Rights Reserved.

依存元

8

トリガー依存関係の問題点①トリガー依存関係は設定が煩雑

・トリガー1つあたり、最低でも6クリックが必要（10トリガーで60クリック…）・トリガー単位で依存関係の設定を行う必要がある
・依存元トリガーを判別できる知識が必要②ホストを跨ぐ依存関係はテンプレート化できない
・上位と下位の繋がりはテンプレート化できない・テンプレートを適用してから、個別設定が必要③ポーリングタイミングによる誤検知問題
・アイテムのポーリングタイミングにより、正常に機能しない場合がある© NTT Communications Corporation All Rights Reserved.

9

トリガー依存関係の設定方法①依存元トリガーの設定を開く②[依存関係]タブに移動して、依存関係を追加する③依存先トリガーがあるホストを探し、
依存先トリガーを選択④設定を保存⑤トリガーの依存関係が設定される© NTT Communications Corporation All Rights Reserved.

10

トリガー依存関係の問題点（誤検知）・Zabbixは監視の負荷を分散させるため、アイテム毎にポーリングタイミングを散らす動作をします
・依存先の障害発生タイミングにより、依存元のトリガーが先に検知してしまう場合があります

監視間隔
(5分)

監視間隔
(5分)

監視間隔
(5分)

依存先

時間
障害発生！

このタイミングで依存元が障害を検知

依存元

時間

監視間隔
(5分)

© NTT Communications Corporation All Rights Reserved.

監視間隔
(5分)

監視間隔
(5分)

11

トリガーの依存関係を使用せずにトリガーに依存関係を設定する
・依存関係があるホストのアドレスを親IP、自身のアドレスを子IPと定義（子IPはインターフェイスに設定、親IPはホストマクロに設定）
SW#1

・子IP のホスト設定に、親IPと子IPを対象とするPing監視アイテムを作成
・親IPと子IPのPing監視アイテムを参照する子IP用トリガーを設定

SW#2

親IP

SW#3のホスト設定
親IP用Ping監視

SW#3

子IP

子IP用Ping監視

子側ホスト用トリガー

親IP＝ホストマクロ
子IP＝インターフェイス© NTT Communications Corporation All Rights Reserved.

12

アイテムとトリガーの設定内容
・子IPの監視は、通常の icmpping アイテムを使用
・親IPの監視は、 icmpping アイテムの第一パラメータ(Ping先)としてホストマクロを指定

1・子側のホストの死活を見るトリガーを設定
・障害の検知条件は、子IPの過去2回の結果が ”障害”、かつ親IPが ”正常” である場合とする
・復旧の検知条件は、子IPの過去2回の結果が “正常”、かつ親IPが ”正常” である場合とする© NTT Communications Corporation All Rights Reserved.

13

テンプレート化
・テンプレート化の際に、親IPのマクロにはローカルホスト（127.0.0.1）を設定します⇒ ホスト側で親IPの設定を忘れても、子IPの監視は動作します1

テンプレートマクロに設定© NTT Communications Corporation All Rights Reserved.

14

ホストへの設定①テンプレートを適用②ホストマクロに親IPを登録して設定を保存③トリガーの依存関係に相当する機能が設定される少ない操作で監視の依存関係に相当する設定をすることが出来ます© NTT Communications Corporation All Rights Reserved.

15

誤検知対策・障害の検知条件は、子IPの過去2回の結果が ”障害”、かつ親IPが ”正常” である場合とする

監視間隔

監視間隔

監視間隔

親IP

時間
障害発生！

子IP

監視間隔

© NTT Communications Corporation All Rights Reserved.

子IPが過去2回以上
障害ではないため、検知しない

親IPが障害のため、
検知しない

監視間隔

監視間隔

時間

16

実行例（通常のPing監視）

抜線
SW#2が死亡
疎通不可で子も全滅© NTT Communications Corporation All Rights Reserved.

17実行例（依存関係付きPing監視）

抜線
SW#2が死亡

上位死亡につき
SW#3は障害としない© NTT Communications Corporation All Rights Reserved.

18

分かりやすさの改善
・親IPが「障害」でも子IPは「正常」と表示されるため、トリガーを追加します
・親IPも子IPも障害の場合には、深刻度が「情報」のイベントを生成します© NTT Communications Corporation All Rights Reserved.

19実行例（依存関係付きPing監視：親障害時に子にもイベントを付加）

抜線© NTT Communications Corporation All Rights Reserved.

20

設定時の注意点
・本方式を用いると親IPも合わせて監視することから、ping監視の項目数が倍になります・Zabbix Server(もしくはZabbix Proxy)のPingerプロセスの起動数を増やす必要があります/etc/zabbix/zabbix_server.conf### Option: StartPingers#
Number of pre-forked instances of ICMP pingers.
## Mandatory: no# Range: 0-1000# Default:# StartPingers=1
StartPingers=30© NTT Communications Corporation All Rights Reserved.

21

2. LLDを用いて任意のアイテムを作る© NTT Communications Corporation All Rights Reserved.

22

課題

監視アイテムを自動的に作る方法はないの？

LLDというものがありまして…（以下略）(Zabbixの模範解答)

監視の設定は先行して済ませるから、監視対象がなくても機能する？

さて、どうしたものか・・・© NTT Communications Corporation All Rights Reserved.

23

LLD（Low-Level Discovery）とは?
LLDとは、対象から監視可能な項目を取得してアイテム/トリガー/グラフを自動生成する機能。
Zabbixの標準テンプレートには、本機能を活用した設定が多数含まれている。
Template Module
Interfaces Simple SNMPv2
・1時間毎にifIndexのリストを取得
スイッチの1ポートに以下を生成
アイテム 9個トリガー 4個
グラフ 1個24ポートの場合、
アイテム216個を自動的に生成

SNMP

ifIndexのリストを生成
リストを返信

SNMP

ポーリングのリクエストに応答

プロトタイプを元に、アイテム・トリガーを生成
検出対象外のアイテムを削除
監視を開始

LLDの詳細については、こちらを参照下さい© NTT Communications Corporation All Rights Reserved.

RFC1213-MIB::ifIndex.1 = INTEGER: 1
RFC1213-MIB::ifIndex.2 = INTEGER: 2
RFC1213-MIB::ifIndex.3 = INTEGER: 3
RFC1213-MIB::ifIndex.4 = INTEGER: 4＜中略＞
RFC1213-MIB::ifIndex.77 = INTEGER: 77［改訂3版］Zabbix統合監視実践入門
障害通知、傾向分析、可視化による省力運用
技術評論社 : Software Design plus
ISBN978-4-297-10611-9
定価（3,680円+税）

24

LLDの課題点
LLDには、構造に起因する2つの課題があります②① 監視対象機器から返されたリストに含まれる監視項目が全て自動生成される⇒⇒アイテム数が過剰となる場合が多い
アイテム生成の際に適切なフィルタリングが必要

監視可能項目のリストを取得

監視可能項目のリストを返信①
プロトタイプを元に、アイテム・トリガーを生成② 監視対象機器から応答がないと、監視項目が生成できない
こちらの課題の解消方法を考えました

検出対象外のアイテムを削除

監視を開始© NTT Communications Corporation All Rights Reserved.

ポーリングのリクエストに応答

25

LLDの動作を掘り下げる
LLDの動作を掘り下げ、監視対象が存在しない状態でLLDを動作させる方法を考えてみます

ディスカバリルールに従い
ポーリング

入力データを生成© NTT Communications Corporation All Rights Reserved.

ポーリング結果の受信

ディスカバリルールに従いフィルタリング
LLDマクロ生成

アイテム・トリガー生成

入力データを送信

ディスカバリルールに従いフィルタリング
LLDマクロ生成

アイテム・トリガー生成26Trapper方式のLLD
・一般的なLLDの使い方では、Zabbixを起点とした探査（Poller方式）の結果を元に動作します
・任意のデータを入力するためには、Zabbixがデータの入力を待ち受け（Trapper方式）る必要があります
・LLDのルールを「Zabbixトラッパー」に設定し、データの待ち受けができる構造とします・zabbix_senderコマンドを用いて、 Zabbixトラッパーに向けて入力データを送信します

zabbix_sender(入力データ)

入力データを生成© NTT Communications Corporation All Rights Reserved.

ディスカバリルール（Zabbixトラッパー）

入力データを送信

ディスカバリルールに従いフィルタリング
LLDマクロ生成

アイテム・トリガー生成27

入力データのフォーマット（CSV）
・Trapper方式のLLDに送り込む入力データのフォーマットを決めます（下記はプロセス監視の例）
・アイテム/トリガーに設定する変数部分を抜き出し、CSV形式で記述します◆入力書式
監視間隔,プロセス名,プロセスコマンドライン,最小閾値,最大閾値,チェック回数◆入力データサンプル(CSV)interval,process,cmd,minthreshold,maxthreshold,count1m,crond,,1,0,#1
5m,,php-fpm: pool zabbix,30,0,#1
10m,httpd,,24,5,#1© NTT Communications Corporation All Rights Reserved.

28

Trapper方式LLDの設定（ディスカバリルール）
・ディスカバリルールのタイプを[Zabbixトラッパー]に設定します
・LLDの受信データはJSON形式となりますが、保存前処理を用いることでCSVをJSONに変換します・アイテム/トリガーを生成する際に使用する変数をLLDマクロに定義します

入力データの変数を設定© NTT Communications Corporation All Rights Reserved.

29

Trapper方式LLDの設定（アイテム / トリガー）・アイテム / トリガーのプロトタイプを設定します
・LLDマクロで定義した変数を用い、項目ごとの変動要素を設定します© NTT Communications Corporation All Rights Reserved.

30

入力データの送信
・入力データをテキストファイルに書き込み、zabbix_senderコマンドを使用して送信します◆入力データ(CSV)interval,process,cmd,minthreshold,maxthreshold,count1m,crond,,1,0,#1
5m,,php-fpm: pool zabbix,30,0,#1
10m,httpd,,24,5,#1◆入力用テキスト（ proc.data.txt ）ホスト名

参考： Zabbix Documentation 5.0 / ZABBIX_SENDER[-i, --input-file input-file]セクション

TLLD_trial
ディスカバリルールのアイテムキー
process.discovery"interval,process,cmd,minthreshold,maxthreshold,count¥n1m,crond,,1,0,#1¥n5m,,php-fpm: pool zabbix,30,0,#1¥n10m,httpd,,24,5,#1“

登録データ

注：実際には1行で全て記載します◆送信コマンド（ zabbix_sender ）zabbix_sender -z 127.0.0.1 -i ./proc.data.txt© NTT Communications Corporation All Rights Reserved.

31

Trapper方式実行結果
・入力データの受信と同時に、以下の様なアイテム / トリガーが自動生成されます© NTT Communications Corporation All Rights Reserved.

32

活用方法と注意点◆活用方法
・CSVに加工したデータを読み込ませることで、任意の監視設定を自動生成することができます⇒

未設置の監視対象に対して、任意の監視項目を自動生成させる⇒

構成管理システムの情報から入力データ（CSV）を生成して、監視項目を自動生成させる◆注意点
・LLDで生成したアイテム / トリガーの削除タイミングを考える必要があります⇒

ディスカバリルールでは、入力データを受信した際にいずれかの削除動作を行います①入力データに存在しない項目は、即時削除する②入力データに存在しない項目は、指定日時後に削除する⇒

ディスカバリルールは入力データを受信した際にしか動作しませんので、②を選択する場合には、項目の削除タイミングに注意が必要となります。

© NTT Communications Corporation All Rights Reserved.

33

3. ダッシュボードをWebアプリのUIとして使う© NTT Communications Corporation All Rights Reserved.

34

課題
Zabbixは監視設定をCSVで出力できないの？

ZabbixからXML出力した後に、テキスト置換で頑張ればCSVにできますよ(一般論で回答)
頑張らずに変換できるようにしてよ！
あと、詳しくない人が操作するからCLIではなくて、
Webアプリでよろしく！

あれ？ハードル上がってない？

© NTT Communications Corporation All Rights Reserved.

35

処理フロー・ZabbixからXMLを取り出す部分は標準機能を利用・スクリプトでXMLをCSVに変換・変換処理のインターフェイス部分をどうするか？

⇒ 各機能をダッシュボードに貼ると統合できるかも？

CSV© NTT Communications Corporation All Rights Reserved.

36

URLオブジェクト
・ダッシュボードのウィジェットとしてWebページを表示することが可能
・iframeの中にページを表示する方式
・ページへのアクセスは、クライアント側で行われる（クライアントが表示できるページのURLのみ機能する）

URLオブジェクトにアクセス© NTT Communications Corporation All Rights Reserved.

アクセス先のURLを渡すクライアント側のブラウザがページにアクセス

37

URLオブジェクトの使用例（内部ページ）

https://pukiwiki.osdn.jp/

Wikiを表示させてナレッジデータベースとして使う© NTT Communications Corporation All Rights Reserved.

38

URLオブジェクトの使用例（外部ページ）

気象庁：全国の天気予報
https://www.jma.go.jp/bosai/forecast/

気象庁：大雨危険度
https://www.jma.go.jp/bosai/map.html

注意：これらのページは2021年11月時点で表示ができたものとなります。
ページ側の仕様変更などにより、将来的に表示できなくなる可能性があります。
© NTT Communications Corporation All Rights Reserved.

39

URLオブジェクトの限界点

Zabbixからオンライン通販ができたら便利だよね！

サイトの構造、iframeの制約、
ブラウザの制約などにより、多くのサイトは表示できません
ZabbixとWebページのプロトコルが異なると表示できません（http ⇒ https）© NTT Communications Corporation All Rights Reserved.

40

Webアプリのインターフェイスに使えないか？

CSV① XMLをサーバに送る
アップローダー② Zabbixのスクリプトで変換プログラムを実行③CSVファイルはブラウザからダウンロードできる場所に配置

ExecuteCSV© NTT Communications Corporation All Rights Reserved.

これらを全てダッシュボードに貼り、1つの機能として動かす41

設定のポイント◆ iframeのSANDBOX設定
Zabbix 5.0からURLオブジェクト（iframe）のセキュリティが強化され、デフォルトの設定ではスクリプトの動作などが許可されていません。
/usr/share/zabbix/include/defines.inc.php
define('ZBX_IFRAME_SANDBOX', 'allow-downloads allow-scripts allow-forms allow-popups allow-same-origin');allow-downloads
allow-scripts
allow-forms
allow-popups
allow-same-origin

ダウンロードを許可スクリプト（ポップアップを除く）の実行を許可
フォームからのデータ送信を許可
ポップアップウィンドウの表示を許可
オリジンと同じポリシーを適用

詳しくはこのあたりを参照

Zabbix 5.2からはWeb UIで設定できるようになりました（デフォルトはSANDBOX無効）

https://developer.mozilla.org/ja/docs/Web/HTML/Element/iframe#attr-sandbox© NTT Communications Corporation All Rights Reserved.

42

実装結果

< Icon Images >===================ICOOON MONO
https://icooon-mono.com/===================②XML to CSV変換のスクリプトを実行する
マップオブジェクト①ファイルアップローダを描画するURLオブジェクト< CSS >========================================
dropify v0.2.2 - Override your input files with style.
https://github.com/JeremyFagis/dropify(c) 2017 - Jeremy FAGIS <jeremy@fagis.fr> (http://fagis.fr)========================================(ゴミ箱はdownloadフォルダ内の掃除機能)③CSV変換後のファイルが格納されるフォルダを表示する
URLオブジェクト< modern HTTP web server index >========================
h5ai
https://larsjung.de/h5ai/========================© NTT Communications Corporation All Rights Reserved.

43

動作イメージ①ファイルをドロップしてアップロード②スクリプトを実行③CSVファイルを選択してダウンロード実行© NTT Communications Corporation All Rights Reserved.

44

URLオブジェクト活用のポイント
・URLオブジェクトは、特性と限界を理解した上で使うと便利です
・機能の動線が明確であれば、単発機能の組み合わせで仕組みの構築ができます

・単発機能をダッシュボードに貼ることで、1つの機能として束ねることができます・Zabbixを機能拡張したように見えます© NTT Communications Corporation All Rights Reserved.

45

4. GPS情報の取得と利用方法© NTT Communications Corporation All Rights Reserved.

46

この事例はそもそも・・・
Zabbix Conference Japan 2019のLTにて、Zabbixに位置情報を格納する話をしました。

カンファレンス終了後、何名かの方からご質問を頂きましたため、改めて技術的なノウハウなどをご紹介します。

© NTT Communications Corporation All Rights Reserved.

47

ホストの位置情報を保存する
ホスト設定の中に、位置情報（緯度・経度）を保存できるカラムが用意されています
Zabbix 5.4 (2021)© NTT Communications Corporation All Rights Reserved.

Zabbix 2.0（2012）48

このカラム、使われてます？
監視システムなのに、何故に昔から（Zabbix2.0以前）この項目があるのか？

このカラムはどういう目的でいれたの？
あと、使われた事例はありますか？

Zabbix LLC 創設者兼CEO
Alexei Vladishev氏

必要そうだから入れておいたよ！
使われた事例は聞いたことないよ！

注：2018年頃、都内某所での会話を元にした意訳です© NTT Communications Corporation All Rights Reserved.

49位置情報の取得許可（Windows10）[設定]→[プライバシー]から位置情報へのアクセスを許可する必要があります

注意：PCに位置情報を取得する機能が必要です

詳しくはこのあたりを参照
Windows位置情報サービスとプライバシー - Microsoft Support© NTT Communications Corporation All Rights Reserved.

50

位置情報を取得するPowerShellを準備します
geoinfo.ps1
Add-Type -AssemblyName System.Device$GeoWatcher = New-Object System.Device.Location.GeoCoordinateWatcher$GeoWatcher.Start()
while (($GeoWatcher.Status -ne 'Ready') -and ($GeoWatcher.Permission -ne 'Denied')) {Start-Sleep -Milliseconds 100}
if ($GeoWatcher.Permission -eq 'Denied'){Write-Error 'Access Denied for Location Information'} else {$watcher = New-Object System.Device.Location.GeoCoordinateWatcher$sourceId = "Location"$job = Register-ObjectEvent -InputObject $watcher -EventName PositionChanged -SourceIdentifier $sourceId$watcher.Start()$event = Wait-Event $sourceId$event.SourceEventArgs.Position.Location
Remove-Event $sourceId
Unregister-Event $sourceId}© NTT Communications Corporation All Rights Reserved.

51

バッチファイル経由で実行してログを出力しますPowerShellから返値が来るまでにタイムアウトしてしまうケースがあるため、バッチファイルを経由して実行して、位置情報はテキストファイルに出力させます。
geoinfo.bat@echo off
powershell -ExecutionPolicy RemoteSigned -File C:¥zabbix_agent¥bin¥geo.ps1 > C:¥zabbix_agent¥log¥geoinfo.txt

geoinfo.txt
LatitudeLongitude
Altitude
HorizontalAccuracy
VerticalAccuracy
Speed
CourseIsUnknown© NTT Communications Corporation All Rights Reserved.

: 35.66102: 139.75718:0: 79628
: NaN
: NaN
: NaN
: False

LatitudeLongitude
Altitude
HorizontalAccuracy
VerticalAccuracy
Speed
CourseIsUnknown

→
→
→
→
→
→
→
→

緯度
経度
メートル単位の高度
緯度と経度のメートル単位の精度
高度のメートル単位の精度
毎秒メートル単位の速度
真北からの角度
緯度または経度のデータを含むかどうかを示す値

52

アイテムの構造と設定
Zabbix側処理

緯度アイテムPowerShell実行アイテム

テキスト読み取りアイテム

system.run[PATH,nowait]

Vfs.file.contents[PATH]
データ型：ログ実行

読み取り

経度アイテム高度アイテムホストインベントリ
緯度・経度のカラムに格納依存アイテム
保存前処理で抽出
データ型：テキスト

Windows側処理
geoinfo.bat© NTT Communications Corporation All Rights Reserved.

実行

geoinfo.ps1

出力

geoinfo.txt

53

取得結果

35.66103139.75716
35.66103© NTT Communications Corporation All Rights Reserved.

54位置情報を取る方法（Linux）
Linuxで動作するGPSレシーバーを買います
接続するとシリアルデバイスとして認識されます# lsusb
Bus 002 Device 005: ID 067b:2303 Prolific Technology,
Inc. PL2303 Serial Port

標準入出力端末デバイス（tty）でアクセスができます# ls /dev/ttyUSB*/dev/ttyUSB0© NTT Communications Corporation All Rights Reserved.

55

gpsdの導入と設定
GPSレシーバーからの情報読み取りには、gpsdを使用します。
ZabbixAgentで位置情報を取る際にPythonを使うため、まとめて導入します。
# apt-get install gpsd gpsd-clients python-gps python3-pip# pip3 install gps3

gpsdの起動オプションにGPSレシーバーのデバイスを指定します
Ubuntu系 # vi /etc/default/gpsd

START_DAEMON="true"
USBAUTO="true"
DEVICES="/dev/ttyUSB0"
GPSD_SOCKET="/var/run/gpsd.sock"
GPSD_OPTIONS="-n"Redhat系# vi /etc/sysconfig/gpsd
OPTIONS="-b -n -F /var/run/gpsd.sock /dev/ttyUSB0"

サービスを起動します# systemctl start gpsd

© NTT Communications Corporation All Rights Reserved.

56位置情報を出力するスクリプトの作成
ZabbixAgentでgpsdの情報を読み取るために、ファイルに書き出すスクリプトを作成します
gpsinfo.py#!/usr/bin/python3
from gps3 import gps3
import csv
gps_socket = gps3.GPSDSocket()
gps_socket.connect()gps_socket.watch()
data_stream = gps3.DataStream()with open('geoinfo.txt', 'w') as f:writer = csv.writer(f, lineterminator='¥n')i=0
for new_data in gps_socket:
if new_data:
data_stream.unpack(new_data)
list=[data_stream.TPV['time'],data_stream.TPV['lat'],data_stream.TPV['lon'],data_stream.TPV['alt']]
writer.writerow(list)
i += 1
if i>5:break# EOF© NTT Communications Corporation All Rights Reserved.

geoinfo.txt
出力n/a,n/a,n/a,n/a
2021-11-07T05:19:11.000Z,35.66103,139.75716,52.97
2021-11-07T05:19:11.000Z,35.66103,139.75716,52.97
2021-11-07T05:19:12.000Z,35.66103,139.75716,52.97
2021-11-07T05:19:13.000Z,35.66103,139.75716,52.97
2021-11-07T05:19:14.000Z,35.66103,139.75716,52.97

日時

緯度

経度

高度

57

アイテムの構造と設定
Zabbix側処理

緯度アイテムスクリプト実行アイテム

テキスト読み取りアイテム

system.run[PATH,nowait]

Vfs.file.contents[PATH]
データ型：ログ実行

読み取り

経度アイテム高度アイテムホストインベントリ
緯度・経度のカラムに格納依存アイテム
保存前処理で抽出
データ型：テキスト

Linux側処理© NTT Communications Corporation All Rights Reserved.

geoinfo.py

出力

取得

gpsd

geoinfo.txt

58

取得結果

139.75716
35.66103© NTT Communications Corporation All Rights Reserved.

59

Zabbix APIを用いて取り出す
connect-api.sh

result#!/bin/sh{"jsonrpc":"2.0",
URL='https://127.0.0.1/zabbix/api_jsonrpc.php‘ # Zabbix API URL"result":[
ZABBIX_USER=‘Admin‘# User Name{"hostid":"10729",
ZABBIX_PASSWORD=‘zabbix‘# Password"host":"BNT-1013.mobile",## API Token"inventory":{"os":"Android 9","location_lat":"35.6610358","location_lon":"139.75716"}
PARAMS=$(cat << EOS},{{"hostid":"10958","jsonrpc": "2.0","host":"DESKTOP-A1CJC3R","method": "user.login","inventory":{"os":"Windows 10 Home x64 ","location_lat":" 35.661037699482","location_lon":" 139.757160030"}"params": {},"user": "${ZABBIX_USER}",{"hostid":"11053","password": "${ZABBIX_PASSWORD}""host":"FMVLUC40N",},"inventory":{"os":"Linux version 5.0.0-32","location_lat":"35.661033129","location_lon":"139.757168605"}"id": 1}}],
EOS
"id":"2"})
TOKEN=$(
curl -s -H 'Content-Type:application/json-rpc' ${URL} -d "${PARAMS}" | jq -r '.result')## API call
PARAMS=$(cat << EOS
host.getメソッドを使用{取得するインベントリの"jsonrpc": "2.0",
項目を指定"method": "host.get","params": {"output": ["host"],"selectInventory": ["os","type","model","vendor","location_lat","location_lon"],"searchInventory": {"location_lat": "."}},
"id": “2","auth": "${TOKEN}"
Localtion_lat（経度）の}カラムに値がある場合のみ抽出
EOS)
curl -s -H 'Content-Type:application/json-rpc' ${URL} -d "${PARAMS}"
exit 0# EOF

ホストインベントリ情報os⇒ OSカラム
location_lat⇒ 経度カラム
location_lon⇒ 緯度カラム© NTT Communications Corporation All Rights Reserved.

60

位置情報の取得と格納のポイント

・GPSより位置情報を取得する手段は、OSの機能を活用します

・位置情報は一度の処理で取り込み、依存アイテムを用いて分解します（データ取得タイミングによる誤差を防ぎます）

・位置情報をホストインベントリに格納することで、最新値が参照しやすくなります

・位置情報をZabbixに格納することで、OSやデバイスの差異に影響されずにAPIを用いて一律にデータを取り出すことができます61

5. スマホを監視する© NTT Communications Corporation All Rights Reserved.

62

この先の内容は実験として行ったものであり、動作/安全性などを保証するものではありません。
講演者 並びに NTTコミュニケーションズ は
本内容を参考としたことで発生するあらゆる事象に対しいかなる責任も負わないものとします。
© NTT Communications Corporation All Rights Reserved.

63

WARNING
The contents of this document are for experimental
purposes only and are not intended to guarantee
operation or safety.
The speaker and NTT Communications assume no
responsibility whatsoever for any events that may
occur as a result of using this information as areference.
© NTT Communications Corporation All Rights Reserved.

64

Zabbixでスマホを監視できるか？
・Zabbix Agentはコンパイル済みパッケージが公式サイトより入手できます
・サーバ / デスクトップ向けのパッケージのみが提供されています

パッケージが提供されていなくても、
OS/アーキテクチャがサポート範囲内ならば、ソースコードから（おおよそ）生成できます

スマホ（Android）向けのZabbix Agentは提供されていません

スマホ（iPhone）は実験用機材がなかったので
本セッションでは取り上げません65

Unofficial Zabbix Agent
利用は自己責任となります66

収集できる項目
・Unofficial Zabbix Agentは43個の独自のアイテムが定義されています。
・全ての項目が取得できる訳ではないため、実機を用いた検証が必要になります。
agent.hostname
agent.ping
agent.version
android.manufacturer
android.modelapp.foreground
app.running
gps[<timeout>]
gps.latitude[<timeout>]
gps.longitude[<timeout>]
gps.altitude[<timeout>]
gps.accuracy[<timeout>]
net.carrier
net.connectivity
net.if.in[if,<mode>]
net.if.out[if,<mode>]net.{mobile,total}.{rx_bytes,tx_bytes,rx_packets,tx_packets}net.roaming
net.signal_strength
net.wifi.bssid
net.wifi.status
net.wifi.ssid
net.wifi.signal

power.battery_level
power.battery_temperature
power.source
power.statusproc.cpu.util[<name>]proc.mem[<name>]sensor.lightsensor.proximity
sensor.temperaturesystem.cpu.load[]system.cpu.num
system.cpu.freq[number,type]system.hostname
system.localtime[]
system.sw.arch
system.sw.os[]
system.unamesystem.uptime
vfs.fs.size[fs,<mode>]
vm.memory.size[total]
vm.memory.size[free]
web.page.get[host,<path>,<port>]
web.page.perf[host,<path>,<port>]67

テンプレートは自分で作りましょう
・Zabbix Shareにテンプレートが公開されていますが、Zabbix 3.0用に作成されたものです・Google Playの説明文にアイテムキーの一覧が掲載されています

アイテムキー一覧

最終更新が2018年
68インストールと設定
・インストールはGoogle Playから行います・設定項目は公式のZabbix Agentと大差ありません

監視のOn/Off切り替え

パッシブ監視の設定
Agentのホスト名（アクティブ監視で必須）

アクティブ監視の設定

69

データの取得状況
スマートフォン(Android11)

スマートフォン(Android10)

タブレット(Android9)70Google Mapにマーカーを付ける（構造）Zabbix API( host.get "selectInventory“ )受信した緯度経度はホストインベントリに格納＋
HTML生成スクリプト・Zabbix APIを用いたインベントリの取得

・Google Mapにマーカーを設定する方法

緯度経度の情報を
Google Mapにマーカーとして表示

本資料のP60を参照
Google Maps Platform
Web > Maps JavaScript API
https://developers.google.com/maps/documentation/javascript/markers

71

Google Mapにマーカーを付ける（表示用HTML）<html><head><title>Google Map API</title><style>.labels {color: #ffffff;
background: #000000;
font-size: 14px;
text-align: center;padding: 2px 10px;
border-radius: 8px;}</style><script type="text/javascript" src="https://maps.google.com/maps/api/js?key=[Application Key]" charset="utf-8"></script><script src="./js/markerwithlabel.js"></script><script type="text/javascript">function initialize() {var latlng = new google.maps.LatLng(35.6610355114422, 139.757244951752);
var mapOptions = {zoom: 5,
mapTypeId: google.maps.MapTypeId.ROADMAP,
center: latlng};
var gmap = new google.maps.Map(document.getElementById("map"), mapOptions);
var markerData = [{hostid:"11053",host:"FMVLUC40N",name:"FMV-BIBLO Loox U/C40",os:"Linux version 5.0.0-32-generic ",type:"",model:"FMV-BIBLO Loox U/C40",vendor:"富士通",location_lat:"35.6986615997881",location_lon:"139.759607978815"},{hostid:"11060",host:"ZabbixJapan",name:"業務用ノートPC",os:"Linux version 3.10.0-1160.45.1.el7.x86_64,type:"NTTDocomo",model:"Zabbix Japan",vendor:"Zabbix Japan",location_lat:"35.6610355114422",location_lon:"139.757244951752"}];// maker createfor ( i = 0;i < markerData.length; i++) {// var marker = new google.maps.Marker({var marker = new MarkerWithLabel({map: map,
position: new google.maps.LatLng(markerData[i].location_lat, markerData[i].location_lon),
title: "Name : " + markerData[i].host + "¥n" + "OS : " + markerData[i].os + "¥n" + "Model : " + markerData[i].model + "¥n" + "Vendor : " + markerData[i].vendor + "¥n" + "Carrier : " + markerData[i].type + "¥n" ,labelContent: markerData[i].name,labelAnchor: new google.maps.Point(10, 0),labelClass: "labels",labelStyle: { opacity: 1.75 }});marker.setMap(gmap);}}</script></head><body onload="initialize()"><div id="map" style="width: 1000px; height: 600px;"></div></body></html>マーカーの表現には、
markerwithlabel.jsを使用

マーカーのデータセット（緯度経度、OSなど）マーカーの表示位置（緯度経度）

マーカーの表示内容（吹き出しの内容）

72

Google Mapにマーカーを付ける（URLオブジェクト登録）生成したHTMLをWebコンテンツとして配置し、ダッシュボードにURLオブジェクトとして登録

緯度経度の情報を元にマーカーを付ける

ホストインベントリの情報を吹き出しに挿入73Android用Agentのポイント
・本実験では、Unofficial Zabbix Agent を以下の機種に導入して動作を確認しました。
スマートフォンに限らず、Android搭載デバイスであれば稼働できそうです。
・ASUS
・KYOCERA・BLUEDOT

Zenfone7 （Android 11@aarch64）
KYV45（Android 10@aarch64）
BNT-1013 （Android 9@aarch64）

・スマートフォンでは、キャリア回線に接続しないと位置情報が取得できませんでした。
タブレットPCは、Wifi接続の場合にも位置情報が取得できました。

・本実験においては、セキュリティ的な観点での検証は行っていませんので、Unofficial Zabbix Agent の利用は自己責任でお願いします。

74

まとめ

© NTT Communications Corporation All Rights Reserved.

75

Zabbixの既存機能を使い込む

・Zabbixはバージョンが上がる度に新機能が増えています・Zabbixの多くの機能はアイデア次第で様々な動作を実現できます
・弊社ではZabbixの設定を作り込み、ICT分野以外にも幅広くZabbixを活用するための研究・実装をしていますので、お気軽にご相談ください

ZABICOM公式サイト
Zbcm-sales@ntt.com© NTT Communications Corporation All Rights Reserved.

76

ご清聴ありがとうございました© NTT Communications Corporation All Rights Reserved.