一.JSON模块介绍

json模块是python内置的库,其主要功能是将序列化数据从文件里读取出来或者存入文件。该模块有四个方法:dump()、load()、dumps()、loads()其中dump()是将数据存入文件中,load()是用于读取文件;而dumps()和loads()是对python对象进行操作。dumps()是将python对象编码成json字符串,loads()是将json字符串解码成python对象。

json模块的操作使用相对较为简单,在使用的时候直接导入就可以。在zabbix运维中,常见的自动发现场景,使用python的json模块,处理起数据,会非常的简单。

二.应用场景示例

以下结果,为调用阿里云的接口数据作为演示,相关敏感数据已做脱敏处理。

2.1自动发现主机

2.1.1 python处理脚本

#!/usr/bin/env python

#coding=utf-8

from aliyunsdkcore.client import AcsClient

from aliyunsdkcore.acs_exception.exceptions import ClientException

from aliyunsdkcore.acs_exception.exceptions import ServerException

from aliyunsdkcore.auth.credentials import AccessKeyCredential

from aliyunsdkcore.auth.credentials import StsTokenCredential

from aliyunsdkslb.request.v20140515.DescribeLoadBalancersRequest import DescribeLoadBalancersRequest

import json

# 这里填 ACCESS_KEY 和SECRET_KEY

credentials = AccessKeyCredential('', '')

# use STS Token

# credentials = StsTokenCredential('<your-access-key-id>', '<your-access-key-secret>', '<your-sts-token>')

# 这里填资源所属区域

client = AcsClient(region_id='cn-hangzhou', credential=credentials)

request = DescribeLoadBalancersRequest()

request.set_accept_format('json')

 

response = client.do_action_with_exception(request)

res = json.loads(response)

r = []

# 拼接成用于zabbix自动发现资源的格式 ,这里使用  LoadBalancerId 作为主机名称   LoadBalancerName 作为可见名称

for i in res['LoadBalancers']['LoadBalancer']:

buf = {'{#PROJECT}':'acs_slb_dashboard', '{#INSTANCE}':i['LoadBalancerId'], '{#INSTANCE_NANME}':i['LoadBalancerName']}

r.append(buf)

print(json.dumps({"data":r})

2.2.2 返回的原始数据

u'LoadBalancers': {u'LoadBalancer': [{u'BusinessStatus': u'Normal', u'CreateTimeStamp': 1665537209000, u'LoadBalancerStatus': u'active', u'PayType': u'PayOnDemand', u'InternetChargeType': u'4', u'VpcId': u'', u'RegionIdAlias': u'cn-hangzhou', u'Tags': {u'Tag': [{u'TagKey': u'ack.aliyun.com', u'TagValue': u'cc5bc5d2683a44ae9b1a8eb816'}, {u'TagKey': u'kubernetes.do.not.delete', u'TagValue': u'a2d1f65d7fb1d468197ad23ba183fc45'}]}, u'RegionId': u'cn-hangzhou', u'ResourceGroupId': u'rg-acfmxrtftvdl', u'InstanceChargeType': u'PayBySpec', u'VSwitchId': u'', u'InternetChargeTypeAlias': u'paybytraffic', u'Address': u'120.26.67.000', u'AddressIPVersion': u'ipv4', u'LoadBalancerSpec': u'slb.s1.small', u'LoadBalancerId': u'lb-bp1py79ytly0dl', u'AddressType': u'internet', u'MasterZoneId': u'cn-hangzhou-b', u'DeleteProtection': u'on', u'ModificationProtectionReason': u'managed.by.ack', u'SlaveZoneId': u'cn-hangzhou-g', u'Bandwidth': 5120, u'SpecBpsFlag': False, u'ModificationProtectionStatus': u'ConsoleProtection', u'NetworkType': u'classic', u'LoadBalancerName': u'a2d1f65d7fb1d468197ad23ba1', u'CreateTime': u'2022-10-12T09:13Z'}, {u'BusinessStatus': u'Normal', u'CreateTimeStamp': 1665480995000, u'LoadBalancerStatus': u'active', u'InternetChargeType': u'4', u'VpcId': u'vpc-bp1y7ysljuhh0mgz', u'RegionIdAlias': u'cn-hangzhou', u'Tags': {u'Tag': [{u'TagKey': u'ack.aliyun.com', u'TagValue': u'cc5bc5d2683a44ae9b1a8eb816'}]}, u'RegionId': u'cn-hangzhou', u'ResourceGroupId': u'rg-acfmxrtftvdlxuq', u'InstanceChargeType': u'PayBySpec', u'VSwitchId': u'vsw-bp19iupfrliiqgwjnnxoc', u'InternetChargeTypeAlias': u'paybytraffic', u'Address': u'192.168.33.000', u'AddressIPVersion': u'ipv4', u'LoadBalancerSpec': u'slb.s2.small', u'LoadBalancerId': u'lb-bp1wjgyg379yn', u'AddressType': u'intranet', u'MasterZoneId': u'cn-hangzhou-k', u'DeleteProtection': u'on', u'PayType': u'PayOnDemand', u'SlaveZoneId': u'cn-hangzhou-j', u'Bandwidth': 5120, u'SpecBpsFlag': False, u'ModificationProtectionStatus': u'ConsoleProtection', u'NetworkType': u'vpc', u'LoadBalancerName': u'ManagedK8SSlbIntranet-cc5bc5d2683a44ae9b1a8eb80', u'CreateTime': u'2022-10-11T17:36Z'}]}, u'TotalCount': 2, u'PageNumber': 1, u'RequestId': u'034B0F9E-87DE-59F4-9406-456B.', u'PageSize': 2}

2.2.3 处理后的数据

{"data": [{"{#PROJECT}": "acs_slb_dashboard", "{#INSTANCE_NANME}": "a2d1f65d7fb1d468197ad23b", "{#INSTANCE}": "lb-bp1py79ytly0dlt"}, {"{#PROJECT}": "acs_slb_dashboard", "{#INSTANCE_NANME}": "ManagedK8SSlbIntranet-cc5bc5d2683a44ae9b1a8eb", "{#INSTANCE}": "lb-bp1wjgyg379ynw61"}]}

三、结论

对比shell,Python的json模块在数据处理方面,其脚本的可读性、简洁性都会有所提升,并且处理过程也无需花费过多的事件写处理过程的代码,能有效提升运维人员的工作效率。

本期的分享内容到这就结束了。大家好,我是乐乐,专注IT运维技术研究与分享,关注我,学习更多Zabbix使用技巧。同时欢迎小伙伴们到乐维社区留言提问,共同探讨Zabbix技术问题。