バージョンアップしました。
・NatureRemoをZabbixテンプレート化
・LLDでのremo検出
・複数台remo対応
・温度/湿度/照度に対応
Zabbixさえ使えるならこっちの方が簡単だと思います。
remoのトークン取得までは前回記事参照。
kodate.hatenablog.com
ちなみにウチではこれをdockerコンテナ化したZabbix-agentで動かし、同じくZabbix-proxyコンテナからクラウド上のZabbixサーバーにデータを投げてますが、そのあたりまで解説し始めるとキリがないので省略。
手順
というわけでZabbixがわかってる人向けにゴリゴリ進めて参ります。
- Zabbix-Agent側にスクリプトを配置
クラウド上のRemoサーバーから取ってきたJSONデータを
別のJSONフォーマットで再整形するというけったいなスクリプト。
何せスクリプトスキルが低いので、試行錯誤の結果こうなったというだけ。
その過程でjqを知った今となっては、たぶんこんなことしないでも直接jqだけで整形できるなぁと思う。
vi /usr/local/bin/remo-json.sh
#!/bin/bash rm /tmp/remo* LF=$(printf '\\\012_') LF=${LF%_} DS=" " curl -s -X GET "https://api.nature.global/1/devices" -H "accept: application/json" -H "Authorization: Bearer $1" |sed 's/{\"name\"/'"$LF{\"name\""'/g' > /tmp/remo ROWS=$(cat /tmp/remo | wc -l) REMONUM=$ROWS loop=`expr $ROWS - 1`;#֤ i=0; echo -e -n '{\n\t"data":[\n' while true do REMONUM=`expr $REMONUM + 1` eval NAME${REMONUM}=$(sed -n ${REMONUM}p /tmp/remo |awk '{print substr($0, index($0, "\"name\""))}'|awk '{sub("id.*", "");print $0;}'|sed -e 's/"//g'|sed -e 's/,//g'|sed -e 's/name://g') eval TEMP${REMONUM}=$(sed -n ${REMONUM}p /tmp/remo |awk '{print substr($0, index($0, "\"te\""))}'|awk '{sub("created.*", "");print $0;}'|sed -e 's/"//g'|sed -e 's/,//g'|sed -e 's/{//g'|sed -e 's/te:val://g'|awk '{printf("%d",$1 + 0.5)}') eval HUMI${REMONUM}=$(sed -n ${REMONUM}p /tmp/remo |awk '{print substr($0, index($0, "\"hu\""))}'|awk '{sub("created.*", "");print $0;}'|sed -e 's/"//g'|sed -e 's/,//g'|sed -e 's/{//g'|sed -e 's/hu:val://g'|awk '{printf("%d",$1 + 0.5)}') eval ILLUMI${REMONUM}=$(sed -n ${REMONUM}p /tmp/remo |awk '{print substr($0, index($0, "\"il\""))}'|awk '{sub("created.*", "");print $0;}'|sed -e 's/"//g'|sed -e 's/,//g'|sed -e 's/{//g'|sed -e 's/il:val://g'|awk '{printf("%d",$1 + 0.5)}') echo -e -n "\t\t" eval echo '{ \"{#REMONAME}\":\"''$NAME'$REMONUM'\",\"{#REMOTEMP}\":\"''$TEMP'$REMONUM'\",\"{#REMOHUMI}\":\"''$HUMI'$REMONUM'\",\"{#REMOILLUMI}\":\"''$ILLUMI'$REMONUM'\" }' REMONUM=`expr $REMONUM - 2`; i=`expr $i + 1` if [ $i -le $loop ]; then echo -e -n "," elif [ $i -gt $loop ]; then break fi done echo -e -n '\t]\n' echo "}" exit 0
- remo-json.shに権限付与
chmod +x /usr/local/bin/remo-json.sh chown zabbix:zabbix /usr/local/bin/remo-json.sh
# /usr/local/bi/remo-json.sh [取得したトークン] { "data":[ { "{#REMONAME}":"ベッド","{#REMOTEMP}":"26","{#REMOHUMI}":"0","{#REMOILLUMI}":"0" } , { "{#REMONAME}":"リビング","{#REMOTEMP}":"22","{#REMOHUMI}":"40","{#REMOILLUMI}":"70" } ] }
こんな感じにデータが返ってきます。
- Zabbix-Agent側にuserparameterを定義
スクリプトが吐き出すJSONデータからLLDでRemoを検出し、それらの温湿度とかを取得。
vi /etc/zabbix/zabbix_agentd.d/userparameter_natureremo.conf
UserParameter=natureremo.discovery[*],/usr/local/bin/remo-json.sh $1 |jq . | tee /tmp/rmt UserParameter=natureremo.temp[*],cat /tmp/rmt | sed -e "s/{#//g"|sed -e "s/}"\"":/"\"":/g"|jq -r '.data[] | select(.REMONAME=="$1")|.REMOTEMP' UserParameter=natureremo.humi[*],cat /tmp/rmt | sed -e "s/{#//g"|sed -e "s/}"\"":/"\"":/g"|jq -r '.data[] | select(.REMONAME=="$1")|.REMOHUMI' UserParameter=natureremo.illumi[*],cat /tmp/rmt | sed -e "s/{#//g"|sed -e "s/}"\"":/"\"":/g"|jq -r '.data[] | select(.REMONAME=="$1")|.REMOILLUMI'
- 動作確認
AgentかServer上とかで、zabbix_getで実際に値を取ってみます。
ところで[任意の値]を表現する角括弧と、実際に必要な角括弧が混じっててわかりづらい感じになってますが、natureremo.discoveryの後ろは角括弧[]の中にトークンを入れてください。他は角括弧不要。
# zabbix_get -s [AgentのIP] -k natureremo.discovery[[取得したトークン]] { "data": [ { "{#REMONAME}": "ベッド", "{#REMOTEMP}": "26", "{#REMOHUMI}": "0", "{#REMOILLUMI}": "0" }, { "{#REMONAME}": "リビング", "{#REMOTEMP}": "22", "{#REMOHUMI}": "40", "{#REMOILLUMI}": "60" } ] }
- Zabbixテンプレートを作成
名前はご自由に、"Template NatureRemo"など。
xmlテンプレートファイルはこちら。
Zabbix Share - Template NatureRemo
ただしZabbix4.0で出力してるのでそれ以上じゃないと取り込めないはず。
難しいことは一切してないので、以下の通り手で作れば2.2ぐらいでも使えると思います。
テンプレートのマクロ | |
マクロ | {$REMO_BEARER} |
値 | empty |
ディスカバリルール | |
名前 | NatureRemo Discovery |
タイプ | Zabbixエージェント |
キー | natureremo.discovery[{$REMO_BEARER] |
アイテムのプロトタイプ | |
名前 | {#REMONAME} 室温 |
タイプ | Zabbixエージェント |
キー | natureremo.temp[{#REMONAME}] |
データ型 | 数値(浮動小数) |
単位 | ℃ |
アイテムのプロトタイプ | |
名前 | {#REMONAME} 湿度 |
タイプ | Zabbixエージェント |
キー | natureremo.humi[{#REMONAME}] |
データ型 | 数値(整数) |
単位 | % |
アイテムのプロトタイプ | |
名前 | {#REMONAME} 照度 |
タイプ | Zabbixエージェント |
キー | natureremo.illumi[{#REMONAME}] |
データ型 | 数値(整数) |
単位 | lx |
- Zabbixホストを作成
Zabbixエージェントホストに上のテンプレを割り当て、以下のようにホストマクロを編集。
継承したマクロとホストマクロ | |
マクロ | {$REMO_BEARER} |
実効値 | 取得したremoトークン |
テンプレDLした人はテンプレに含まれてますが、手入力した人はグラフも手で作ってもらえれば、こんな感じのグラフが描けます。