————————这里使用的是zabbix3.4版本——————————
zabbix可以根据需要自定义监控项,通过编写脚本来实现对某些数据或功能的监控告警
1. 安装agent并修改配置文件
(这里脚本已经写好了,“D:\zabbix\script\get_process_info.py”,后面的是跟的脚本参数)
在监控主机安装好zabbix_agent后,需要修改其中的配置文件。
LogFile=D:\zabbix\log\zabbix_agentd.log
Server=172.17.62.108 # server IP
ServerActive=172.17.62.108 # 主动模式的server IP地址
Hostname= # 主机名
UnsafeUserParameters=1
UserParameter=get.monitor.info[*],D:\zabbix\script\get_process_info.py "$1" "$2" "$3" "$4" "$5" # 自定义监控脚本
注:这里是windows环境下,安装服务:
安装服务 D:\zabbix\bin\zabbix_agentd.exe -c D:\zabbix\conf\zabbix_agentd.conf -i
卸载服务 D:\zabbix\bin\zabbix_agentd.exe -c D:\zabbix\conf\zabbix_agentd.conf -d
启动服务 D:\zabbix\bin\zabbix_agentd.exe -c D:\zabbix\conf\zabbix_agentd.conf -s
停止服务 D:\zabbix\bin\zabbix_agentd.exe -c D:\zabbix\conf\zabbix_agentd.conf -x
2. 配置监控主机
登录zabbix前端web界面,配置——主机——创建主机
选择主机,并填写以下红框部分。主机名称:与agent配置文件中Hostname保持一致,可见名称:自定义,群组:选择一个或者新建一个,ip地址:一般为内网ip,如果需要走公网监控则填写公网ip
3.添加监控项
配置——主机——监控项——创建监控项(右上角) 或者通过 配置——模板——创建模板 在模板上添加监控项并应用到主机
现在开始配置监控项,名称、键值、信息类型、单位、间隔、应用集等。名称可以根据目的自定义即可;键值,前面部分为agent配置文件中 UserParameter 值定义的名称,必须一致,"[]"中为脚本参数,以逗号隔开,具体根据编写的脚本来填;应用集可以对监控项进行分类;其余几项根据实际情况配置修改
4.测试监控效果(这里默认网络没有问题)
连接zabbix_server,进入安装目录的bin下,运行zabbix_get(‘192.168.1.10’是被监控主机的IP地址),可以看到我们成功获取了主机的VMS提交值,单位B
$ cd /usr/local/zabbix/bin/
$ ls
zabbix_get zabbix_sender
$ ./zabbix_get -s 192.168.1.10 -k get.monitor.info[sswap_used,os]
11242897408
回到web页面,检测中——最新数据,选择主机,过滤,选择刚才的监控项,我们也可以查看一段时间的数据图形,自定义监控项就添加完成了
1.建立触发器
配置——主机——触发器——创建触发器,可以为某一个主机建立,也可以在模板中建立触发器后应用到主机
选择添加表达式,选择需要配置触发器的监控项,当监控项最新值大于N时,触发器生效
2.报警媒介
管理——报警媒介类型——创建媒体类型(右上角),这里先介绍最常用的邮件报警
1).QQ邮箱媒介
直接采用qq邮箱,可以省却许多麻烦,如搭建邮件服务器等。采用465端口(云主机25端口一般默认被封,且安全性不高)。接着到qq邮箱主页中,QQ邮箱——设置——账户——开启IMAP/SMTP服务,并生成授权码,用户密码即授权码
邮箱报警媒介类型就配置完成了,这里不会介绍报错处理,有遇到问题不能发送邮件报错的,可以查看我的另一篇文章,其中有部分详细介绍。
2).电话、钉钉等报警媒介
利用脚本类型的媒介可以实现电话、短信、钉钉、微信等方式告警,这里的脚本参数是传递的报警信息变量,配置在动作中,稍后会介绍。根据安装目录,脚本放在zabbix_server服务器下,/usr/local/zabbix/share/zabbix/alertscripts/,需要有执行权限。当触发器触发,执行动作,调用报警媒介,传递报警信息,执行脚本,我们就可以通过各种方式受到告警。具体的脚本需要根据接口来写,如购买阿里的电话、短信通知,利用钉钉机器人接口发送信息。文章末尾会给出一些脚本,包括调用钉钉接口。
3).绑定媒介到用户
只有绑定了媒介,当动作触发了该媒介并传到该用户,且示警度达到上面配置的严灾级别,才会触发动作中的操作。在用户处也可以配置主机权限。
3.配置动作
配置——动作——创建动作
动作触发可以设置条件,如非维护状态,示警度大于严重等
之后配置触发动作后的具体的操作,消息内容,框中的内容即是配置的媒介类型中的脚本参数{ALERT.MESSAGE}的值
之后编辑或新的,配置发动对象等,可以发送到某个用户或组,再配置发送到的媒介。注意,用户必须有该媒介,并且有触发动作的主机的权限,否则不会收到消息。同样的我们可以配置恢复和确认操作,也可以不配置。
附录
1.钉钉机器人接口脚本
钉钉群——群设置——群机器人——添加机器人
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: wyx
import requests
import json
import sys
headers = {'Content-Type': 'application/json;charset=utf-8'}
api_url = "https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8b8d62184"
def msg(text):
json_text = {
"msgtype": "text",
"at": {
"atMobiles": [],
"isAtAll": False
},
"text": {
"content": text
}
}
print(requests.post(api_url, json.dumps(json_text), headers=headers).content)
if __name__ == '__main__':
text = sys.argv[1]
msg(text)
运行脚本,钉钉受到消息
./send_msg_dingding.py "hello everyone"
2.电话告警一般需要购买固定电话号码,并提交审核通过,如阿里云、华为云,之后根据sdk调用接口
3.短信服务也需要购买并通过审核,但相比电话审核方便快捷得多,费用也较低
4.这是python写的监控脚本,可以获取系统信息
# -*- coding:utf-8 -*-
import psutil
import sys
def getpid(processName,number):
pids=psutil.pids()
i=1
for pid in pids:
p = psutil.Process(pid)
if p.name() == processName:
if i==int(number):
return pid
i+=1
else :
i+=1
continue
if __name__ =="__main__":
if "rss"==sys.argv[1]:
pid=getpid(sys.argv[2],sys.argv[3])
p = psutil.Process(pid)
a= p.memory_info()
print a.rss
elif "vms"==sys.argv[1]:
pid=getpid(sys.argv[2],sys.argv[3])
p = psutil.Process(pid)
a= p.memory_info()
print a.vms
elif "vms_used" == sys.argv[1]:
vms_used = psutil.swap_memory().used
print vms_used
elif "percent"==sys.argv[1]:
pid=getpid(sys.argv[2],sys.argv[3])
p = psutil.Process(pid)
percent=p.memory_percent()
print percent
elif "cpu_user"==sys.argv[1]:
pid=getpid(sys.argv[2],sys.argv[3])
p = psutil.Process(pid)
cpu=p.cpu_times()
print cpu.user
elif "cpu_system"==sys.argv[1]:
pid=getpid(sys.argv[2],sys.argv[3])
p = psutil.Process(pid)
cpu=p.cpu_times()
print cpu.system
elif "cpu_percent" ==sys.argv[1]:
pid=getpid(sys.argv[2],sys.argv[3])
p = psutil.Process(pid)
#print pid
cpu=p.cpu_percent(interval=1)
#/psutil.cpu_count()
#print psutil.cpu_count()
print cpu
elif "mem_usd" == sys.argv[1]:
mem = psutil.virtual_memory()
print mem.percent
else:
print "pless chanshu"