一、监控对象
二、监控信息收集方式
被动
监控对象上报错误:
优点:占用网络资源少,占用存储资源少
缺点:及时性差
主动
定时查看业务状态:
优点:及时性好
缺点:占用资源
三、Zabbix部署
官网
ZabbixYum源
环境
ip 主机名 角色
IPADDER zabbix_server 监控服务器
IPADDER web1 业务主机
zabbix=server(192.168.238.136)
3.1 安装Zabbix包
准备zabbix.repo
阿里云zabbix镜像
[zabbix]
name=alibaba zabbix
baseurl=https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/
gpgcheck=0
enabled=1
[zabbix2]
name=alibaba zabbix frontend
baseurl=https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/frontend/
gpgcheck=0
enabled=1
3.2 安装Zabbix服务器
yum clean all
yum -y install zabbix-mysql zabbix-agent
#zabbix-server-mysql :数据库
#zabbix-agent: 代理程序
yum instll centos-release-scl
#centos发布scl
yum install zabbix-web-mysql-scl zabbix-apache-conf-scl
#zabbix 前台页面
3.3 安装数据库
#安装数据库
yum -y install mariadb mariadb-server
#启动数据库
systemctl enable mariadb
systemctl start mariadb
#授权zabbix账号
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> create user zabbix@localhost identified by 'XuLei@123';
mysql> grant all privileges on zabbix.* to zabbix@localhost;
mysql> flush privileges;
msyql> quit;
#初始化zabbix
[root@zabbix-server ~]# ls /usr/share/doc/zabbix-server-mysql-5.0.8/
AUTHORS ChangeLog COPYING create.sql.gz double.sql NEWS README
zcat /usr/share/doc/zabbix-server-mysql-5.0.8/create.sql.gz | mysql -uzabbix -p'XuLei@123' zabbix
3.4 启动zabbix sever process
#配置sql账号密码
vim /etc/zabbix/zabbix_server.conf
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=XuLei@123
#启动zabbix
systemctl enable zabbix-server.service
systemctl start zabbix-server.service
3.5 编辑Zabbix前端的PHP配置
vim /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf
php_value date.timezone Asia/Shanghai
systemctl restart zabbix-server zabbix-agent httpd rh-php72-php-fpm
systemctl enable zabbix-server zabbix-agent httpd rh-php72-php-fpm
3.6 访问zabbix的页面
www.IPADDER/zabbix
Zabbix默认密码 Admin zabbix
图形显示乱码问题
四、Zabbix Items
4.1 新建模板
4.2 关联主机模板
4.3 新建监控项
监控项介绍
vfs.fs.size[fs,]
fs:硬盘分区
mode :默认是total,【free,used,pfree,pused】,以p开头表示是百分比,不是以p开头返回字节
vfs.fs.size[/,used]
4.4 查看
4.5 创建触发器
4.6 创建图形
4.7 查看图形
4.8 监控示例
监控服务器网络接口进出口流量
五、Zabbix user parameters
自定义KEY
#mysql 安装在被监测主机.238.138
yum -y install mariadb-server mariadb
systemctl start mariadb
mysqladmin -uroot status | cut -f4 -d":" | cut -f1 -d"S"
mysqladmin -u root -proot -h localhost status
这条命令返回MYSQL当前状态的几个值
Uptime: 18869 Threads: 1 Questions: 1 Slow queries: 0 Opens: 33 Flush tables: 1 c: 0 Queries per second avg: 0.000
Uptime:是mysql正常运行的时间。
Threads:指开启的会话数吧。
Questions: 服务器启动以来客户的问题(查询)数目 (应该是只要跟mysql作交互:不管你查询表,还是查询服务器状态都问记一次)。
Slow queries:按字面意思是慢查询的意思,不知道musql认为多久才足够算为长查询,这个先放着。
Opens:服务器已经打开的数据库表的数量
Flush tables: 服务器已经执行的flush …、refresh和reload命令的数量。
open tables:通过命令是用的数据库的表的数量,以服务器启动开始。
Queries per second avg:select语句平均查询时间?
vim /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf
UserParameter=mysql.questions,mysqladmin -uroot status | cut -f4 -d":" | cut -f1 -d"S"
zabbix_agentd -t mysql.questions
mysql.questions [t| 9]
systemctl restart zabbix-agent.service
总结
- 通过shell命令调取相应的值
- 将shell命令,定义到/etc/zabbix/zabbix_agentd.d/*.conf
六、Zabbix Trigger
6.1触发器的作用
触发器用于定义item的报警阈值
触发器对象:模板、主机
6.2 触发器表达式
模板:KSY:函数=VALUE
{<server>:<key>.<function>(<parameter>)}<operation><constant>
常用模板
Template App HTTP Service
Template OS Linux
Template APP MYSQL
6.3 触发器示例
CPU负载超2
帮助:
{www.tianyun.com:system.cpu.load[all,avg1].last(0)}>3
说明:表示主机www.tianyun.com上所有cpu过去1分的平均负载的最后一次取值大于3时将触发状态转换last函数,last(0)表示最后一次取值
6.3.1 监控项
6.3.2 配置触发器
6.3.3 图形监测
6.3.4 出发报警
七、Zabbix Action
7.1 简介
7.2 邮箱告警简介
7.2.1 开启QQ邮箱的授权码
设置独立漫游密码
扫描二维码
7.2.2 Zabbix5.0配置qq邮箱
7.2.3 创建报警动作
Trigger: {TRIGGER.NAME}
Trigger status {TRIGGER.STATUS}
1. {ITEM.NAME1}({HOST.NAME1}:{ITEM.KEY1}):{ITEM.VALUE1}
查看邮箱
7.3 创建微信警告
准备工作
注册企业微信,添加通讯录,建立应用管理->应用
企业微信官方
调用企业微信API接口
7.3.1 配置python告警脚本
vim /usr/lib/zabbix/alertscripts/wechat.py
#配置下面24个参数
# self.__corpid = 'wwa1da242f211cdf47' #设置自己的
# self.__secret = 'rIrN51FEjgW6T2bdmSaEoOIB5UbaBTgddQkuC8cca1w'##设置自己的
# 'toparty':2, #部门ID
# 'agentid':"1000002", #应用ID
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib,urllib2,json
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
class WeChat(object):
__token_id = ''
# init attribute
def __init__(self,url):
self.__url = url.rstrip('/')
self.__corpid = 'wwa1da242f211cdf47' #设置自己的
self.__secret = 'rIrN51FEjgW6T2bdmSaEoOIB5UbaBTgddQkuC8cca1w'##设置自己的
# Get TokenID
def authID(self):
params = {'corpid':self.__corpid, 'corpsecret':self.__secret}
data = urllib.urlencode(params)
content = self.getToken(data)
try:
self.__token_id = content['access_token']
# print content['access_token']
except KeyError:
raise KeyError
# Establish a connection
def getToken(self,data,url_prefix='/'):
url = self.__url + url_prefix + 'gettoken?'
try:
response = urllib2.Request(url + data)
except KeyError:
raise KeyError
result = urllib2.urlopen(response)
content = json.loads(result.read())
return content
# Get sendmessage url
def postData(self,data,url_prefix='/'):
url = self.__url + url_prefix + 'message/send?access_token=%s' % self.__token_id
request = urllib2.Request(url,data)
try:
result = urllib2.urlopen(request)
except urllib2.HTTPError as e:
if hasattr(e,'reason'):
print 'reason',e.reason
elif hasattr(e,'code'):
print 'code',e.code
return 0
else:
content = json.loads(result.read())
result.close()
return content
# send message
def sendMessage(self,touser,message):
self.authID()
data = json.dumps({
'touser':touser,
'toparty':2,
'msgtype':"text",
'agentid':"1000002",
'text':{
'content':message
},
'safe':"0"
},ensure_ascii=False)
response = self.postData(data)
print response
if __name__ == '__main__':
a = WeChat('https://qyapi.weixin.qq.com/cgi-bin')
a.sendMessage(sys.argv[1],sys.argv[3])
#修改权限
[root@ansible alertscripts]# chown zabbix.zabbix /usr/lib/zabbix/alertscripts/wechat.py
[root@ansible alertscripts]# chmod 777 /usr/lib/zabbix/alertscripts/wechat.py
#测试脚本
[root@ansible alertscripts]# ./wechat.py XuLei test test
{u'invalidparty': u'2', u'invaliduser': u'wusong', u'errcode': 0, u'errmsg': u'ok'}
#其中:XuLei为收信人,需要从下图成员详情里查找,test1为title, test为信件内容
配置微信警告 ./wechat.py weixinNAME testsendZHUTI testsend内容提示60020错误
解决方案:
在下面添加提示IP地址
收到报警
7.3.2 Zabbix 配置微信报警
zabbix 3.0 以后需要在为alert脚本定义参数,以前的版本参数都固定的,现在用户可以自己定义命令行的参数了。添加的参数也就是脚本中的收信人、标题和信息内容
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
添加完成需要关联到报警用户 管理->用户->Admin->报警媒介->添加->更新
其中:用户组和管理员根据自己建立添加
7.3.3 关联报警用户
添加动作,触发条件后报警后发送微信消息。
配置–>动作–>创建动作
维护状态–>非在维护–>添加
触发器条件–>触发器–>添加
点击动作下的操作
Trigger: {TRIGGER.NAME}
Trigger status {TRIGGER.STATUS}
1. {ITEM.NAME1}({HOST.NAME1}:{ITEM.KEY1}):{ITEM.VALUE1}
7.3.4 触发报警阈值
7.4 远程执行
当问题发生,可以通过远程执行命令的方式对目标主机进行控制。
7.4.1 创建警告条件
创建警告动作
7.4.2 开启远程执行的功能
在web1上,(别监控机)
[root@web1 ~]# vim /etc/zabbix/zabbix_agentd.conf
EnableRemoteCommands=1
systemctl restart zabbix-agent.service
7.4.3 开启sudo权限
在web1上,被监控机
visudo
zabbix ALL=NOPASSWD: /usr/bin/systemctl restart httpd
7.4.4 模拟httpd服务失败
#在web1上,被监控机,安装httpd,构建httpd 80端口监听项,
#net.tcp.listen[httpd,80]; 设置监控项触发器
systemctl stop httpd
systemctl status httpd
确认模板在使用
查看问题
执行远程命令成功
八、Zabbix自动发现
前言
为了满足监控企业成千上万台服务器,因此我们需要使用Zabbix批量监控来实现。自动发现和自动注册。
8.1 zabbix-server创建自动发现规则
8.2 创建自动发现动作
8.3 自动发现查看IP
九、自动注册
前言
由客户端主动发起,客户端必须安装并启动Agentd,否则无法被自动注册添加至主机列表。
9.1 zabbix agent配置
[root@centos ~]# vim /etc/zabbix/zabbix_agentd.conf
ServerActive=192.168.238.192 主动模式 zabbix-server-ip
[root@centos ~]# service zabbix-agentd restart
9.2 zabbix server配置
9.2.1 创建自动注册动作
9.2.2 在配置->主机中查看设备信息
只看到两台主机,因有一台未安装Agentd所以注册不了
十、Zabbix实战案例:监控TCP连接1
10.1 netstat
netstat中的各种状态:
CLOSED
初始(无连接)状态。
LISTEN
侦听状态,等待远程机器的连接请求。
SYN_SEND
在TCP三次握手期间,主动连接端发送了SYN包后,进入SYN_SEND状态,等待对方的ACK包。
SYN_RECV
在TCP三次握手期间,主动连接端收到SYN包后,进入SYN_RECV状态。
ESTABLISHED
完成TCP三次握手后,主动连接端进入ESTABLISHED状态。此时,TCP连接已经建立,可以进行通信。
FIN_WAIT_1
在TCP四次挥手时,主动关闭端发送FIN包后,进入FIN_WAIT_1状态。
FIN_WAIT_2
在TCP四次挥手时,主动关闭端收到ACK包后,进入FIN_WAIT_2状态。
TIME_WAIT
在TCP四次挥手时,主动关闭端发送了ACK包之后,进入TIME_WAIT状态,等待最多MSL时间,让被动关闭端收到ACK包。
CLOSING
在TCP四次挥手期间,主动关闭端发送了FIN包后,没有收到对应的ACK包,却收到对方的FIN包,此时,进入CLOSING状态。
CLOSE_WAIT
在TCP四次挥手期间,被动关闭端收到FIN包后,进入CLOSE_WAIT状态。
LAST_ACK
在TCP四次挥手时,被动关闭端发送FIN包后,进入LAST_ACK状态,等待对方的ACK包。
主动连接端可能的状态有:
CLOSED SYN_SEND ESTABLISHED。
主动关闭端可能的状态有:
FIN_WAIT_1 FIN_WAIT_2 TIME_WAIT。
被动连接端可能的状态有:
LISTEN SYN_RECV ESTABLISHED。
被动关闭端可能的状态有:
CLOSE_WAIT LAST_ACK CLOSED。
10.2 agent
:准备自定义KEY
[root@web1 ~]# vim /etc/zabbix/zabbix_agentd.d/tcp_status.conf
# Format: UserParameter=<key>,<shell command>
UserParameter=tcp.status.listen,ss -an |grep :80 | grep -i 'LISTEN' |wc -l
UserParameter=tcp.status.timewait,ss -an |grep :80 | grep -i 'TIME-WAIT' |wc -l
UserParameter=tcp.status.established,ss -an |grep :80 | grep -i 'ESTAB' |wc -l
UserParameter=tcp.status.syn_recv,ss -an |grep :80 | grep -i 'SYN_RECV' |wc -l
UserParameter=tcp.status.syn_sent,ss -an |grep :80 | grep -i 'SYN_SENT' |wc -l
UserParameter=tcp.status.close,ss -an |grep :80 | grep -i 'CLOSE' |wc -l
systemctl restart zabbix-agent.service
10.3 server 调用KEY
[root@localhost ~]# zabbix_get -s 192.168.100.20 -k system.uname
Linux web1 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64
[root@localhost ~]# zabbix_get -s 192.168.100.20 -k system.cpu.load[all,avg1]
[root@localhost ~]# zabbix_get -s 192.168.100.20 -k system.cpu.load[all,avg1]
[root@localhost ~]# zabbix_get -s 192.168.100.20 -k tcp.status.listen
十一、实战案例:监控TCP连接2
11.1 agent
[root@localhost ~]# zabbix_get -s 192.168.100.20 -k tcp.status.listen
UserParameter=tcp.status[*],ss -an |grep :80 | grep -i "$1" |wc -l
11.2 server
使用[传参]来调用
[root@localhost ~]# zabbix_get -s 192.168.100.20 -k tcp.status[TIME-WAIT]
[root@localhost ~]# zabbix_get -s 192.168.100.20 -k tcp.status[LISTEN]
[root@localhost ~]# zabbix_get -s 192.168.100.20 -k tcp.status[CLOSE]
十二、实战案例:监控TCP连接3
12.1 agent下载自定义key的包
#下载自定义key包
wget -r ftp://10.18.40.100/zabbix-example # 此包自己找,里面包含了脚本文件
chmod -R +x zabbix-example/
chown -R zabbix zabbix-example
#拷贝命令文件至zabbix目录
mkdir /etc/zabbix/tcp_connect.status
cp zabbix-example/tcp_connect_status/tcp_connect_status.sh /etc/zabbix/tcp_connect.status/
cat /etc/zabbix/tcp_connet.status/tcp_connect_status.sh
#增加用户自定义KEY
cp zabbix-example/tcp_connect_status/tcp_connect_status /etc/zabbix/zabbix_agentd.d/tcp_connect_status.conf
systemctl restart zabbix-agent.service
12.2 server
#zabbix-server执行验证
zabbix_get -s 192.168.100.20 -k tcp.connect.status[LISTEN]
监控项的键值:
监控项的键以类似 xxx.yyy.zzz[mm,<nn>] 方式组织,xxx.yyy.zzz是键名,[mm,<nn>]为键的参数,mm表必填参数,<nn>表可选参数
net.if.collisions[if] 网络冲突数量,返回整型。
net.if.in[if,<mode>] 网络接口上传流量统计,返回 整数。网卡流入量统计,mode:bytes(默认)/packets/errors/dropped
net.if.out[if,<mode>] 上行流量统计,返回整数。网卡流出量统计,mode:bytes(默认)/packets/errors/dropped
net.if.total[if,<mode>] 网络接口上传下载的流量总和,返回整数。网卡的进出流量统计信
息总和,mode:bytes(默认)/packets/errors/dropped
net.tcp.listen[port] 检查 TCP 端口 是否处于侦听状态,返回 0 - 未侦听;1 - 正在侦听。
net.tcp.port[<ip>,port] 检查是否能将 TCP 连接到指定端口,返回 0 - 不能连接;1 - 可以连接。
net.tcp.service[service,<ip>,<port>] 检查服务是否运行并接受 TCP 连接,返回 0 - 服务关闭;1 - 服务运行。
net.tcp.service.perf[service,<ip>,<port>] 检查 TCP 服务的性能,当服务 down 时返回 0,否则返回连接服务花费的秒数。
service - 如下任一服务: ftp,http,https,imap,ldap,nntp,pop,smtp,ssh,tcp,telnet
ip - IP 地址(默认为 127.0.0.1)
port - 端口号 (默认为标准服务端口号)
net.udp.listen[port] 检查 UDP 端口 是否处于侦听状态,返回 0 - 未侦听;1 - 正在侦听。
net.udp.service[service,<ip>,<port>] 检查服务是否运行并响应 UDP 请求,返回 0 - 服务关闭;1 - 服务运行。
net.udp.service.perf[service,<ip>,<port>] 检查 UDP 服务的性能,当服务 down 时返回 0,否则返回连接到服务花费的秒数。
service - ntp
ip - IP 地址(默认为 127.0.0.1)
port - 端口号 (默认为标准服务端口号)
proc.cpu.util[<name>,<user>,<type>,<cmdline>,<mode>,<zone>] CPU进程百分比,返回浮点值。
进程的CPU利用率百分比,name:进程名,默认所有进程;user:指定用户名,默认所有用户;type:CPU利用率类型,user/system,默认是两者;cmdline:提供命令行用以过滤,支持正则;mode:数据收集模式,avg1(默认)/avg5/avg15;zone:仅用于Solaris
proc.mem[<name>,<user>,<mode>,<cmdline>,<memtype>] 进程内存,以字节为单位,返回整数。
用户进程使用的内存,name:进程名(默认是全部进程) user:用户名(默认是全部用户) mode:可能的值:avg,max,min,sum (默认值) cmdline:按命令行过滤(正则表达式) memtype:进程使用的内存类型
proc.num[<name>,<user>,<state>,<cmdline>] 进程数量,返回整数。
name:进程名称(默认是all processes) user:用户名(默认是all users) state:可选的值: all (default),run,sleep,zomb cmdline:按命令行过滤(正则表达式)
system.cpu.intr设备的中断数,返回整数。
system.cpu.load[<cpu>,<mode>] CPU 负载,返回浮点数。cpu:all (default), percpu (总负载除以在线CPU数) mode:avg1 (一分钟平均值, 默认值), avg5, avg15
system.cpu.switches上下文的数量进行切换,它返回一个整数值。
system.cpu.util[<cpu>,<type>,<mode>] CPU 使用率,返回浮点数。
cpu:<CPU数量> 或者all(默认值) type:idle,nice,user(默认值),system (Windows系统默认值), iowait,interrupt,softirq,steal,guest,guest_nice mode:可能的值: avg1 (默认值), avg5, avg15
vfs.dev.read[<device>,<type>,<mode>] 磁盘读取数据,类型是sectors, operations, bytes;返回整数,类型是 sps, ops, bps则返回浮点。
device:磁盘设备 (默认为 all) type:sectors,operations,bytes,sps,ops,bps(必须指定此参数,因为各种操作系统的默认值不同) sps,ops,bps表示:[sectors/operations/bytes] per second。 mode:avg1(1分钟平均值, 默认),avg5,avg15.此参数仅支持的类型为: sps,ops,bps.
vfs.dev.write[<device>,<type>,<mode>] 磁盘写入数据,类型是sectors, operations, bytes;返回整数,类型是 sps, ops, bps则返回浮点。
vfs.fs.size[fs,<mode>] 磁盘容量,如果返回的是字节则是整数,如果返回的是百分比则是浮点。
fs:文件系统 mode:total(默认),free,used,pfree(剩余百分比),pused(已用百分比)
vm.memory.size[<mode>] 占字节或总百分比的内存大小,它返回一个整数值,如果字节,只要百分比返回浮点值。内存大小,以字节为单位,以百分比表示。整数用于字节,浮点用于百分比。
mode:
1) total - 总内存量,默认;
2) platform-特定内存类型: active, anon, buffers, cached, exec, file, free, inactive, pinned, shared, wired;
3) user-用户级别估计使用和可用的内存量: used, pused, available, pavailable.