cmdb事件推送实现zabbix资产同步

前言 

《事件推送网关:让cmdb告别“花瓶”》一文我们将cmdb事件推送的参数进行了解析,并结合redis做了去重,避免事件的重复推送。接下来的任务我们计划是cmdb和zabbix进行资产同步,功能如下:

cmdb的业务、集群、模块分组信息同步至zabbix主机分组;

cmdb资产删除同步至zabbix进行相应的主机删除;

cmdb资产新建同步至zabbix,并根据相应的信息绑定不同的模板;

此时cmdb只是为zabbix提供了资产新建、分组、变更等基础数据,zabbix的告警信息如何与其关联,让运维能够通过告警内容就能直接知道哪块业务出现问题才是我们真正想要的。

为此,我们做了如下定义:

定义zabbix的分组规则为:业务_集群_模块;

zabbix agent的Hostname参数统一使用ip地址,方便事件推送网关通过zabbix api根据进行查询及其他相关操作;

定义zabbix 主机的可见名称规则为:集群_模块_ip;由于我们的集群基本都放在同一个业务下,可见名称规则中不加业务所属;

通过以上规则,我们可以将告警主机的ip、分组、可见名称自由添加到告警动作中,实现了告警信息的可读性。

其中:

集群:中间件;

模块:nginx-lan;

IP:10.164.193.189;

通过告警内容,就可以快速定位问题,后期可结合故障自愈实现,更好的提高我们处理问题的效率。

目录结构

开发过程中随着功能的不断增多,我们需要对不同情况生成相应格式化参数。

D:\WORK\BLUEKING\GATEWAY\GATEWAY│ manage.py│├─.vscode│ settings.json│├─gateway│ asgi.py│ settings.py│ urls.py│ wsgi.py│ __init__.py│└─gw_cmdb │ admin.py │ apps.py │ models.py │ tests.py │ urls.py │ views.py │ __init__.py │ ├─common    │      hostidentifier_cmdb.py     │ main.py │ module_cmdb.py     │      select_cmdb.py            └─zabbix group.py host.py main.py template.py

其中:

common目录是与cmdb相关的模块:

main 接收事件推送网关推送过来的参数;

hostidentifier_cmdb  针对主机相关事件推送返回格式化参数;

module_cmdb 针对模块相关事件推送返回格式化参数;

select_cmdb   查询cmdb内容如集群、业务、操作系统等辅助信息;

zabbix目录是与zabbix相关的模块:

main 解析格式化参数,对zabbix做相应的处理;

group 与主机分组操作相关的模块,如查询、创建、删除、更新等;

host 与主机操作相关模块,如查询、创建、更新、删除等;

template 与模板操作相关的模块,如查询等;

由于分组同步可以在不影响zabbix使用的情况下操作,因此我们在此着重介绍此功能。

分组同步

分组同步主要有以下几个功能需求:

业务、集群、模块分组同步,如:创建、更新、删除,对应分组名为:业务_集群_模块;

主机模块更新同步,主机模块转移需要在zabbix中修改主机相应的分组,保持和cmdb一致;

注意:分组同步的前提是通过zabbix的IP查询并操作主机,因此要求zabbix agent 的Hostname必须为IP,并且和cmdb中的IP一一对应。

通过分组同步最终实现的效果如下:

1

接收cmdb推送参数

cmdb事件推送将参数发送给网关,由views.py接收

vim gw_cmdb/views.pyfrom django.http import HttpResponsefrom .common.main import mainfrom .zabbix.main import zabbix_mainfrom .jumpserver.main import jumpserver_mainimport jsonimport logging

logger = logging.getLogger(‘log’)

由于cmdb推送过来的参数内容过多,因此我们需要将其进行格式化并且将其解析成不同的动作,以便zabbix进行操作。

2

解析参数

(1)common将views接收的请求进行。

vim common/main.pyimport loggingfrom .hostidentifier_cmdb import hostidentifierfrom .module_cmdb import module_action

logger = logging.getLogger(‘log’)

def main(data):    result = {‘result’: 1,’data’: 0} 

注意:cmdb侧事件推送的触发动作比较多,如主机、业务、组织架构等,但其实在zabbix侧我们没有必要一一和以上事件进行对应,而是只需要和最小操作保持一致即可。

举例:

