设为首页 收藏本站
查看: 1003|回复: 0

[经验分享] python实现zabbix批量监控WEB网站和批量监控主机端口

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-11-10 09:31:19 | 显示全部楼层 |阅读模式
      相信大家在网上应该看到很多类似的东东,本文主要是整理总结下,并使用python脚本来实现,为什么要使用python,后面会说原因,当然要实现批量添加监控还是要用到zabbix的Discovery功能来实现,所以我们的脚本关键是要采集并返回指定格式的数据。下面来一步步走吧:
一、Zabbix批量监控WEB网站
1、编写python脚本
这个需求在生立环境中应该说用得太普遍了,如果你生产环境有成百上千个网站,你应该不会笨到一个一个去添加监控吧,zabbix已经提供了这个实现。首先当然是编写python脚本,脚本中有两个函数,web_site_discovery函数主要是用于返回zabbix创建监控所需要的数据,web_site_code函数主要用于判断返回码,脚本如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/usr/bin/env python
#coding:utf-8

import os,sys,json

#将要监控的web站点url添加到urllist列表
urllist=["http://baidu.com",
        "http://www.qq.com",
        "http://www.sina.com.cn/"]

#这个函数主要是构造出一个特定格式的字典,用于zabbix
def web_site_discovery():
    web_list=[]
    web_dict={"data":None}

    for url in urllist:
        url_dict={}
        url_dict["{#SITENAME}"]=url
        web_list.append(url_dict)

    web_dict["data"]=web_list
    jsonStr = json.dumps(web_dict, sort_keys=True, indent=4)
    return jsonStr

#这个函数用于测试站点返回的状态码,注意在cmd命令中如果有%{}这种字符要使用占位符代替,否则
#会报错
def web_site_code():
       cmd='curl -o /dev/null -s -w %s %s' %("%{http_code}",sys.argv[2])
       reply_code=os.popen(cmd).readlines()[0]
       return reply_code

if __name__ == "__main__":
  try:
    if sys.argv[1] == "web_site_discovery":
        print web_site_discovery()
    elif sys.argv[1] == "web_site_code":
        print web_site_code()
    else:
        print "Pls sys.argv[0] web_site_discovery | web_site_codehttp://baidu.com"
         ...     }
    ]
}

]
200




4、zabbix页面配置
wKiom1ZAcuKCmNohAAGGXHFWszg806.jpg
创建模板
wKiom1ZAc2aClinjAAFo8ibnyCM154.jpg
创建discovery rule,同时添加filter规则,这里的key要和zabbix_agentd.conf文件中的一致
wKiom1ZAc73R_4ZlAACf8iDxlzQ624.jpg
wKiom1ZAdDriobOhAAHbNwVR-QU778.jpg
添加item prototype,这里的key要和zabbix_agentd.conf文件中的一致,这里传递的参数是获取的站点utl值
wKiom1ZAdNuSP5MvAAGvmmpKio0664.jpg 添加trigger prototype,这里需要说明的是触发器的表达式,last(0)表示最近一次的值如果>399则触发报警。添加完后的结果如下:
wKioL1ZAdkqx2n0aAABLwh8nibk661.jpg

二、Zabbix批量监控主机端口
1、编写python脚本
其实原理和监控web差不多,先要从被监控服务器采集需要监控端口的数据,记住是一个特点格式的字典,这也是为什么我们使用python编写脚本的原因,因为python很擅长处理字典类型的对象,如果使用shell,要写一堆格式,很麻烦,python可以让代码变得更简洁,首先看下脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env python
#coding:utf-8

import os, json

port_list=[]
port_dict={"data":None}
cmd='''netstat -tnlp|egrep -i "$1"|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort |uniq   2>/dev/null'''
local_ports=os.popen(cmd).readlines()

for port in local_ports:
    pdict={}
    pdict["{#TCP_PORT}"]=port.replace("\n", "")
    port_list.append(pdict)

port_dict["data"]=port_list
jsonStr = json.dumps(port_dict, sort_keys=True, indent=4)

print jsonStr




2、在被监控的服务器修改代理配置文件
这里需要指出的是,只要是被监控端都需要上面的脚本,我也试图只在zabbix服务端实现,但好像有些问题,后面再深入研究下,不过就是把一个文件上传到客户端,也很容易用salt-stack分发下就可以了
在zabbix_agentd.conf增加以下内容:
1
2
UnsafeUserParameters=1
UserParameter=tcpportlisten,/etc/zabbix/scripts/check_port.sh




3、测试
在zabbix-server端测试下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#zabbix_get -s 192.168.153.129 -p 10050 -k tcpportlisten

{
    "data": [
        {
            "{#TCP_PORT}": "10050"
        },
        {
            "{#TCP_PORT}": "22"
        },
        {
            "{#TCP_PORT}": "25"
        },
        {
            "{#TCP_PORT}": "4505"
        },
        {
            "{#TCP_PORT}": "4506"
        },
        {
            "{#TCP_PORT}": "8080"
        },
        {
            "{#TCP_PORT}": "9000"
        }
    ]
}




4、Zabbix页面配置
wKioL1ZAeerSeuFrAAGCxTuHR0E481.jpg 同样先创建一个模板,然后添加discovery rule
wKioL1ZAel_zT3J7AANVE4KDH-g207.jpg 注意这里的key要和配置文件中的key保持一致
wKiom1ZAepzSzGsrAAIKl39loh4762.jpg 创建item prototype这里key使用的是zabbix预定义的key,用于判断端口是否存活,如果存活则返回值为1,否则返回值为0
wKioL1ZAe32wLPqQAAEPByXFWvY328.jpg 创建trigger prototype,注意这里的表态示count(#3,0,eq) > 1表示最近3次的返回值为0,这个条件触发一次则报警
wKioL1ZAfoGjq4cYAABqJMKl_hg399.jpg 添加后的结果如上


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-137351-1-1.html 上篇帖子: python列表去重 冒泡排序 插序排序 下篇帖子: python基础-内置数据类型 监控主机 python 网站
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表