1. 程式人生 > >zabbix自動註冊-mysql

zabbix自動註冊-mysql

  在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 但需要注意格式, 自動註冊每個庫

效果圖, 新增一次,以後只要有新加資料庫統一給它監控上, 每時間檢視資料庫的增長
zabbix自動註冊-mysql

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

zabbix自動註冊-mysql

3.2、zabbix介面配置

** 配置--模組--建立模板---建立自動發現-- 建立發現模板**

zabbix自動註冊-mysql
新增之後--點監控項原型-- 建立監控項原型
zabbix自動註冊-mysql
資訊型別是: 數字(字串)
zabbix自動註冊-mysql

新增完之後,將這個自動註冊的主機刪除,或等待一會 點配置--主機-螢幕-- 就能看到
zabbix自動註冊-mysql

最終的效果
zabbix自動註冊-mysql