当前位置:首页 > 数据库 > 正文

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 但需要注意格式, 自动注册每个库

效果图, 添加一次,以后只要有新加数据库统一给它监控上, 每时间查看数据库的增长

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}‘) # 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