mattintosh note

どこかのエンジニアモドキの備忘録

PING の結果をひたすら Zabbix に送るだけのスクリプト

前回は SQLite を使ってやってみたけど、今回は Zabbix にそのまま送る方法。

PING コマンドの出力の時間部分だけを使う。

$ ping localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.094 ms
:

Zabbix 側には予め Zabbix トラッパーでアイテムを作成しておく。今回は「ping_now」という名前。

grep してすぐ出力したいので stdbuf を噛ませる。

#!/bin/bash

PING_HOST=192.168.1.1
PING_INTERVAL=5
ZABBIX_SENDER_HOST=raspberrypi
ZABBIX_SENDER_KEY=ping_now
ZABBIX_SERVER_HOST=192.168.1.200
ZABBIX_SERVER_PORT=10051

ping -i${PING_INTERVAL} ${PING_HOST} | stdbuf -oL grep -E -o 'time=[0-9.]+' | while read
do
    eval ${REPLY}
    test -n "${time}" || continue
    nc ${ZABBIX_SERVER_HOST} ${ZABBIX_SERVER_PORT} <<!
{
    "request": "sender data"
,   "data": [
        {
            "host": "${ZABBIX_SENDER_HOST}"
        ,    "key": "${ZABBIX_SENDER_KEY}"
        ,  "value": "${time}"
        }
    ]
}
!
done

set -x で見るとこんな感じのが続く。

+ eval time=116
++ time=116
+ test -n 116
+ nc 192.168.1.200 10051
ZBXDZ{"response":"success","info":"processed: 1; failed: 0; total: 1; seconds spent: 0.000077"}+ read

最小/平均/最大の計算は Zabbix 側でやってくれるので楽ちん。

f:id:mattintosh4:20171204001553p:plain