zabbix自動註冊-mysql
阿新 • • 發佈:2019-01-09
在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、指令碼
檔案結構如下 [[email protected] 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.222 port = 3306 [FILE] file_name = test.txt # 資料庫的名稱 格式如下 base_path = D:\ # 需要定義絕對路徑, 需要注意的是路徑不能帶有中文, 否則會報錯 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、配置檔案
[[email protected] 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介面配置
** 配置--模組--建立模板---建立自動發現-- 建立發現模板**
新增之後--點監控項原型-- 建立監控項原型
資訊型別是: 數字(字串)
新增完之後,將這個自動註冊的主機刪除,或等待一會 點配置--主機-螢幕-- 就能看到
最終的效果