天気情報を蓄積しておきたいなぁと思っていたところ、天気情報をAPIで提供しているサービスがあったので、それを利用してZabbixと連携する方法をまとめてみました。
といっても何番煎じなのか分かりませんが。
確認環境:
- CentOS 6.6
- Zabbix 2.4.4
OpenWeatherMap
こちら、APIの形で色々とデータを提供されているのでそちらを利用します。
実際にAPIで問い合わせる
詳細はAPIのページを参照していただくと良いのですが、以下の様な感じでデータを取得できます。
$ curl "http://api.openweathermap.org/data/2.5/weather?q=tokyo,jp&units=metric" | jq . % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 120 480 0 480 0 0 2789 0 --:--:-- --:--:-- --:--:-- 4897 { "cod": 200, "name": "Tokyo", "id": 1850147, "dt": 1426548821, "coord": { "lat": 35.69, "lon": 139.69 }, "sys": { "sunset": 1426495751, "sunrise": 1426452638, "country": "JP", "message": 0.0071 }, "weather": [ { "icon": "10n", "description": "light rain", "main": "Rain", "id": 500 } ], "base": "cmc stations", "main": { "humidity": 100, "grnd_level": 1027.48, "sea_level": 1032.29, "pressure": 1027.48, "temp_max": 10.799, "temp_min": 10.799, "temp": 10.799 }, "wind": { "deg": 344.506, "speed": 6.41 }, "clouds": { "all": 92 }, "rain": { "3h": 0.82 } }
q= で町の名前を指定units=metricで気温を摂氏(℃)で取得できるようになります。未指定だとケルビンでの取得となります。華氏の場合はimperialになります。
なおデータを整形するためにJSONパーサのjqを導入しています。未導入の方は導入するようにしてください。
CentOSの場合は
yum install jq
Zabbixに設定していく
で、この後は、整形したデータをZabbixに導入するだけです。
本当はPythonなどを使用するべきなのでしょうが、自分にはその力がないので強引にシェルスクリプトでスクリプトを作成してみました。
スクリプトは以下に置いてあります。
zabbix_weather_check/check_weather.sh at master · kometchtech/zabbix_weather_check /
https://github.com/kometchtech/zabbix_weather_check/blob/master/check_weather.sh
天気情報取得部、天気日本語化部、風向き日本語化部に分かれています。
#!/bin/bash # http://openweathermap.org/current CITY=$1 WEATHER=$2 CURLURL="http://api.openweathermap.org/data/2.5/weather?q=" CURLOPTS="-m 30 --retry 10 -s" APIKEY="" DATA="" case $WEATHER in "weather") while [ "$DATA" = "" -o "$DATA" = "failed to connect " ] do DATA=`curl ${CURLOPTS} "${CURLURL}${CITY}&APPID=${APIKEY}"&units=metric` done weatherCode `echo ${DATA} | jq .weather[0].id` ;;
とりあえずAPIの取得の際にエラーが出る時があるので、なんとなくのエラー処理をいれています(これでいいのか分かりませんが)。また、個々のデータを取得するためにjqのフィルタリング機能を利用してデータを指定するようにしています。
function weatherCode() { case $1 in # Thunderstorm 200) echo "小雨と雷雨" ;; 201) echo "雨と雷雨" ;; 202) echo "大雨と雷雨"
天気部分については、天気IDを取得できるので、それを判定して日本語情報を返すようにしています。こちらは参考先をパクリリスペクトしています。
function windDegree() { degree=$1 degree=`echo $degree * 10000 | bc` > /dev/null 2>&1 degree=${degree%.*} if [ ${degree} -gt "2250000" ]; then degree=`expr ${degree} + 3600000` fi if [ 225000 -lt $degree -a $degree -le 675000 ]; then echo "北東" elif [ 675000 -lt $degree -a $degree -le 1125000 ]; then
風向きも同じです。Degreeとか知らんかったです(数学忘れた・・・)
あとは、Zabbixサーバの外部スクリプトを読み出す場所にスクリプトを配置します。
そして、アイテムとしてスクリプトを指定します。
あとはデータが取得できるかどうかを確認します。
普通に使う分には問題にならないと思いますが、APIについては1分間あたり3000回までに制限されているようです(無料プランの場合)。アプリなどを使用してそれ以上になる場合は、APIキーの取得と合わせて有料プランを選択する必要があるそうです。
Weather API Price-list /
http://openweathermap.org/price
データを1年ぐらい取得しておけば、1年こんなことがあったなぁと思いだせたりすることもあると思うので、色々と活用してみると面白いかもしれません。