企业实战之监控升级可视化zabbix4.0 系列 三

用户管理及告警实战

zabbix4.0系列
—私人课件,不出版,不公开,禁止传播
想做好运维工作,人先要学会勤快;
居安思危,勤记而补拙,方可不断提高;
别人的资料用的再爽也是别人的;
自己总结的东西是你自身特有的一种思想与理念的展现;
精髓不是看出来的,精髓是记出来的;
请同学们在学习的过程中养成好的学习习惯;
勤于实践,抛弃教案,勤于动手,整理文档。
+


一、实验环境

zabbix-server端

操作系统 主机名 ip 内存
centos7.5 zabbix 192.168.200.173 1G

zabbix-agent端

操作系统 被监控的主机名 ip地址 运行的项目 内存
centos6.5 www_001 192.168.200.128 nginx 1G
centos7.5 www_002 192.168.200.131 nginx 1G

二、用户管理

Zabbix创建用户

2.1创建用户组 dev

设置用户组权限,权限必须在用户组设置
image.png
image.png
image.png
image.png

2.2创建用户dev_suluo,属于用户组dev

image.png
image.png
image.png
image.png

2.3使用新建的用户登录Zabbix

image.png
image.png
image.png
image.png
image.png
image.png

三、邮件告警

3.1实验环境准备

  1. 在zabbix服务器先把映射文件发送到我们需要监控的服务器上

  2. [root@zabbix~]#cat/etc/hosts
  3. 127.0.0.1localhost localhost.localdomain localhost4 localhost4.localdomain4
  4. ::1localhost localhost.localdomain localhost6 localhost6.localdomain6
  5. 192.168.200.173zabbix
  6. 192.168.200.128www_001
  7. 192.168.200.131www_002
  8. [root@zabbix~]#scp/etc/hosts192.168.200.128:/etc/
  9. Theauthenticity of host’192.168.200.128 (192.168.200.128)’can’t be established.
  10. RSA key fingerprint is SHA256:LWinuYuB8lkixPIA7KfaMNL5vA+hQ3LG7e6Hv2U/6r0.
  11. RSA key fingerprint is MD5:60:1e:00:37:85:8b:a1:74:68:b3:35:3b:eb:20:33:3a.
  12. Are you sure you want to continue connecting (yes/no)? yes
  13. Warning: Permanently added ‘192.168.200.128’ (RSA) to the list of known hosts.
  14. root@192.168.200.128’s password:
  15. hosts100%229218.6KB/s00:00
  16. [root@zabbix~]#scp/etc/hosts192.168.200.131:/etc/
  17. Theauthenticity of host’192.168.200.131 (192.168.200.131)’can’t be established.
  18. ECDSA key fingerprint is SHA256:46jNFg96R/vgl81faS4UuFgiAaeYj2mC+OtQtVfR1I8.
  19. ECDSA key fingerprint is MD5:32:70:a3:6c:1f:50:33:7f:b6:9a:e4:c5:4b:ea:d9:99.
  20. Are you sure you want to continue connecting (yes/no)? yes
  21. Warning: Permanently added ‘192.168.200.131’ (ECDSA) to the list of known hosts.
  22. root@192.168.200.131’s password:
  23. hosts100%22911.3KB/s00:00
  24. 在www_001这台服务器上修改主机名

  25. [root@192~]#cat/etc/redhat-release
  26. CentOSrelease6.5(Final)
  27. [root@192~]#hostname-I
  28. 192.168.200.128
  29. [root@192~]#vim/etc/sysconfig/network
  30. [root@192~]#cat/etc/sysconfig/network
  31. NETWORKING=yes
  32. HOSTNAME=www_001
  33. [root@192~]#hostname www_001
  34. [root@192~]#exit
  35. [root@www_001~]#
  36. 在www_002这台服务器上修改主机名

  37. [root@192~]#cat/etc/redhat-release
  38. CentOSLinuxrelease7.5.1804(Core)
  39. [root@192~]#hostname-I
  40. 192.168.200.131
  41. [root@192~]#vim/etc/hostname
  42. [root@192~]#cat/etc/hostname
  43. www_002
  44. [root@192~]#reboot
  45. [root@www_002~]#

    3.2在agent端www_001服务器建立被监控的nginx服务

  46. [root@www_001~]#ls

  47. anaconda-ks.cfg install.log install.log.syslog nginx-1.16.1.tar.gz
  48. [root@www_001~]#mount/dev/sr0/media/cdrom/
  49. mount:block device/dev/sr0iswrite-protected,mounting read-only
  50. [root@www_001~]#yum install-y wget gcc gcc-c++make pcre pcre-devel zlib zlib-devel openssl openssl-devel
  51. [root@www_001~]#tar xf nginx-1.16.1.tar.gz-C/usr/src/
  52. [root@www_001~]#cd/usr/src/nginx-1.16.1/
  53. [root@www_001 nginx-1.16.1]#./configure—prefix=/usr/local/nginx&&make&&make install
  54. [root@www_001 nginx-1.16.1]#ln-s/usr/local/nginx/sbin/* /usr/bin/
  55. [root@www_001 nginx-1.16.1]# cd /usr/local/nginx/conf/
  56. [root@www_001 conf]# egrep -v “#|^$” nginx.conf.default > nginx.conf
  57. [root@www_001 conf]# nginx -t
  58. nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
  59. nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
  60. [root@www_001 conf]# nginx
  61. [root@www_001 conf]# ss -antup | grep 80
  62. tcp LISTEN 0 128 :80 :* users:((“nginx”,4006,6),(“nginx”,4007,6))

    3.3在agent端www_002服务器建立被监控的nginx服务

  63. [root@www_002~]#ls

  64. anaconda-ks.cfg nginx-1.16.1.tar.gz
  65. [root@www_002~]#yum install-y wget gcc gcc-c++make pcre pcre-devel zlib zlib-devel openssl openssl-devel
  66. [root@www_002~]#tar xf nginx-1.16.1.tar.gz-C/usr/src/
  67. [root@www_002~]#cd/usr/src/nginx-1.16.1/
  68. [root@www_002 nginx-1.16.1]#./configure—prefix=/usr/local/nginx&&make&&make install
  69. [root@www_002 nginx-1.16.1]#ln-s/usr/local/nginx/sbin/* /usr/bin/
  70. [root@www_002 nginx-1.16.1]# cd /usr/local/nginx/conf/
  71. [root@www_002 conf]# egrep -v “#|^$” nginx.conf.default > nginx.conf
  72. [root@www_002 conf]# nginx -t
  73. nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
  74. nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
  75. [root@www_002 conf]# nginx
  76. [root@www_002 conf]# ss -antup | grep 80
  77. tcp LISTEN 0 128 :80 :* users:((“nginx”,pid=3867,fd=6),(“nginx”,pid=3866,fd=6))
  78. 使用systemctl管理起来

  79. [root@www_002 conf]# cat /usr/lib/systemd/system/nginx.service
  80. [Unit]
  81. Description=nginx
  82. After=network.target
  83. [Service]
  84. Type=forking
  85. ExecStart=/usr/local/nginx/sbin/nginx
  86. [Install]
  87. WantedBy=multi-user.target
  88. 如果这里有问题请重启下服务器

  89. [root@www_002 ~]# systemctl stop nginx
  90. [root@www_002 ~]# ss -antup
  91. Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
  92. udp UNCONN 0 0 :68 :* users:((“dhclient”,pid=832,fd=6))
  93. tcp LISTEN 0 128 :22 :* users:((“sshd”,pid=889,fd=3))
  94. tcp LISTEN 0 100 127.0.0.1:25 : users:((“master”,pid=1043,fd=13))
  95. tcp ESTAB 0 52 192.168.200.131:22 192.168.200.1:52460 users:((“sshd”,pid=969,fd=3))
  96. tcp LISTEN 0 128 :::22 :::* users:((“sshd”,pid=889,fd=4))
  97. tcp LISTEN 0 100 ::1:25 :::* users:((“master”,pid=1043,fd=14))
  98. [root@www_002 ~]# ss -antup | grep 80
  99. tcp LISTEN 0 128 :80 :* users:((“nginx”,pid=1201,fd=6),(“nginx”,pid=1200,fd=6))

    四、zabbix告警原理

    触发器触发后,可以配置对应的动作
    在动作里可以发邮件、微信、钉钉、短信等

    4.1查看告警脚本的放置位置

  100. 在zabbixserver端

  101. [root@zabbix~]#cat/usr/local/zabbix/etc/zabbix_server.conf
  102. LogFile=/usr/local/zabbix/zabbix_server.log
  103. DBHost=127.0.0.1
  104. DBName=zabbix
  105. DBUser=zabbix
  106. DBPassword=zabbixpwd
  107. DBPort=3306
  108. Timeout=30
  109. AlertScriptsPath=/usr/local/zabbix/alertscripts#邮件告警和微信告警的脚本放置位置
  110. ExternalScripts=/usr/local/zabbix/externalscripts
  111. LogSlowQueries=3000
  112. [root@zabbix~]#ll/usr/local/zabbix/alertscripts#发现没有需要我们自己去创建一个
  113. ls:cannot access/usr/local/zabbix/alertscripts:Nosuch fileordirectory
  114. [root@zabbix~]#mkdir-p/usr/local/zabbix/alertscripts
  115. [root@zabbix~]#cd/usr/local/zabbix/alertscripts/
  116. 这里特别注意zabbix_server配置文件里不能出现中文,如果有中文在做邮件报警的时候回报错,请删掉并且重启zabbix_server。如果还是不行,就直接重启服务器。然后把各个服务重启一遍

  117. 命令:
  118. [root@zabbix~]#cp/usr/src/zabbix-4.0.3/misc/init.d/fedora/core/zabbix_server/etc/init.d/
  119. [root@zabbix~]#/etc/init.d/zabbix_server restart

