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

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

[[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界面配置

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


添加之后--点监控项原型-- 创建监控项原型

信息类型是: 数字(字符串)

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

最终的效果

有问题可留言..

代码以及模板: 链接:https://pan.baidu.com/s/1JykUQBUWSfSlnjQeZdct2Q 提取码:dxja

原文地址:http://blog.51cto.com/xiong51/2340739

时间: 2024-11-06 17:34:50

zabbix自动注册-mysql的相关文章

网站集群架构实战(LVS负载均衡、Nginx代理缓存、Nginx动静分离、Rsync+Inotify全网备份、Zabbix自动注册全网监控)--技术流ken

前言 最近做了一个不大不小的项目,现就删繁就简单独拿出来web集群这一块写一篇博客.数据库集群请参考<MySQL集群架构篇:MHA+MySQL-PROXY+LVS实现MySQL集群架构高可用/高性能-技术流ken>下面是项目的一些简单介绍. WEB集群项目简介 随着网站访问量的激增,势必会导致网站的负载增加,现需求搭载一套高性能,高负载,高可用的网站集群架构以保障网站的持续.高效.安全.稳定的运行. 针对以上需求,我们采用了如下的技术: 使用负载均衡技术来实现网站请求的调度分发,减小后端服务器

zabbix自动注册

zabbix-server页面中定义zabbix自动注册动作action1.Configuration-->Actions-->Event source:Auto registration-->Create action ①Action:这项内容是定义发送邮件/消息的内容name - 腾讯云主机自动注册Default subject - Auto registration: {HOST.HOST}Default message - Host name: {HOST.HOST}      

zabbix 自动注册

看到网上很多人说在批量监控主机的时候用自动发现,什么用ip段,然后通过zabbix.agent的system.uname来做,然, 现实中只要这个一打开,当然我的频率设置的比较低,我不想等,zabbix立马[Zabbix discoverer processes more than 75% busy]]报警.三年前用的时候踩过坑,无奈不懂好记性不如烂笔头. 所以今天记一下,首先自动注册和自动发现是两个事,个人认为在zabbix server配置比较low的人,像我,最好用自动注册,而自动注册简单

配置zabbix自动注册客户端

安全完客户端之后 在客户端的配置文件增加一个参数 HostMetadata 编辑客户端配置文件 vim /etc/zabbix/zabbix_agentd.conf Server=172.17.5.245 ServerActive=172.17.5.245 Hostname=jira UnsafeUserParameters=1 HostMetadata=linux (linux为自定义字符) 在zabbix的web页面 点击--配置--动作--自动注册--创建动作 新增加一个动作:如图 条件增

zabbix自动注册及邮件报警

自动注册 自动注册,基于注册规则,匹配主机名,必须是客户端安装好agent,如果需要添加监控,需创建Actions动作 (1)打开Zabbix服务端,选择"配置"-"动作",事件源选择"自动注册",创建新的动作 (2)在"动作"配置项,添加新的触发条件为"主机名称非似 Linux":在"操作"配置项,创建新的操作:添加主机.添加到主机群组:Linux servers.链接到模板:Temp

【技术干货】Zabbix自动注册

一.概述:(1)自动注册:zabbix_agent主动发送注册信息到server端,然后agent主机会被自动添加到web端,无须手动配置它们: (2) 服务器在添加新的自动注册主机时,使用接收到的IP地址和端口配置agent.如果没有接收到IP地址值,则使用传入连接的IP地址.如果没有接收到端口值,则使用10050. (3) 当agent程序向服务器发送自动注册请求时,会发送其主机名.在某些情况下(例如,Amazon云端节点),Zabbix服务器的主机名不足以区分发现的主机.主机元数据可将其他

zabbix自动发现mysql端口并监控

一.需求: 因为我们是游戏业务,要用到mysql,一个服务器上面跑多个mysql实例也是很正常.如果单独手动一台台修改agent.conf,添加web监控,太费时费力.所以就想的要用zabbix 的自动发现来监控 二.配置Agent 1.编写自动发现端口脚本 [[email protected] ~]# cat /etc/zabbix/alertscripts/zabbix_discovery_mysql.sh  #!/bin/bash mysql() {             port=($

5、Zabbix自动发现主机

上一篇文档介绍了zabbix自动注册,就是zabbix agent主动寻找zabbix server并根据server定义好的规则完成添加主机.加入指定主机组.链接模板等操作. Zabbix自动发现跟自动注册正好相反,它是由server扫描某一个网段内所有主机,发现主机后根据定义好的规则完成添加主机.加入指定主机组.链接模板等操作. zabbix的自动发现功能,能够基于规则自动发现主机并添加主机 基于发现规则的条件: 1.IP地址段 2.基于服务器,比如说FTP.SSH.WEB等 3.基于zab

zabbix的自动注册(Auto registration),使用proxy实现

想要实现使用zabbix-proxy来实现自动注册功能,那么就想要安装zabbix-proxy,而zabbix-proxy也是依赖于数据库的,所以安装zabbix-proxy也想要安装数据库,我使用的是MySQL数据库,而且zabbix-proxy的数据库不能和zabbix-server放在一起,而且既然我们使用了zabbix-proxy,那么就把zabbix-proxy和zabbix-server分开安装在不同的主机上. 之前我的博文已经介绍过zabbix-server和MySQL的安装,连接