[Zabbix]YYYYMMDDのファイルにバッチ処理とユーザーパラメータで固定ファイル名に変換し、正規表現を指定できない vfs.file.contents で取得後、メールで自動送信する手順

# ●はじめに
統合監視ツールZabbixのユーザーパラメータ機能を使い、監視対象ホスト（Windows）にバッチ処理を実行させ、実行後に作成されたファイルをZabbixで取得し、さらにその内容を指定の時間に自動送信する設定を行ったのでメモします。
ファイル名がYYYYMMDD形式の最新テキストファイルを固定のファイル名に変換し、正規表現を指定できないアイテムキー vfs.file.contents でも取得できるようにしました。

# ●環境
|項目 |詳細 |
|:-:|:-:|
|ホストOS   |macOS Monterey 12.2.1   |
|仮想化ソフト   |VMware Fusion 12.2.0   |
|ゲストOS   |Windows2019   |
|Zabbix ver   | 5.0.21  |

# ●要件
- 毎日AM5:00に監視ホスト内でDBにSQLを投げ、その結果をYYYYMMDD形式のファイル名のテキストファイルとして吐き出している。
- 監視対象ホストに作られた上記テキストファイルを、毎週日曜10:00にメールに展開して自動送信したい。
    - ただし自動送信したいファイルは、日曜AM5:00に更新されたテキストファイルのみ

# ●設定詳細
**監視対象ホスト側**
- **ホスト名**：Win2019
- **日次で作成されるテキストファイル**： C:¥SQL¥SQL_YYYYMMDD.txt
- **バッチファイルの作成**： vfs.file.contents を使用したいが、ファイル名に正規表現が指定できないのでこのままでは使用できない。なのでフォルダ C:¥SQL¥lastUpdate¥ を作成し、その中に固定ファイル名 C:¥SQL¥lastUpdate¥lastUpdateFiles として、C:¥SQL¥SQL_YYYYMMDD.txt をコピーするバッチファイル C:¥SQL¥lastUpdate¥lastUpdate.bat を作成する
- **ユーザーパラメータ**：上記バッチ処理を行うために、zabbix_agentd.conf にユーザーパラメーターを設定

**Zabbix側**

- **アイテムの作成**：バッチファイルを実行するアイテム（ユーザーパラメータ使用）と、その結果作成されたファイル（C:¥SQL¥lastUpdate¥lastUpdateFiles）を取得するアイテムを作成
- **トリガー**：任意の時刻になったら自動でメールを送信するトリガーを作成
- **アクション**：C:¥lastUpdate¥lastUpdateFiles の取得結果を、アクションのメッセージに展開するマクロを使用

# ●設定例

## **1.バッチファイルの作成**
以下を参考にバッチファイル C:¥SQL¥lastUpdate¥lastUpdate.bat を作成します。
C:¥SQL¥ フォルダ内で更新された最新ファイルを、C:¥SQL¥lastUpdate¥ 配下に lastUpdateFiles という固定ファイル名でコピーしてくれます。

```bash
# 書式
for /F "tokens=1" %%F in ('dir FromPath /b /o:D /a:-d') do set fname=%%F
copy FromPath¥%fname% ToPath

# 今回記述した内容
for /F "tokens=1" %%F in ('dir C:¥SQL /b /o:D /a:-d') do set fname=%%F
copy C:¥SQL¥%fname% C:¥SQL¥lastUpdate¥lastUpdateFiles
```
- FromPath：更新された最新ファイルをコピー元にしたいので、C:¥SQL を指定。
- ToPath：コピー先のパスをファイル名込みで指定

**フォルダ構成**

![スクリーンショット 2022-04-29 15.01.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359780/5ca1d73d-ac64-345b-4f92-544ee79637f8.png)

![スクリーンショット 2022-04-29 15.02.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359780/51980e71-2d1b-17f2-5b79-ba1218c983b7.png)

<br>

## **2.ユーザーパラメータの設定**
zabbix_agentd.conf の UserParameter を以下のように変更し、zabbix-agentサービスを再起動します。
```bash
# ユーザーパラメータ書式
UserParameter=任意のキー名,コマンドやスクリプトファイルのパス

# 今回記述した値
UserParameter=lastUpdate,C:¥SQL¥lastUpdate¥lastUpdate.bat
```
![スクリーンショット 2022-04-29 15.11.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359780/e9bdb13d-b3ec-8b36-6f38-8ddf53457341.png)
※zabbix_agentd.conf の場所は環境によって様々ですが、C:¥Program Files¥ 配下にZabbix用フォルダを準備しているのが一般的だと思います。上記フォルダ構成の場合、Zabbix用フォルダのconfフォルダ配下にあります。