附录1:邮件告警注意事项
服务器往外的25端口一般被云厂商禁止
所以建议使用465端口发送邮件
qq邮箱、163邮箱需要配置开启smtp

4.2生产邮箱授权码

image.png
image.png
image.png
image.png
附录2:qq授权码

  • pjtryeiuazqdcbbe

    4.3创建邮件告警脚本,并测试

  1. [root@zabbix alertscripts]#cat/usr/local/zabbix/alertscripts/zabbix_sendmail.py
  2. !/usr/bin/python

  3. -- coding: utf-8 --

  4. fromemail.mime.textimportMIMEText#python 加载的包
  5. fromemail.headerimportHeader#python 加载的包
  6. fromsmtplibimportSMTP_SSL#python 加载的包
  7. importsys
  8. smtpaddr=’smtp.qq.com‘#表示使用qq邮箱,如果你要使用163邮箱,就写成smtp.163.com
  9. myemail=’493115250@qq.com‘#你的邮箱地址
  10. password=’pjtryeiuazqdcbbe’#这里写你的授权码,每次都是不一样的,不要照抄
  11. recvmail=sys.argv[1]#对应邮件的发给谁
  12. subject=sys.argv[2]#对应邮件的主题
  13. content=sys.argv[3]#对应邮件的内容
  14. msg=MIMEText(“””%s”””%(content),”plain”,”utf-8”)#(content 里面是内容)
  15. msg[‘Subject’]=Header(subject,’utf-8’).encode()#(这里是主题)
  16. msg[‘From’]=myemail#调用上边的谁发的
  17. msg[‘To’]=recvmail#调用上边的参数发给谁
  18. try:
  19. smtp=SMTP_SSL(smtpaddr)#使用的协议,写这几行的时候一定要前面空格,要不报错
  20. smtp.login(myemail,password)#调用上边的账号和密码
  21. smtp.sendmail(myemail,recvmail.split(‘,’),msg.as_string())#myemail是我的邮箱,recvmailsplit(‘,’)是发送给谁,多个人用逗号隔开,一定要英文的,msg.as_string是发送的内容
  22. smtp.quit()
  23. print(“success”)#成功就发成功
  24. exceptExceptionase:
  25. print(“fail: “+str(e))#失败就发失败
  26. 注意复制粘贴以后吧注释去掉

  27. 验证脚本是否成功

  28. [root@zabbix alertscripts]#chmod+x zabbix_sendmail.py
  29. [root@zabbix alertscripts]#/usr/local/zabbix/alertscripts/zabbix_sendmail.py493115250@qq.com’zabbix disk’’content: disk > 90%’
  30. success

    4.4查看邮箱是否收到邮件

    image.png

    4.5报警媒介添加邮件告警

    image.png
    image.png
    image.png
    附录3:三个参数
  • 发送给谁{ALERT.SENDTO}
  • 发送的主题{ALERT.SUBJECT}
  • 发送内容{ALERT.MESSAGE}

    4.6用户设置报警媒介

    image.png
    image.png
    image.png

    4.7修改模板的监控项

    image.png
    image.png
    image.png
    image.png

    4.8定义模板触发器

    image.png
    image.png
    image.png
    image.png
    image.png

    4.9触发器关联动作

    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png

    4.10验证发送邮件

    image.png
  1. 我们让www_001服务器的nginx挂掉
  2. [root@www_001 conf]#nginx-s stop

