PythonとDockerとZabbixで簡単な Webアプリを作ってみた

Projects
Projects

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」と入力します。

以下のように緑色で結果が出力されれば成功です。

コメント

タイトルとURLをコピーしました