Zabbixのユーザーは、「メディア」という属性の中にメールアドレスを設定することができます。
通常Zabbix WebUIでは、ユーザー名で検索してメディアにたどり着くことはできますが、メディアで検索してユーザー名にたどり着く、といった逆引きのような検索はできません。
まじかよ!
そこで今回はPythonとPythonフレームワークのstreamlit、そしてインフラ部分にはDockerを使ってZabbixのユーザー検索アプリを作ってみました。
1.PythonとZabbixAPIを使用したコーディング
事前準備
以下、事前準備を行います。(手順は割愛します。また、Zabbixは事前に構築済みとします)
- 仮想サーバを作成(OSインストール ~ 初期設定も)
- Docker Engineをインストール
- streamlitとrequestsをpipでインストール
実際には、streamlitとrequestsはDockerコンテナの中で導入するので、事前にインストールしなくても特に問題ありません。
コードの実行結果をローカルで確認するために、事前にインストールしておくのをオススメします。
コーディング
では早速、Zabbixユーザー検索を行うためのコードを書いていきます。
Zabbixログイン処理を記述したzabbix_login.pyと変数等をまとめたvariables.pyを、あらかじめ別のpyファイルとして作成しておいて、メインとなるzabbix_user_get.pyでimportしてみました。
variables.py
url = "http://172.16.171.40/zabbix/api_jsonrpc.php"
headers = {
"Content-Type": "application/json-rpc"
}
zabbix_login.py
import requests
import json
from variables import url, headers
def zabbix_login():
data = {
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "Admin",
"password": "zabbix"
},
"id": 1,
"auth": None
}
res = requests.post(url, json=data, headers=headers)
if res.status_code == 200:
res_data = res.json()
auth = res_data['result']
return auth
zabbix_user_get.py
import requests
import json
import zabbix_login
from variables import url, headers
import streamlit as st
# フロントエンド
st.title("Zabbixユーザー検索ツール")
st.write("")
mail_address = st.text_input("メールアドレスを入力(@以降必須)")
st.write("")
st.write("")
st.write('<b><span style="color:coral">●結果(ユーザー名:グループ名)</span></b>',unsafe_allow_html=True)
# ユーザー情報取得メソッド
def zabbix_user_get():
data = {
"jsonrpc": "2.0",
"method": "user.get",
"params": {
"output": ["alias","medias","url"],
"selectUsrgrps": ["usrgrpid", "name"],
"selectMedias": ["mediatypeid", "sendto"],
},
"id": 1,
"auth": auth
}
res = requests.post(url, json=data, headers=headers)
if res.status_code == 200:
res_data = res.json()
result = res_data['result']
return result
# メソッド実行
auth = zabbix_login.zabbix_login()
result = zabbix_user_get()
flag = False
# ユーザー情報取得処理
if mail_address:
for i in result:
if i['medias'] != []:
for j in range(len(i['medias'])):
if i['medias'][j]['sendto'][0] == mail_address:
alias = i['alias']
groups = i['usrgrps'][0]['name']
st.success(f"{alias}:{groups}")
st.write('<span style="font-size:500%">:white_flower:</span>',fe_allow_html=True)
flag = True
break
if flag == False:
st.error("見つかりませんでした")
2. Dockerイメージ作成
ディレクトリ作成
/webapp/zabbix/
∟Dockerfile
∟requirements.txt
∟src/
∟zabbix_user_get.py
∟zabbix_login.py
∟variables.py
上記を参考に、仮想サーバの中に諸々のディレクトリを作成します。
Dockerfileとrequirements.txtはviで作成し、src配下には作成したpyファイルをすべて格納しておきます。
Dockerfile
FROM python:3.7.12-slim-buster
RUN mkdir /src
WORKDIR /src
COPY requirements.txt /src
RUN apt-get update && apt-get -y upgrade
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
EXPOSE 8501
COPY /src /src
CMD ["streamlit", "run", "zabbix_user_get.py"]
- RUN mkdir /src:コンテナ内に/srcディレクトリを作成
- WORKDIR /src:作成したコンテナ内の/srcディレクトリを作業ディレクトリにする
- COPY requirements.txt /src:コンテナ内に作成した/srcディレクトリに、コンテナの土台である仮想サーバに事前に格納しておいたrequirements.txtをコピー
- EXPOSE 8501:コンテナ起動後に接続するポート番号
- COPY /src /src:コピー元(仮想サーバ側の/srcディレクトリ) コピー先(コンテナ内の/srcディレクトリ)
- CMD [“streamlit”, “run”, “zabbix_user_get.py”]:コンテナ起動時にコンテナ内部で実行したいコマンドを配列形式で記述。
requirements.txt
streamlit
requests
- 必要なライブラリ名を改行で記述。
3. Dockerイメージビルド ~ コンテナ起動
これまでの準備を元にDockerイメージを作成し、作成したDockerイメージからコンテナを起動します。
# Dockerfileの階層に移動
cd /webapp/zabbix/
# ビルド
docker build -t zabbix_user_get .
# 確認
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
zabbix_user_get latest 10b80b6d16f2 9 seconds ago 610MB
# コンテナ起動
docker run --name zabbix_user_get -dit -p 8501:8501 zabbix_user_get
あとはブラウザのURLフォームに「http://仮想サーバのIPアドレス:8501」と入力して、GUIアクセスすることができれば、Zabbixユーザー検索用の簡易Webアプリ完成です。
例)仮想サーバのIPが192.168.0.100の場合 → http://192.168.0.100:8501と入力
4.Webアプリの実行
それでは試しに以下の「TestUser」の持つメディア属性の設定値「TestUser@example.com」から、ユーザー名とユーザーグループ名を検索してみましょう。
事前に以下のユーザーが作成されていることとします。
ユーザー
メディア
完成したWebアプリのグレーのフォーム部分に「TestUser@example.com」と入力します。
以下のように緑色で結果が出力されれば成功です。
コメント