image.png
image.png

4.11将001服务器回复我们看一下

  1. [root@www_001~]#nginx
  2. [root@www_001~]#ss-antup|grep80
  3. tcp LISTEN0128:80:*users:((“nginx”,4395,6),(“nginx”,4396,6))

image.png
image.png

4.12告警内容自定义以及告警抑制

一般来说我们自定义主题,里边带上主机名,以及主机ip就可以了,这样我们只看主题就可以很明确的看出是哪个服务器出问题了

  • 主机名变量:{HOST.NAME1}
  • 主机IP变量:{HOST.IP1}

image.png
image.png
image.png
image.png

4.13发送邮件来验证自定义告警主题内容

  1. 让www_001nginx挂掉
  2. [root@www_001~]#nginx-s stop
  3. [root@www_001~]#ss-antup|grep80

image.png
image.png

4.14将www_001主机的nginx回复我们看下邮件

  1. [root@www_001~]#nginx
  2. [root@www_001~]#ss-antup|grep80
  3. tcp LISTEN0128:80:*users:((“nginx”,4454,6),(“nginx”,4455,6))

image.png
image.png

4.15告警抑制

为什么要用告警抑制
像我们监控80端口这样的监控项,有的时候会因为网络波动获取不到数据,这个时候如果直接报警,我们设定通知100个人,那么100个人会收到邮件,下次网络恢复了,会在发邮件,这样的话,运维的垃圾邮件太多。所以我们要使用告警抑制,如果连续2分钟或者5分钟检查不到80端口,这个时候我们在发送邮件
image.png
image.png
image.png
image.png
image.png
image.png

