在zabbix中添加新主機時,是需要手動添加,但在zabbix的Action裏有兩項功能,自動發現與自動註冊,運用這兩個功能中任意一個都可以實現自動添加機器,但添加的主機名是IP地址。
自動發現:添加discovery規則後,zabbix sever端基於IP範圍對agent機器進行掃描,並把掃描到的機器添加到web端。zabbix server端的操作,會使其壓力很大
自動註冊:zabbix agent端會自動發送信息到server端,然後agent主機會被添加到web端。zabbix agent端的操作
建議使用自動註冊功能,當在zabbix web端配置完discovery規則後,以後公司新增機器,就算不在一個網段,只要能夠與server機器通信,修改一下agent配置文件,就可以自動添加主機。當把服務安裝做成標準化,基本就很省心。
工具: python 3.5
使用到的模塊:configparser, getopt, pymysql, os, sys
使用說明: dbname.txt需要手動更新,也可以直接用mysql -e show database > dbname.txt 但需要注意格式, 自動註冊每個庫
效果圖, 添加一次,以後只要有新加數據庫統一給它監控上, 每時間查看數據庫的增長
1. 官網配置說明
地址: https://www.zabbix.com/documentation/3.4/zh/manual/discovery/auto_registration
# 這裏定義自動註冊的方式
1、安裝fping
yum -y install fping
2、步驟說明
名稱:自動註冊動作Linux
條件:
計算類型:AND
條件(A):主機元數據 似 Linux
條件(B):主機元數據 似 21df83bf21bf0be663090bb8d4128558ab9b95fba66a6dbf834f8b91ae5e08ae
操作
向用戶發送消息:通過Admin發送所有媒體
添加到主機組:Linux servers
鏈接到模板:Template OS Linux
3、zabbix_agentd.conf配置
Server=地址
ServerActive=地址
HostnameItem=system.hostname # 獲取主機名稱
HostMetadataItem=system.uname
HostMetadata=Liunx 21df83bf21bf0be663090bb8d4128558ab9b95fba66a6dbf834f8b91ae5e08ae
RefreshActiveChecks=60 # 刷新時間爲60秒, 實驗環境弄短一點,線上長一點
# 腳本
UserParameter=io.dis.status[*],/usr/local/zabbix/script/disk/discovery_iostat_disk.sh
UserParameter=io.status[*],/usr/local/zabbix/script/disk/zabbix_iostat_disk.sh $1 $2
2、腳本
文件結構如下
[root@xx mysqlDemo]# tree
.
├── conf
│?? └── conf.ini
├── dbname.txt
├── mysqlDemos
│?? ├── conn.py
│?? ├── conn.pyc
│?? ├── dbname_list_json.py
│?? ├── __init__.py
│?? ├── list.py
│?? ├── list.pyc
│?? ├── main.py
1、conf (conf.ini)
[DEFAULT]
user = test
password = test
host = 192.168.2.x
port = x
[FILE]
file_name = 這裏寫文件 如dbname.txt # 數據庫的名稱 格式如下
base_path = 這裏寫地址 # 需要定義絕對路徑, 需要注意的是路徑不能帶有中文, 否則會報錯
test.txt
Database
information_schema
blogstie
hellodb
mydb
....
2、mysqlDemo (conn.py)
#!/usr/local/bin/python3
#
# Name: conn mysql
# Version Number:1.01
# Type: db select
# Language:python3
# Date:2019-1-8
# Author:xiong
import pymysql
class MysqlConnect:
'''
用於連接數據庫,並處理sql語句, 需要用到 list.py中獲取的數據庫連接
'''
def __init__(self, user, pwd, host, dbname, port=3306):
self.user = user
self.pwd = pwd
self.host = host
self.dbname = dbname
self.port = port
def run_sql(self,sql_con):
cont = pymysql.connect(host=self.host, port=self.port, user=self.user, passwd=self.pwd, database=self.dbname)
self.cursor = cont.cursor(cursor=pymysql.cursors.DictCursor)
try:
self.cursor.execute(sql_con)
return self.cursor.fetchall()
except Exception:
return "sql error"
3、mysqlDemo(list.py)
#!/usr/local/bin/python3
#
# Name: zabbix discovery
# Version Number:1.01
# Type: zabbix data json
# Language:bash shell
# Date:2019-1-9
# Author:xiong
import os
import re
class Files:
'''
用於zabbix discovery json dict 自動發現的json格式
{"data":[{"{#nmae}":"value1" }, {"{#name}":"value2" }]}
'''
def __init__(self, file_name, base_path):
self.file_name = file_name
self.base_path = base_path
self.whitelist = ["information_schema", "mysql", "test", "performance_schema", "Database", "user"]
self.data = {}
self.data2 = []
def file_txt(self):
self.file_name = os.path.join(self.base_path, self.file_name)
with open(self.file_name, 'r', encoding="utf-8") as F:
for line in F.readlines():
line= line.strip("\n")
if line not in self.whitelist :
self.data2.append({"{#DBNAME}":line})
# zabbix discovery need {"data":[{"":""}, ]}
self.data["data"]=self.data2
# return json
return self.data
def zab_list(self):
print('{\n "data":[\n')
for num, datalist in enumerate(self.data["data"]):
change = re.sub("\'","\"",str(datalist)) # ' change "
print(" ", change, end="")
if num < int(len(self.data["data"])) - 1:
print(",")
print('\n\n ]\n}')
# file = Files("dbname.txt", "/usr/local/zabbix/script/mysql/mysqlDemo")
# file.file_txt()
# file.zab_list()
打印的格式如下, zabbix要求的格式
{
"data":[
{"{#DBNAME}": "xx"},
{"{#DBNAME}": "xx"},
]
}
4、mysqlDemo (main.py) # 主執行類 也可以新建一個py 然後只運行 main
#!/usr/local/bin/python3
#
from list import Files
from conn import MysqlConnect
import configparser
import os
import sys
import getopt
class mysqlJunde:
def __init__(self):
self.conf = configparser.ConfigParser() # 生成操作句柄
self.path = os.path.abspath(os.path.join(os.getcwd(), ".."))
self.confPath = os.path.join(self.path, "conf", "conf.ini")
self.arg_list = ["indexSize", "dbsize", "tableLine"]
self.conf.read(self.confPath) # 讀取文件
self.file_list = []
def dbname(self, arg):
self.filename = self.conf["FILE"]["file_name"]
self.basepath = self.conf["FILE"]["base_path"]
self.files = Files(self.filename, self.basepath).file_txt()
for data_list in self.files["data"]:
self.file_list.append(data_list["#{DBNAME}"])
if arg in self.file_list:
self.file_list = [] # 如果存在就置爲空
return True # 存在就返回數據庫, 不存在就返回none
def arg(self, args):
if args in self.arg_list:
return True
# 用於接受終端發來的參數
def terminal(self):
opts, args = getopt.getopt(sys.argv[1:], "hi:o")
for op, value in opts:
if op == "-h":
self.usage()
if len(args) == 2:
if self.dbname(args[0]) and self.arg(args[1]):
ret=self.mysqlconf(*args)
return ret
# 當其它輸入條件都不滿足的時候 直接提示
self.usage()
def mysqlconf(self, *args):
confdef = self.conf.defaults()
conn = MysqlConnect(confdef["user"], confdef["password"], confdef["host"], args[0])
sql = "select table_schema as 'dbname',sum(table_rows) as 'tableLine'," \
"sum(truncate(data_length/1024/1024, 2)) as 'dbsize',sum(truncate(index_length/1024/1024, 2)) as 'indexSize' " \
"from information_schema.tables where table_schema='{}';".format(args[0])
ret = conn.run_sql(sql)
return ret[0][args[1]]
def usage(self):
print('''
Usage: python xx.py dbname tableLine|dbsize|indexSize
like python xx.py dbname tableLine
''')
def run(self):
return self.terminal()
if __name__ == '__main__':
mysql_ret=mysqlJunde().run()
print(mysql_ret)
打印的各種格式如下
list.py文件 zabbix固定的格式
{
"data":[
{'{#DBNAME}': 'xx'},
{'{#DBNAME}': 'xx'},
]
}
5、dbname_list.json.py
#!/usr/local/bin/python3
#
# Name: 專用於 zabbix 的json格式打印, 在zabbix中定義的鍵值對
# Version Number:1.01
# Type: discovery zabbix dbname
# Language:python3
# Date:2019-1-8
# Author:xiong
import os
import configparser
from list import Files
conf = configparser.ConfigParser()
path = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
confpath = os.path.join(path, "conf", "conf.ini")
conffilename = os.path.join(path, confpath)
# read open xx/xx/conf.ini
conf.read(conffilename)
# get filename and basepath
filename = conf["FILE"]["file_name"]
basepath = conf["FILE"]["base_path"]
files = Files(filename, basepath)
files.file_txt()
files.zab_list()
main.py文件, 需要在終端下傳入參數 正常
D:\xx\mysqlDemos>python main.py mydb dbsize
結果 0.04
輸入錯誤 返回
D:\xx\mysqlDemos>python main.py mydb
Usage: python xx.py dbname tableLine|dbsize|indexSize
like python xx.py dbname tableLine
None
官方說明: 其輸出的示例(爲了清楚起見重新格式化)如下所示。用於自定義發現檢查的JSON必須遵循相同的格式。
{
"data":[
{ "{#FSNAME}":"/", "{#FSTYPE}":"rootfs" },
{ "{#FSNAME}":"/sys", "{#FSTYPE}":"sysfs" },
{ "{#FSNAME}":"/proc", "{#FSTYPE}":"proc" },
{ "{#FSNAME}":"/dev", "{#FSTYPE}":"devtmpfs" },
]
}
3、zabbix配置
3.1、配置文件
[root@gmv6 mysqlDemos]# vim /usr/local/zabbix/etc/zabbix_agentd.conf
UnsafeUserParameters=1
UserParameter=mysql.dbname[*],/usr/local/zabbix/script/mysql/mysqlDemo/mysqlDemos/dbname_list_json.py
UserParameter=mysql.size[*],/usr/local/zabbix/script/mysql/mysqlDemo/mysqlDemos/main.py $2 $1
3.2、zabbix界面配置
** 配置--模塊--創建模板---創建自動發現-- 創建發現模板**
添加之後--點監控項原型-- 創建監控項原型
信息類型是: 數字(字符串)
添加完之後,將這個自動註冊的主機刪除,或等待一會 點配置--主機-屏幕-- 就能看到
最終的效果
有問題可留言..
代碼以及模板: 鏈接:https://pan.baidu.com/s/1JykUQBUWSfSlnjQeZdct2Q 提取碼:dxja