Z.S.K.'s Records

zabbix学习(批量监控指定网页)

有时需要监控业务系统特定的入口页面及页面的响应速度,节点数少的话还能写个小脚本使用curl处理,数量一多的话就有点力不从心了,而且需要自动报警功能,使用脚本不太容易实现了,特别是处于内网环境,使用zabbix的http模板则很容易解决这类问题,思路也非常简单:脚本(shell/python均可)+zabbix的simple check即能实现

脚本

这里还是使用curl一个网址,得到返回值,一般情况下正常能够访问返回值为200,维护一个WEB.txt,shell脚本从该文件中读取url,需要注意一点的是,这里使用到了zabbix的自动发现功能,所以返回格式严格为json格式,shell脚本如下:

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
43
cat web_site_code_status.sh

#!/bin/bash
# function:monitor tcp connect status from zabbix

source /etc/bashrc >/dev/null 2>&1
source /etc/profile >/dev/null 2>&1
#/usr/bin/curl -o /dev/null -s -w %{http_code} $1

web_site_discovery () {
WEB_SITE=($(cat /usr/local/zabbix/sbin/WEB.txt|grep -v "^#"))
printf '{\n'
printf '\t"data":[\n'
for((i=0;i<${#WEB_SITE[@]};++i))
{
num=$(echo $((${#WEB_SITE[@]}-1)))
if [ "$i" != ${num} ];
then
printf "\t\t{ \n"
printf "\t\t\t\"{#SITENAME}\":\"${WEB_SITE[$i]}\"},\n"
else
printf "\t\t{ \n"
printf "\t\t\t\"{#SITENAME}\":\"${WEB_SITE[$num]}\"}]}\n"
fi
}
}

web_site_code () {
/usr/bin/curl -o /dev/null -s -w %{http_code} $1
}

case "$1" in
web_site_discovery)
web_site_discovery
;;
web_site_code)
web_site_code $2
;;
*)

echo "Usage:$0 {web_site_discovery|web_site_code [URL]}"
;;
esac

WEB.txt的格式如下,一个url对应一行:

1
2
3
4
http://127.0.0.1/index.html
http://127.0.0.1:7002/
http://baidu.com/
...

把脚本加入crontab每分钟执行一次

1
*/1 * * * * root /usr/local/zabbix/script/web_site_code_status.sh

觉得shell脚本的格式比较费劲的等方面,也可以使用python,脚本如下:

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
#!/usr/bin/env python
#coding:utf-8

import os
import sys
import json

#这个函数主要是构造出一个特定格式的字典,用于zabbix
def web_site_discovery():
web_list=[]
web_dict={"data":None}
with open("WEB.txt","r") as f:
for url in f:
url_dict={}
url_dict["{#SITENAME}"]=url.strip()
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_code [URL]"
except Exception as msg:
print msg
#这里对脚本传递进来的第一个参数做判断去执行不同的函数,为什么要这样,因为通过一个脚本写了两个功能

修改zabbix_agentd.conf

在客户端的zabbix_agentd.conf中增加自定义的key

1
2
3
UnsafeUserParameters=1
UserParameter=web_site_discovery,/etc/zabbix/scripts/web_site_moniter.py web_site_discovery
UserParameter=web_site_code[*],/etc/zabbix/scripts/web_site_moniter.py web_site_code $1

在服务器端测试返回值,返回数据如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#测试url返回值
zabbix_get -s 100.12.255.160 -p 10050 -k web_site_code[http://baidu.com/]
200
#测试zabbix自动发现
zabbix_get -s 100.12.255.160 -p 10050 -k web_site_discovery
{
"data": [
{
"{#SITENAME}": "http://127.0.0.1/index.html"
},
{
"{#SITENAME}": "http://127.0.0.1:7001/"
},
{
"{#SITENAME}": "http://www.baidu.com/"
}
]
}

zabbix前端配置

大家直接看图吧

zabbix-web-url1

zabbix-web-url2

zabbix-web-url3

zabbix-web-url4

zabbix-web-url5

zabbix-web-url6

zabbix-web-url7

zabbix-web-url8

zabbix-web-url9

zabbix-web-url10

zabbix-web-url11

zabbix-web-url12

zabbix-web-url13

zabbix-web-url14

参考文章:

转载请注明原作者: 周淑科(https://izsk.me)


 wechat
Scan Me To Read on Phone
I know you won't do this,but what if you did?