檢查服務器所有監聽端口和其對應的服務名稱的腳本可以參考https://blog.zzyyxx.top/blog/post/gordy/acf57f04f9e1 現在準備加入zabbix自動發現規則並實現批量監控主機的這些TCP監聽端口。
1)考慮到zabbix的運行用戶是zabbix,zabbix用戶需要root權限才能執行netstat -p參數,這裏不打算使用把zabbix用戶加入sudo來實現。
而是折中的方法:
先使用root用戶執行腳本python checkallports.py 生成服務器所有監聽端口和其對應的服務名稱的json文本,生成的文件名是allports.log(如果服務經常變動,可以把python checkallports.py 加入crontab定時刷新allports.log的json文件內容)
cat checkallports.py
#!/bin/python import os import subprocess import json def filterlist(cmd): plist = [] mlist = [] getcmd = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE).stdout.readlines() for line in getcmd: port = line.split()[3].split(':')[-1] pname = line.split()[6].split('/')[1] pp = [port, pname] plist.append(pp) for i in plist: pdict = {} pdict['{#PPORT}'] = i[0] pdict['{#PNAME}'] = i[1] mlist.append(pdict) return mlist def main(filename,cmd2): mlist = filterlist(cmd) result = {} result['data'] = mlist with open(filename,'w') as f: f.write(json.dumps(result, sort_keys=True, indent=4)) subprocess.Popen(cmd2,shell=True,stdout=subprocess.PIPE).stdout.readlines() if __name__ == '__main__': cmd = 'netstat -antulp|grep LISTEN|grep -v ssh|grep -v zabbix' filename = '/data/app/zabbix/share/allports.log' cmd2 = 'chown zabbix.zabbix %s'%(filename) main(filename,cmd2)
然後再使用zabbix用戶去讀取這個json文本allports.log
cat displayallports.py
#!/bin/python import os with open('/data/app/zabbix/share/allports.log','r') as f: for line in f.readlines(): print(line)
最後執行python displayallports.py 即可得到需要的json信息
2)在zabbix_agentd.conf添加配置
UserParameter=ports.discovery,python /data/app/zabbix/share/displayallports.py
3)在模板裏創建發現規則
依次進入:配置>>模板>>自動發現規則>>創建發現規則
4)創建發現規則
5)創建監控項原型 {#PPORT} {#PNAME} 就是從執行python displayallports.py 獲得的json信息
6)最後進入 配置>>主機>>選擇一臺主機的監控項查看,可以看到有 自動發現規則ALL TCP Ports discovery生成的監控項
參考 http://www.xiaomastack.com/2015/07/04/zabbix-auto-tcp-port/