4.16验证告警抑制

模拟网络波动

  1. [root@www_001~]#nginx-s stop
  2. [root@www_001~]#ss-antup|grep80

image.png

  1. [root@www_001~]#nginx
  2. [root@www_001~]#ss-antup|grep80
  3. tcp LISTEN0128:80:*users:((“nginx”,4505,6),(“nginx”,4506,6))

image.png
image.png

4.17我们来测试抑制两分钟后,再发送邮件

  1. [root@www_001~]#nginx-s stop
  2. [root@www_001~]#ss-antup|grep80

image.png
image.png
image.png
我们恢复nginx

  1. [root@www_001~]#nginx
  2. [root@www_001~]#ss-antup|grep80
  3. tcp LISTEN0128:80:*users:((“nginx”,4548,6),(“nginx”,4549,6))

image.png
image.png
附录4:

  • 在线上一般来说数据库等压力比较大,我们会一分钟探测一次,连续3次没连接才会发邮件,也就是说我们需要在次数哪里设置成4次。

    五、微信告警

    5.1注册企业微信

  1. 企业微信注册网址:https://[work.weixin.qq.com/](http://work.weixin.qq.com/)

image.png
自己按着步骤去注册一个
image.png
image.png
不用下载企业微信就可以接受消息操作
image.png
image.png
获取zabbix给微信发消息的账号
image.png
image.png
创建应用,并且选择给谁发微信
image.png
image.png
image.png
image.png
记录我们重要的三个参数
image.png
image.png

5.2编写发送给微信的脚本

附录5:

  • agentid = ‘1000002’ #这里是你的应用ID
  • corpid = ‘wweb7edbef7979a552’ #这里是你的企业ID
  • corpsecret = ‘XZdSEpQJxL3qEojydpGd3CymHx3te4kryZzkw5e8kYM’ #这里是你的应用ID的密码
  • touser=sys.argv1 #many user: ‘zhangsan|wangwu’ 这个是发送给谁,我们这里使用参数,如果是多用户可以使用 | 去分割
  • content=sys.argv2 #content 发送的内容下边的脚本可以直接粘贴使用,但是需要改下应用ID,企业ID,应用密码,后边的都不用改,其余的直接复制,脚本里不可以出现中文。
  1. [root@zabbix~]#cat/usr/local/zabbix/alertscripts/zabbix_wx.py
  2. !/usr/bin/python

  3. -- coding: utf-8 --

  4. importjson
  5. importsys
  6. importurllib,urllib2
  7. agentid=’1000002’
  8. corpid=’wweb7edbef7979a552’
  9. corpsecret=’XZdSEpQJxL3qEojydpGd3CymHx3te4kryZzkw5e8kYM’
  10. get tocken

  11. gettoken_url=’https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=‘+corpid+’&corpsecret=’+corpsecret
  12. token_file=urllib2.urlopen(gettoken_url)
  13. token_data=token_file.read().decode(‘utf-8’)
  14. token_json=json.loads(token_data)
  15. my_token=token_json[‘access_token’]
  16. send wechart

  17. touser=sys.argv[1]#many user: ‘zhangsan|wangwu’
  18. content=sys.argv[2]#content
  19. post_content={
  20. “touser”:touser,
  21. “agentid”:agentid,
  22. “msgtype”:”text”,
  23. “text”:{
  24. “content”:content,
  25. }
  26. }
  27. json_content=json.dumps(post_content)
  28. url=’https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=‘+my_token
  29. response=urllib2.urlopen(url,json_content)
  30. print(response.read().decode(‘utf-8’))
  31. [root@zabbix~]#chmod+x/usr/local/zabbix/alertscripts/zabbix_wx.py
  32. [root@zabbix~]#/usr/local/zabbix/alertscripts/zabbix_wx.py’Suluo’’disk >90’
  33. {“errcode”:0,”errmsg”:”ok”,”invaliduser”:””}
  34. ‘Suluo’ 是你的账号,后边的是’’里边是发送的内容

