服务端配置请看这一篇:CentOS7.6 源码安装zabbix5.0及初始化配置(超详细)
服务端:192.168.245.204
客户端:192.168.245.203
这里测试基于http服务的告警,如果服务down了就微信通知告警
这里还需要安装注册企业微信,请提前安装好,后面有说明
服务端配置好以后,我们需要配置客户端,客户端需要安装zabbix_agent并启动才能让zabbix服务器监控到它
首先下载zabbix_agent,我这里是源码安装的
[root@dockertest ~]# wget https://cdn.zabbix.com/zabbix/binaries/stable/5.0/5.0.13/zabbix_agent-5.0.13-linux-3.0-amd64-static.tar.gz
创建一个目录用于存放文件
[root@dockertest ~]# mkdir /usr/local/zabbix_agent
解压源码包到zabbix_agent目录
[root@dockertest ~]# tar xf zabbix_agent-5.0.13-linux-3.0-amd64-static.tar.gz -C /usr/local/zabbix_agent
修改配置文件zabbix_agentd.conf
[root@dockertest ~]# cd /usr/local/zabbix_agent/
[root@dockertest zabbix_agent]# vim conf/zabbix_agentd.conf
Server=192.168.245.204
ServerActive=192.168.245.204
Hostname=Apache web server
UnsafeUserParameters=1
制作命令的软链接
[root@dockertest zabbix_agent]# ln -s /usr/local/zabbix_agent/bin/* /usr/local/bin/
[root@dockertest zabbix_agent]# ln -s /usr/local/zabbix_agent/sbin/* /usr/local/sbin/
然后需要把配置文件放到/usr/local/etc/zabbix_agentd.conf下否则无法启动
[root@dockertest zabbix_agent]# cp conf/zabbix_agentd.conf /usr/local/etc/zabbix_agentd.conf
还要创建系统用户和组zabbix否则也无法启动
[root@dockertest zabbix_agent]# groupadd --system zabbix
[root@dockertest zabbix_agent]# useradd --system -g zabbix -d /usr/lib/zabbix -s /sbin/nologin -c "Zabbix Monitoring System" zabbix
启动zabbix客户端程序
[root@dockertest zabbix_agent]# zabbix_agentd
[root@dockertest zabbix_agent]# netstat -antp | grep zabbix
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 31625/zabbix_agentd
到服务端上去检查一下能否获得客户端的信息
[root@zabbix-server ~]# zabbix_get -s 192.168.245.203 -p 10050 -k system.uname
Linux dockertest 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64
因为我们监控的是客户端的http服务,所以安装apache并启动
[root@dockertest zabbix_agent]# yum -y install httpd
[root@dockertest zabbix_agent]# systemctl start httpd
这边建议创建模板然后创建主机,然后到主机里去链接到模板,这样比较灵活,因为有可能你要对多个主机应用同一个模板,就不用一个个创建
链接好查看应该是这样的
服务器设置好以后就开始对微信进行相关设置
https://work.weixin.qq.com/wework_admin/register_wx
创建好之后需要进行接口的调试,这一步主要就是测试我们之后微信可否能发成功
微信企业号接口调试工具:
https://open.work.weixin.qq.com/wwopen/devtool/interface/combine
调试的时候需要两样东西
1、企业id
2、secret
企业微信团队会给你发消息,点击“前往查看”
把secret复制到电脑上
下面就开始编写微信告警的脚本了
告警脚本存放位置:/usr/local/share/zabbix/alertscripts
因为微信告警脚本是python写的,所以需要先安装python,系统预装python版本是2.7,实践会报错找不到模块
ImportError: No module named 'typing'
所以需要安装python3.6解决,但yum支持不了这么高版本的python,所以这里用源码安装python,然后装requests模块的时候也不要用系统预装的pip,用pip3
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
wget https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz
tar -xf Python-3.6.4.tgz
mkdir -p /usr/local/Python3
cd Python-3.6.4/
./configure --prefix=/usr/local/python3
make && make install
ln -s /usr/local/python3/bin/python3.6 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3.6 /usr/bin/pip3
cd /usr/local/python3
pip3 install requests //requests是一个Python第三方库,处理URL资源特别方便
一定要到告警脚本目录下,把微信的告警脚本放进去,这里是找的网上的版本,自己根据实际情况把重要字段改了下,需要修改的地方后面用#注释标明了,需要改成自己微信相关的信息
[root@zabbix-server python3]# cd /usr/local/share/zabbix/alertscripts
[root@zabbix-server alertscripts]# vim wechat.py
#!/usr/bin/python2.7
#_*_coding:utf-8 _*_
#auther:火星小刘
import requests,sys,json
import urllib3
urllib3.disable_warnings()
reload(sys)
sys.setdefaultencoding('utf-8')
def GetTokenFromServer(Corpid,Secret):
Url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"
Data = {
"corpid":Corpid,
"corpsecret":Secret
}
r = requests.get(url=Url,params=Data,verify=False)
print(r.json())
if r.json()['errcode'] != 0:
return False
else:
Token = r.json()['access_token']
file = open('/tmp/zabbix_wechat_config.json', 'w')
file.write(r.text)
file.close()
return Token
def SendMessage(User,Agentid,Subject,Content):
try:
file = open('/tmp/zabbix_wechat_config.json', 'r')
Token = json.load(file)['access_token']
file.close()
except:
Token = GetTokenFromServer(Corpid, Secret)
n = 0
Url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s" % Token
Data = {
"touser": "S*****ie", # 企业号中的用户帐号,在zabbix用户Media中配置,如果配置不正常,将按部门发送。
#"totag": Tagid, # 企业号中的标签id,群发使用(推荐)
"toparty": "2", # 企业号中的部门id,群发时使用。
"msgtype": "text", # 消息类型。
"agentid": "1000002", # 企业号中的应用id。
"text": {
"content": Subject + '\n' + Content
},
"safe": "0"
}
r = requests.post(url=Url,data=json.dumps(Data),verify=False)
while r.json()['errcode'] != 0 and n < 4:
n+=1
Token = GetTokenFromServer(Corpid, Secret)
if Token:
Url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s" % Token
r = requests.post(url=Url,data=json.dumps(Data),verify=False)
print(r.json())
return r.json()
if __name__ == '__main__':
User = sys.argv[1] # zabbix传过来的第一个参数
Subject = str(sys.argv[2]) # zabbix传过来的第二个参数
Content = str(sys.argv[3]) # zabbix传过来的第三个参数
Corpid = "ww6ba7489884e59b0c" # CorpID是企业号的标识
Secret = "Mnzu5QIAKF5zJqg-2N33PDbssY9Kx3RK1XxA8FTNgUk" # Secret是管理组凭证密钥
#Tagid = "1" # 通讯录标签ID
Agentid = "1000002" # 应用ID
Partyid = "2" # 部门ID
Status = SendMessage(User,Agentid,Subject,Content)
print Status
修改完别忘了加可执行权限
[root@zabbix-server alertscripts]# chmod +x wechat.py
手动测试一下发一条信息看微信能不能收到
[root@zabbix-server alertscripts]# ./wechat.py S******e test hello
/usr/lib/python2.7/site-packages/urllib3/connectionpool.py:769: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.org/en/latest/security.html
InsecureRequestWarning)
{
u'access_token': u's3eqGeu6Sr9ZyFsar8ll9TgxInJ9UhYrH6TbyUg9xkI63FrSUjZQYS44hwEVGJP4krUBVP-qrViPwiADf929tBa1oCyRHIwqZkMhuMEboOqgumYql1bTpvphaYJZFcpyfyHq50cLKZiFzudgggJXcgbfGlE5vJHA8gvUHeHeejluQxWO39N40qgTscHOy_eotm-VWFuFBTXB39Yqvph5Sg', u'expires_in': 7200, u'errcode': 0, u'errmsg': u'ok'}
{
u'invaliduser': u'', u'errcode': 0, u'errmsg': u'ok'}
wechat.py的三个参数:
企业账号:S*****e
标题:test
内容:hello
能收到说明我们微信告警的脚本就没问题了,可以用了
测试报警之前需要修改一下这个文件的权限:zabbix_wechat_config.json
这个文件是用来存放刚才接口调用的返回结果的
否则之后告警会报没有权限而无法发送
[root@zabbix-server ~]# ll /tmp/zabbix_wechat_config.json
-rw-r--r-- 1 root root 277 7月 7 17:52 /tmp/zabbix_wechat_config.json
[root@zabbix-server ~]# chown zabbix.zabbix /tmp/zabbix_wechat_config.json
故障问题:{
EVENT.NAME}
告警主机:{
HOSTNAME1}
告警时间:{
EVENT.DATE} {
EVENT.TIME}
告警等级:{
TRIGGER.SEVERITY}
告警信息: {
TRIGGER.NAME}
告警项目:{
TRIGGER.KEY1}
问题详情:{
ITEM.NAME}:{
ITEM.VALUE}
当前状态:{
TRIGGER.STATUS}:{
ITEM.VALUE1}
事件ID:{
EVENT.ID}
故障恢复:{
EVENT.NAME}
恢复主机:{
HOSTNAME1}
主机IP:{
HOST.IP}
恢复时间:{
EVENT.RECOVERY.TIME} //网上很多这里写的跟告警时间是一样的,如果是这样会出现故障恢复了才会发告警信息,这一般不符合逻辑,所以需要改成这样
告警等级:{
TRIGGER.SEVERITY}
告警项目:{
TRIGGER.KEY1}
当前状态:{
TRIGGER.STATUS}:{
ITEM.VALUE1}
事件ID:{
EVENT.ID}
到客户端上把http服务停掉
[root@dockertest ~]# systemctl stop httpd
大概几秒钟之后zabbix的主页就能同步状态并提示已发送告警
微信收到如下提示:
再到客户端把http服务开启,主页问题就消失了,微信收到如下信息,测试成功
[root@dockertest ~]# systemctl start httpd