前回は、Zabbix の外部チェック機能を使って、RSS のデータを Zabbix へ格納する処理について、記述をしましたが、いまいち、美しくない点と、今後 AWS Lambda などに移し替えることを考えると、別のやり方のほうが良いかもしれないと思い、Zabbix sender を使用して実装することにしました。
前回の記事はこちら ⇒ RSSのデータをZabbixへ格納する(外部チェック編)
環境 (前回と同じ)
- CentOS 8.0 (インターネットへアクセスできること)
- Python 3.6
- Zabbix 5.0
実現したこと (前回と同じ)
- Python を使って RSS を取得する
- 前回からのアップデート分を取得し、Zabbix のアイテムへ格納する
ここではお話しないこと (前回と同じ)
- Python の初期設定方法
- Zabbix のインストール方法
- Zabbix の一般的な機能説明
Pythonで実現したこと
基本的に流れは同じです。唯一違うのは、最後に Zabbix へ向けて、Zabbix sender を実行している点です。
コードは以下の通りです。
#!/bin/env python3
import feedparser
from datetime import datetime, timedelta, timezone
from pyzabbix import ZabbixMetric, ZabbixSender
# 前回の期間を設定 (今回は1時間前の時間を指定)
lasttime = (datetime.utcnow() - timedelta(hours=1))
#RSSのURL
RSS_URL = "(URLを指定)"
feed = feedparser.parse(RSS_URL)
# 前回の時間以降にアップデートされた記事を取得
def f(entry):
return datetime(*entry.updated_parsed[:6]).date() >= lasttime
# フィルタ関数を使用しデータを選定し、update時刻でソート
rdflists = list(filter(f, feed.entries))
rdflists.sort(key=lambda x: x['updated'])
# 何もない時は処理を終わる
if not rdflists:
sys.exit()
msgs = []
for entry in rdflists:
title = entry.title
link = entry.link
time = entry.updated
msg = title + ' / ' + link + ' / ' + time
msgs.append(ZabbixMetric('(ホスト名)', '(key名)', msg))
result = ZabbixSender(use_config=True).send(msgs)
Zabbixサーバへのコードの配置
今回は Zabbix からの実行ではなく、cron によって実行するため、配置場所とユーザはご自身の環境に合わせて設定してください。
また、今回は実施していませんが、コードを実行するサーバへの配置でも構いませんが、コードの最終行の設定を一部変更する必要がありますので、ご注意ください。
Zabbixで設定したこと
Zabbix では、前回と同じように専用の Item を作成します。
今回は、タイプに「Zabbix トラッパー」を指定します。前回とは違い、Zabbix は処理を待つだけですので、間隔の指定は有りません。
前回実現できなかったことができた
上記を設定し、いざ実行すると、無事に更新情報1件に対し、ヒストリ1レコードに格納できました!
この方法では、Zabbix サーバ以外でも処理が実行できるので、別の用途でも使用することができるかもしれません。