image.png

5.3在web界面设置媒介

image.png
image.png
image.png
image.png

5.4定义给那个用户

image.png
image.png
image.png
image.png
image.png

5.5定义动作

image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png

5.6测试微信发送告警

  1. [root@www_001~]#nginx-s stop
  2. [root@www_001~]#ss-antup|grep80

image.png
image.png

  1. [root@www_001~]#nginx
  2. [root@www_001~]#ss-antup|grep80
  3. tcp LISTEN0128:80:*users:((“nginx”,4713,6),(“nginx”,4714,6))

image.png
image.png

六、钉钉告警

6.1注册一个企业钉钉

注册地址
https://oa.dingtalk.com/
根据提示自己注册一个
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png

6.2编写发送给钉钉的脚本

  1. [root@zabbix~]#cat/usr/local/zabbix/alertscripts/zabbix_dd.py
  2. !/usr/bin/python

  3. -- coding: utf-8 --

  4. curl ‘https://oapi.dingtalk.com/gettoken?corpid=xxx&corpsecret=xxx

  5. importjson,urllib2,sys
  6. appkey=’ding6wxsawxeygipfztg’#这里发现跟微信的脚本的用法一样,同样的需要这三个重要的信息
  7. appsecret=’Xm3N2C4L05omoBogh8_qKhj5f4IB0jtH6ely0Yw1oQbKJPUjl0nyMrSi234BSk8x’
  8. agentid=’583990691’
  9. touser=sys.argv[1]
  10. content=sys.argv[2]
  11. tockenurl=’https://oapi.dingtalk.com/gettoken?corpid=‘+appkey+”&corpsecret=”+appsecret
  12. tockenresponse=urllib2.urlopen(tockenurl)
  13. tockenresult=json.loads(tockenresponse.read().decode(‘utf-8’))
  14. tocken=tockenresult[‘access_token’]
  15. sendurl=’https://oapi.dingtalk.com/message/send?access_token=‘+tocken
  16. headers={
  17. ‘Content-Type’:’application/json’
  18. }
  19. main_content={
  20. “touser”:touser,
  21. “toparty”:””,
  22. “agentid”:agentid,
  23. “msgtype”:”text”,
  24. “text”:{
  25. “content”:content
  26. }
  27. }
  28. main_content=json.dumps(main_content)
  29. req=urllib2.Request(sendurl,headers=headers)
  30. response=urllib2.urlopen(req,main_content.encode(‘utf8’))
  31. print(response.read().decode(‘utf-8’))
  32. 注意脚本里不要出现中文,还有这个重要的信息有可能会变,大家看好自己的在去改下。

image.png

6.3测试钉钉脚本

  1. [root@zabbix~]#chmod+x/usr/local/zabbix/alertscripts/zabbix_dd.py
  2. [root@zabbix~]#/usr/local/zabbix/alertscripts/zabbix_dd.py manager6580’disk > 90’
  3. {“errcode”:0,”errmsg”:”ok”,”messageId”:”578997677db63d4bb6df100dc61c1c0b”,”invalidparty”:””,”invaliduser”:””}

    6.4钉钉接受到了消息

    image.png

    6.5在web界面定义媒介

    image.png
    image.png
    image.png
    image.png

    6.6定义给那个用户

    image.png
    image.png
    image.png
    image.png
    image.png

    6.7定义动作

    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png

    6.8测试钉钉

  4. [root@www_001~]#nginx-s stop

  5. [root@www_001~]#ss-antup|grep80

image.png
image.png
恢复www_001

  1. [root@www_001~]#nginx
  2. [root@www_001~]#ss-antup|grep80
  3. tcp LISTEN0128:80:*users:((“nginx”,4849,6),(“nginx”,4850,6))

image.png
image.png