こんにちは、SCSK株式会社の大石です。
Zabbixにはディスカバリ機能があり、指定のネットワーク内から監視対象を見つけてホスト登録したり、テンプレートをリンクさせることもできますが、指定の時間で更新をかけることができなかったりホストを削除したい場合、すぐに消す場合はIPアドレスを除外→ホスト削除の操作が必要だったり、ちょっとだけ操作が必要になっています。
個人的にはホストだけ消して、IPアドレス除外を忘れて、後々復活。。。なんてことをやりそうです。
hostsファイルと同期取っておけば楽なのでは?と思いhostsファイルと同期とれるようにしてみました。
環境準備
以下のサーバを構築しておきます。
- ZabbixServer6.0 (Redhat9)
- 監視対象: WindowsServer 2019 x 1
- 監視対象: Redhat9 x 2(うち1台はAgent無)
今回はpythonを使用するため、ZabbixServerにはpython3をインストールしておきます。
python3では以下のライブラリを使用します。
- pyzabbix(zabbixのAPI使用する)
- pandas(hostsファイル加工用)
- subprocess(OSコマンド実行用)
pyzabbixとpandasはインストールが必要なので、以下のコマンドでインストールしておきます。
※あらかじめpipのインストールが必要です。
pip install pandas pyzabbix
実装
pythonでスクリプトを書いていきます。
まず、使用するライブラリをインポートしておきます。
import pandas as pd
import pyzabbix
import subprocess
pyzabbixには、ZabbixWebコンソールのURLとログイン情報を指定します。
# Zabbixログイン情報
zapi = pyzabbix.ZabbixAPI("http://172.23.32.191/zabbix")
zapi.login('Admin','zabbix')
hostsファイルを取得し、Zabbixのホストには使用できない特殊文字を”_”に変換します。
# /etc/hostsファイル取得
df = pd.read_table("/etc/hosts",sep="\s+",header=None, index_col=None)
# ホスト名の列に特殊文字(ドット、ハイフン、アンダーバーを除く)がある場合、アンダーバーに置換
df[1]=df[1].replace(r'[^a-zA-Z0-9_.-]','_',regex=True)
hostsfile=df.iloc[:,[0,1]]
ZabbixServerのホスト登録する関数です。
# ZabbixServer登録
def zabbix_regist(hostname,ipaddr,templateid):
zapi.host.create(
host=hostname,
interfaces=[
{
"type":1,
"main":1,
"useip":1,
"ip":ipaddr,
"dns":"",
"port":"10050"
}
],
groups=[
{
"groupid":"23"
}
],
templates=[
{
"templateid":templateid
}
]
)
hostsファイルから、IPアドレスとホスト情報を取り出し、接続可否、OSの種類(WIndowsかLinux)などで振り分けて、登録します。
接続可能で、ZabbixAgentが使用できれば、WindowsとLinuxで分岐させて各Windows用Linux用でテンプレートを登録し、Agentが使用できない場合は、Pingテンプレートを割り当てます。
def main():
# hostsファイルから、1行ずつ2列目(ホスト名)を引数に、ZabbixServerからホスト情報を取得
for index,row in hostsfile.iterrows():
hosts=zapi.host.get(
filter={
"host":[row[1]]
}
)
# ホスト情報がZabbixに登録されていない場合、対象のマシンの情報を取得する
if not hosts:
# fpingで接続状況を確認
ping_result=subprocess.run(["fping","-r","1",row[0]],capture_output=True,text=True).stdout
# 接続できる場合、ZabbixAgentの有無を確認
if ping_result.find("alive"):
zabbixagent_ping=subprocess.run(["zabbix_get","-s",row[0],"-p","10050","-k","agent.ping","-t","1"],capture_output=True,text=True).stdout
# ZabbixAgentが起動されている場合、LinuxかWindowsか確認し、それぞれのOS事のテンプレートを指定し、ZabbixServerに登録
if zabbixagent_ping:
#監視退場のOS情報を取得
os_info=subprocess.run(["zabbix_get","-s",row[0],"-p","10050","-k","system.uname","-t","1"],capture_output=True,text=True).stdout
if os_info.startswith("Linux"):
# 100001がWindos用の監視テンプレートのID
zabbix_regist(row[1],row[0],10001)
elif os_info.startswith("Windows"):
# 100081がWindos用の監視テンプレートのID
zabbix_regist(row[1],row[0],10081)
# ZabbixAgentが起動されていない、またはインストールされていない場合、Ping監視テンプレートのみ登録する。
else:
# 10186がPing監視テンプレートのID
zabbix_regist(row[1],row[0],10186)
ZabbixServerから登録されているホスト情報を取得し、hostsファイルに登録されていないホストは削除します。
# /etc/hostsファイルに登録されていないホストをZabbixServerから削除する
# すべてのホスト情報を取得
allhosts=zapi.host.get()
for host in allhosts:
# /etc/hostsファイル内に、取得したホスト情報が含まれていないのか確認
# 含まれていない場合、該当するホストを削除する。
if not (hostsfile[1] == host["host"]).any():
zapi.host.delete(host["hostid"])
スクリプト実行
hostsファイルは以下の様に記述しておきます。
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.23.32.191 ZabbixServer 172.23.32.187 testLinux-Agent 172.23.32.232 testLinux-Agentless 172.23.32.190 TestWIN,SCSK
Zabbixのホスト登録状況は以下の様にしておきます。
Zabbix Server(ホスト名: ZabbixServer)のみ残しておきます。
実装したファイル名は何でもいいですが、今回は「zabbix_autoregistration.py」としました。
以下のコマンドで実行します。
python3 zabbix_autoregistration.py
実行すると以下の様に登録されます。
では、hostsファイルから、ホストを削除、ホスト名の変更をして、再実行します。
hostsファイルは以下のようにします。
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.23.32.191 ZabbixServer 172.23.32.187 testLinux-Agent 172.23.32.190 TestWIN,SCSKTEST
「TestWIN,SCSK」→「TestWIN,SCSKTEST」に変更しました。また、「testLinux-Agentless」を削除してみました。
この状態で再実行すると、以下の様になります。
「TestWIN,SCSKTEST」にホスト名が変更され、「testLinux-Agentless」が削除されました。
あとは、cronなどで、深夜帯に実行仕掛けておけば、指定の時間で同期取れるようになります。
課題
ホスト名変更は出来ているのですが、一回ホスト追加→削除で実現しているため、変更処理が必要です。
また、ZabbixServerを除外する処理はできていないので、この辺りを追加する必要があると考えています。
ネットワーク機器も対応できるようにしていきたいです。
今後の活動
課題の対処はもちろんですが、適用するテンプレートの選択をOSだけではなくて、ミドルウェアや物理・仮想等…サーバ環境によってテンプレートにできるようにしたいです。とはいえ、千差万別とある中、そのあたりを人が介すると難しいと思うので、もう少しやり方を考えて実装をしていきたいと思います。
SCSK Plus サポート for Zabbix
★YouTubeに、SCSK Zabbixチャンネルを開設しました!★
★Twitterに、SCSK Zabbixアカウントを開設しました!★