<br>

## **3.バッチ実行用アイテム作成**
バッチファイルを実行するアイテムを作成します。
アイテムを作成したら、あとは自動で指定した時刻にバッチ処理が走ってくれます。

- **タイプ**：Zabbixエージェント
- **キー**：UserParameterに指定したキー
- **データ型**：文字列
- **監視間隔**：０（通常時は実行しない）
- **監視間隔のカスタマイズ**：例外設定
    - **監視間隔**：1h
    - **期間**：7,5:00-9:00（日曜の5:00-9:00に1時間間隔で実行。心配性なので少し広めに設定）


![スクリーンショット 2022-04-29 15.28.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359780/7ff54f38-bd5a-0fd4-99d8-b19ac9b52796.png)

![スクリーンショット 2022-04-29 15.23.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359780/3f349ca4-6787-d940-1e29-8547dba5757e.png)

無事 lastUpdateFiles が作成されました。このファイルを vfs.file.contents で取得します。

<br>

## **4.lastUpdateFiles 取得用アイテム作成**
lastUpdateFiles を取得するアイテムを作成します。
監視間隔はバッチ用アイテムと同じで大丈夫です。

- **タイプ**：Zabbixエージェント
- **キー**：vfs.file.contents[C:\SQL\lastUpdate\lastUpdateFiles,shift_jis]
- **データ型**：テキスト
- **監視間隔**：０（通常時は実行しない）
- **監視間隔のカスタマイズ**：例外設定
    - **監視間隔**：1h
    - **期間**：7,5:00-9:00（日曜の5:00-9:00に1時間間隔で実行。心配性なので少し広めに設定）

![スクリーンショット 2022-04-29 15.34.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359780/be5fbfc8-c265-05c0-26f4-3f6e28e68229.png)

![スクリーンショット 2022-04-29 15.47.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359780/5c6a4d4e-f7cd-46d5-574e-4bd85c3303b7.png)
lastUpdateFiles の中身を取得できました。次にこの取得結果を日曜10:00に自動送信するトリガーを作成します。
※実際に検証し、この記事を書いてるのは別の時間です。紛らわしいので赤線引いてます。時間通り実行されるのは検証できているのでご安心ください

<br>

## **5.自動送信用トリガーの作成**
自動送信用のトリガーを作成します。
time関数とdayofweek関数を使って、任意の日時に自動で送信できるように設定します。

![スクリーンショット 2022-04-29 15.57.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359780/ad8dc3b9-23df-b9b9-5e23-0dfa9c73852e.png)

```bash
# トリガー条件式
({Win2019:vfs.file.contents[C:\SQL\lastUpdate\lastUpdateFiles,shift_jis].time()}>100000
and
{Win2019:vfs.file.contents[C:\SQL\lastUpdate\lastUpdateFiles,shift_jis].time()}<100100)
and
{Win2019:vfs.file.contents[C:\SQL\lastUpdate\lastUpdateFiles,shift_jis].dayofweek()}=7
```
- \>100000：10:00になったら送信（正常→障害）
- \<100001：10:01になったら障害→正常
- =7：毎週日曜日

time関数やdayofweek関数のような時刻系関数は、30秒ごとにトリガーを評価します。なので障害イベント生成モードは単一にするのがオススメです。
また、指定した時刻にメールが飛べば良いので、全く関係ないアイテムを使用しても問題なく動作します。

<br>

## **6.アクションのメッセージ**
アクションのメッセージを指定します。ここは完全に好みだと思います。
マクロについては[Zabbix Documentation](https://www.zabbix.com/documentation/2.2/jp/manual/appendix/macros/supported_by_location)をご参考ください。

![スクリーンショット 2022-04-29 16.05.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359780/f288534d-79f3-0a1e-83b7-420e8943eb96.png)

![スクリーンショット 2022-04-29 16.21.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359780/e9f38792-d70d-d4bb-2ae0-650cbec8d8c2.png)
メールに展開されて届きました。
※こちらも先ほどと同じ理由で紛らわしいので赤線引いてます。

# ●まとめ
統合監視ツールZabbixのユーザーパラメータ機能や様々な方法を組み合わせ、ファイルを自動送信する方法をご紹介しました。
手作業でベンダに送信していたファイルをZabbixからそのまま自動送信する、というような自動化の第一歩などにも活用できると思います。

手順に誤り等ございましたら、ご指摘頂けますと幸いです。
この記事が少しでも皆様のお役に立てれば嬉しいです。

# ●参考
- [Zabbix Documentation](https://www.zabbix.com/documentation/2.2/jp/manual/appendix/macros/supported_by_location)