在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