質問: ### 前提・実現したいこと Zabbixにて、以下のような監視を行いたいと考えています。 * 1台のサーバ内にある、特定ディレクトリ毎のディスク容量の使用量の増減を監視したい 例: /var/data/1/ /var/data/2/ /var/data/.../ * 上記例での1, 2, ...のディレクトリそのものが増減する * ディレクトリごと、Zabbix上ではアイテムとして分けたい * ディレクトリ自体が増減するので、例えば上記例での「/var/data/2/」がなくなった場合は、Zabbix上からそのアイテムを削除したい * ディレクトリごと(=Zabbix上でのアイテムごと)、トリガーになるしきい値(今回は使用量)が異なる * トリガーにしたいしきい値も運用上変動するため、そのアイテムのトリガーの値も都度自動で追従させたい * ディレクトリごとの使用量はduコマンドで、またそのディレクトリに対するしきい値については別のコマンドで取得できている * ディレクトリ容量を監視したいサーバ側の負荷を考慮し、バッチ処理にて1日1回や2回程度cronで実行する予定 * その際にディレクトリそのものの増減が判明する * Zabbixへの値の取り込みは、Zabbixサーバ側からのポーリングではなく、ディレクトリのディスク使用量をチェックするバッチ処理の最後にzabbix_sender等を利用してZabbixサーバへ送るような形をとりたい(zabbix_senderと記載しましたが、今回の件ではzabbix_senderを利用するのが適切かどうかはわかりません。) ### 質問 Zabbix側にて、WebのI/Fなど人間の手作業を伴わず、監視のアイテムの増減や、トリガーのしきい値の設定を行うには、どういう方法があるでしょうか。 分からないながら調べたところ、Zabbix APIを利用すれば実現が可能そうですが、他に方法はありますでしょうか。 トリガーの設定まではできなかったかもしれませんが、アイテムの増減については、Zabbix APIを用いずともできる方法を解説したwebページを以前見た覚えがあるのですが、今検索しても見つけられませんでした。 後述しておりますが、Zabbixサーバ側は3.4を利用しております。 ディレクトリ容量を監視したいサーバにはZabbixエージェントとして3.0系が入っていますが、3.4系に上げることは可能です。zabbix_senderはまだインストールしておりませんが、インストールすることも可能です。 ### 補足情報(FW/ツールのバージョンなど) Zabbixサーバ側 * zabbix-server-mysql-3.4.5-1.el7.x86_64 * zabbix-web-japanese-3.4.5-1.el7.noarch * zabbix-agent-3.4.5-1.el7.x86_64 * zabbix-release-3.4-2.el7.noarch * zabbix-web-mysql-3.4.5-1.el7.noarch * zabbix-web-3.4.5-1.el7.noarch * zabbix-sender-3.4.5-1.el7.x86_64 * zabbix-get-3.4.5-1.el7.x86_64 Zabbixエージェント側 * zabbix-release-3.0-1.el6.noarch * zabbix-agent-3.0.10-1.el6.x86_64 以上となります。なにとぞ、よろしくお願いいたします。
回答: 面白そうなのでやってみました。 Zabbix3.0でやってみましたが、ローレベルディスカバリ機能があるバージョンならばできるはずです。 1. 対象ホストのエージェントにローレベルディスカバリが必要とするjsonデータを出力するスクリプトを仕込む ローレベルディスカバリではエージェントから帰ってきたjsonデータを元にしてアイテムを作成します。 特定ディレクトリ以下の1階層目だけのディレクトリリストをjsonにして出すスクリプトがこんな。 ``` #!/bin/bash for dir_path in `/bin/find $1 -maxdepth 1 ! -regex $1 -type d`; do tmpdata=$tmpdata"{\"{#DIRPATH}\":\"$dir_path\"}," done jsondata="{\"data\":["`echo $tmpdata | sed -e "s/,$//"`"]}" echo $jsondata ``` このスクリプトを適当なところへ保存。例えば/usr/local/bin/dirlist.shとか。 出力されるデータはこんなのです。 ``` {"data":[{"{#DIRPATH}":"/tmp/mm"},{"{#DIRPATH}":"/tmp/mm/1"},{"{#DIRPATH}":"/tmp/mm/2"}]} ``` 2. 対象ホストのzabbixエージェントに上記のスクリプトをUserParameterにして登録 キーの名前はなんでもいいんですが、ファイルシステムっぽいのでvfsにしています。適当に。 ``` UserParameter=vfs.directory.discovery[*],/bin/sh /usr/local/bin/dirlist.sh $1 ``` 3. zabbixサーバでディスカバリルールと、アイテムのプロトタイプを作成 設定→ホスト→ディスカバリで、「ディスカバリルールの作成」 名前:適当に タイプ:Zabbixエージェント キー:vfs.directory.discovery[/home] /home以下のディレクトリについて調べる場合。 つづいてアイテムのプロトタイプ 名前:directory size of [{#DIRPATH}] タイプ: Zabbixエージェント キー: vfs.dirdu.size[#DIRPATH] アプリケーション: FileSystems これも好みで変えてOK。#DIRPATHのところだけは、上記のjsonキーと一致させる必要があります。 4. 対象ホストのzabbixエージェントに上記で作成したアイテムのキーを登録 さっきの2と合わせてこんな感じ。 ``` UserParameter=vfs.directory.discovery[*],/bin/sh /tmp/mm.sh $1 UserParameter=vfs.dirdu.size[*],sudo du -b -s $1 | awk '{print $$1}' ``` du -bにしていますが、そのあたりも適当に変更してもOK。 ここまで書いたらzabbixエージェントを再起動。 これでアイテム追加されました。 削除は自動的にやってくれるのかな。ディスカバリルールのところで「存在しなくなったリソースの保持期間」という設定項目があるのでそのあたりで調整できるかもしれません。 参考になれば。