一、简单介绍

上文我们使用了zabbix的自动发现的监控来监控服务的端口,重点写了zabbix的发现的一个原理和过程,但是实际上我们服务器的配置是比较复杂的,而且之前用的是简单的模拟方式实现的,脚本用的是shell构造成json的,这种不利于维护。下面我们通过线上配置文件来格式化成我们zabbix能够解读的json文件:

二、文件结构分析及思路

首先得先观察游戏服的配置文件结构tree命令,查看我们的配置文件位置

很明显我们的配置文件位于:/datadisk/jh-fw-server_xxxx/config/config.toml目录下

接下来观察配置文件格式:

是典型的key  vlaue结构的配置文件类似于windows的ini文件,思路:我们可以用configparser去读取配置文件信息,然后构造输出json信息

三、开始构造

这次我们使用python脚本,非常之强大的胶水语言。

这次写2个脚本 分别是:配置信息脚本和执行脚本。这样方便扩展,结构灵活!

1.配置信息脚本

# encoding: utf-8

import socket
server_path='/datadisk'
server_path_file_re='^/datadisk/.*server_[0-9]{1,5}/config/config.toml$'
server_path_re='^/datadisk/.*server_[0-9]{1,5}$'
#下面server_config_section_option是你要捕捉的端口信息的key,通过这个key去捕捉value
server_config_section_option={
    'game':['rpc_addr',],
    'gate':['rpc_addr','addr'],
    'login':['addr'],
    'api':['addr'],
    '[redis':['addr',]
}
server_url = "http://10.0.32.22/zabbix/api_jsonrpc.php"
header = {"Content-Type": "application/json"}
username = "zabbix"
password = "123456"

def get_host_ip():
    '''
    获取服务器的信息
    :return:
    '''
    try:
        host_info={}
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(('8.8.8.8', 80))
        host_info['host_ip'] = s.getsockname()[0]
        host_info['host_name']= socket.gethostname()
    except Exception as e:
        host_info={}
    finally:
        s.close()
    return host_info

host_info=get_host_ip()

 

2.执行脚本


# encoding: utf-8
import os,sys,json,re,time

import  monitor_settings

#根据不同版本导入configparser
if sys.version_info[0] == 2:
    import ConfigParser as configparser
else:
    import configparser


def get_server_list(func_argv_server_path,func_argv_server_path_file_re):
    #定义一个数组来存放配置文件地址信息
    func_server_config_file_list=[]
    #使用os.walk模块,返回3个值分别是(1.当前正在遍历的这个文件夹的本身的地址,2.内容是一个list是该文件夹中所有的目录的名字(不包括子目录),3.内容同样是list是该文件夹中所有的文件(不包括子目录))
    for path_abs,path_list,file_list in os.walk(func_argv_server_path):
        for file_name in file_list:
            #匹配配置文件的所在路径,若匹配到了,就将信息加入到数组
            if re.findall(r'{}'.format(func_argv_server_path_file_re),os.path.join(path_abs,file_name)):
                func_server_config_file_list.append(os.path.join(path_abs,file_name))
    #返回数组信息
    return func_server_config_file_list


def get_server_config_values(func_argv_server_config_file_list, func_argv_config_section_option):
    #实例化一个config对象,config是用于读取配置信息的一个模块
    config = configparser.ConfigParser()
    #定义一个存放你要捕捉端口的数组
    server_config_name_port_list=[]
    for server_config_file_abs in func_argv_server_config_file_list:
        #切出服务的id
        server_name_id=server_config_file_abs.split('/')[2]
        #print(server_config_file_abs)
        #print(server_name_id)
        #读取配置文件
        config.read(server_config_file_abs)
        #读取你定义的key1 如(game,gate,redis等)
        for section in func_argv_config_section_option:
            # print(section,func_argv_config_section_option[section])
            #读取你定义的key2 如(rpc_addr,addr等)
            for i in func_argv_config_section_option[section]:
                # print(config.get(section=section,option=i))
                #将获取到的信息加入数组,其中一个知识点config.get(section=section,option=i),通过config模块section(key)获取option(value),具体了解<a href="https://www.jianshu.com/p/4f50ce352b2f">config</a>模块
                server_config_name_port_list.append({"{#SERVER}":"{}_{}".format(server_name_id,section),"{#PORT}":config.get(section=section,option=i).split(':')[-1].split('"')[0]})
    #定义一个字典
    server_dict={}
    #将捕获信息的数组放入字典的data中
    server_dict['data']=server_config_name_port_list
    #返回字典
    return server_dict

def running():
    #获取配置文件的绝对地址(传入的两个参数是服务主目录和文件匹配规则)
    server_config_file_list = get_server_list(monitor_settings.server_path, monitor_settings.server_path_file_re)
    # print server_config_file_list
    #通过配置文件获取json信息(传入的两个参数是配置文件地址数组信息和你要捕捉的key的信息)
    server_dict=get_server_config_values(server_config_file_list, monitor_settings.server_config_section_option)
    #用json模式输出字典
    print(json.dumps(server_dict, indent=4))


if __name__ == '__main__':
    running()

 

执行结果:

输出类似这种json,既可以让zabbix去发现你的监控项了。当前你要先设置好自动发现规则!

若你按之前上文一样配置好自动发现规则,结果就好如下显示:

zabbix–api接口

Zabbix_api4.4官方文档 Zabbix_api3.4中文文档 一、初识api(zabbix4.4.4版本) API(Application Programming Interface,应用程序编程接口)是一些预先定义的...

阅读全文

zabbix自动发现监控项

一、应用场景及zabbix简单安装 游戏服务器,游戏程序经常开区,合区。导致监控项会时常变化(当然也可以写一个自动检测脚本,检测所有程序都正常,返回ok就行...

阅读全文

shell脚本队列并行方式

一、使用场景 要减少执行串行循环的耗时,自然要考虑如何用并行方式解决。在shell之外有一些现成的管理部署工具如parallel、ansible、puppet、saltstack都能...

阅读全文

欢迎留言