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、脚本

文件结构如下
[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.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、配置文件

[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

zabbix自动注册-mysql

3.2、zabbix界面配置

** 配置--模块--创建模板---创建自动发现-- 创建发现模板**

zabbix自动注册-mysql
添加之后--点监控项原型-- 创建监控项原型
zabbix自动注册-mysql
信息类型是: 数字(字符串)
zabbix自动注册-mysql

添加完之后,将这个自动注册的主机删除,或等待一会 点配置--主机-屏幕-- 就能看到
zabbix自动注册-mysql

最终的效果
zabbix自动注册-mysql

猜你喜欢

转载自blog.51cto.com/xiong51/2340739
今日推荐