根据分组规则:业务_集群_模块,最小级的模块存在的前提肯定是有集群和业务,因此只要最小级的模块创建、更新、删除时,触发zabbix动作创建主机群组即可,而空业务、空集群对zabbix操作没有实际意义。

对于录入cmdb的主机,无论是在资源池或业务下的空闲资源池,此时都没有必要触发zabbix操作,而是当主机转移到相应的模块下,标识已经分配使用了,此时我们将触发zabbix操作,如创建主机、绑模板、增加主机分组等操作。

因此zabbix侧动作触发,只需要在模块和主机标识更新情况下触发即可。

(2)模块操作解析

vim common/module_cmdb.pyimport jsonimport loggingfrom .select_cmdb import select_cmdb_biz,select_cmdb_set

logger = logging.getLogger(‘log’)

def module_action(data): logger.info(“模块更新: {}”.format(data)) 

(3)主机标识解析

cmdb主机模块转移可能会触发多次请求,因此我们需要借助redis将请求进行去重。

vim common/hostidentifier_cmdb.pyimport redisimport jsonimport hashlibimport logging

logger = logging.getLogger(‘log’)

r = redis.StrictRedis(host=’127.0.0.1′,port=6379,db=1)

3

zabbix操作

当common将cmdb事件的参数解析后,就可传给zabbix模块进行相应的分组同步操作了。

(1)zabbix操作入口

vim zabbix/main.pyimport jsonimport loggingfrom django.conf import settingsfrom urllib import request, parsefrom .group import select_zabbix_group,create_zabbix_group,main_zabbix_group, update_zabbix_group, delete_zabbix_groupfrom .host import select_zabbix_host, select_zabbix_host_group,update_zabbix_host_group

logger = logging.getLogger(‘log’)

def zabbix_auth(ZABBIX_USERNAME,ZABBIX_PASSWORD,ZABBIX_URL): url = “{}/api_jsonrpc.php”.format(ZABBIX_URL) header = {“Content-Type”: “application/json”} 

(2)主机群组操作

vim zabbix/group.pyimport jsonimport loggingfrom urllib import request, parsefrom django.conf import settingsfrom .template import select_zabbix_templatefrom .host import create_zabbix_host, select_zabbix_hostfrom common.select_cmdb import select_cmdb_hostlogger = logging.getLogger(‘log’)

def select_zabbix_group(Groupname,auth_code,ZABBIX_URL): url = “{}/api_jsonrpc.php”.format(ZABBIX_URL) header = {“Content-Type”: “application/json”} data = { “jsonrpc”: “2.0”, “method”: “hostgroup.get”, “params”: { “output”: “extend”, “filter”: { “name”: Groupname } }, “auth”: auth_code, “id”: 1 } value = json.dumps(data).encode(‘utf-8’) req = request.Request(url, headers=header, data=value) try: 

(3)主机操作

vim zabbix/host.pyimport jsonimport loggingfrom urllib import request, parselogger = logging.getLogger(‘log’)

def select_zabbix_host(Host,auth_code,ZABBIX_URL): url = “{}/api_jsonrpc.php”.format(ZABBIX_URL) header = {“Content-Type”: “application/json”} data = json.dumps({ “jsonrpc”: “2.0”, “method”: “host.get”, “params”: { “output”: [“hostid”,”name”,”status”,”host”,”groupids”], “selectGroups”:”extend”, “selectInterfaces”:[“ip”], “filter”:{“host”:Host} }, “id”: 1, “auth”: auth_code}).encode(‘utf-8’)  req = request.Request(url, headers=header, data=data) try: 

总结

通过事件推送网关我们初步实现了cmdb和zabbix的分组同步,我们只需要在cmdb一侧就可以管理主机资源,不仅节省了我们跨平台处理的时间,而且规范了我们基础设施的管理。

事件推送网关:让cmdb告别“花瓶”

运维思索:cmdb打通zabbix、jumpserver探索

ansible自动化:操作系统初始化具体实现

K8SEASY:一键安装K8S高可用集群

运维思索:运维规范如何生成?

Prometheus+k8s之告警通知

你与世界

只差一个

公众号

cmdb事件推送实现zabbix资产同步》来自互联网,仅为收藏学习,如侵权请联系删除。本文URL:http://www.hashtobe.com/781.html