Zabbix 构建企业级监控告警平台
Zabbix企业级监控告警平台构建摘要 Zabbix作为开源监控系统,支持多层次监控:硬件(IPMI)、网络设备(SNMP)、操作系统、虚拟化/云平台、集群、应用软件、数据库及源代码。提供主动/被动两种数据收集模式,平衡资源占用与及时性。 部署方案包含: Zabbix-server端:安装MySQL数据库、Zabbix服务及Web界面,配置时区与中文字体解决乱码问题 Agent端:安装代理程序并指
Zabbix 构建企业级监控告警平台
Zabbix 构建企业级监控告警平台
监控对象
- 源代码: *.html *.jsp *.php *.py
- 数据库: MySQL,MariaDB,Oracle,SQL Server,DB2
- 应用软件:Nginx,Apache,PHP,Tomcat agent
- 集群: LVS,Keepalived,HAproxy,RHCS,F5
- 虚拟化层/云层: VMware,KVM,XEN agent
- 操作系统:Linux,Unix,Windows性能参数
- 硬件: 服务器,存储 IPMI
- 网络: 网络环境(路由器,交换机,防火墙,内网环境,外网环境) SNMP
监控收集信息方式
-
被动模式
-
监控对象上报故障
- 优点:占用网络资源少,占用存储资源少
- 缺点:及时性差
-
-
主动模式
-
定时查看业务状态
- 优点:及时性好
- 缺点:占用资源
-
Zabbix 部署
-
zabbix-server(192.168.100.10)
-
官网
- https://www.zabbix.com/documentation/5.0/manual
-
环境
- IP 主机名 角色
192.168.100.10 zabbix_server 监控服务器
192.168.100.20 web1 业务主机
- IP 主机名 角色
-
Installing Zabbix packages
-
1.设置主机名
-
hostname zabbix_server
-
防火墙
- systemctl stop firewalld.service
- systemctl disable firewalld.service
-
selinux
- setenforce 0
- 永久关闭
-
-
2.准备Zabbix-repo
-
官网镜像(略)
- rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
-
国外镜像不可用时,可以使用阿里提供的zabbixYUM源。
-
[root@zabbix-server ~]# vim /etc/yum.repos.d/zabbix.repo
- [zabbix]
name=alibaba zabbix
baseurl=https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/
gpgcheck=0
enabled=1
- [zabbix]
-
-
-
-
[zabbix2]
name=alibaba zabbix frontend
baseurl=https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/frontend/
gpgcheck=0
enabled=1
- 3.安装Zabbix服务器
- yum clean all
- yum -y install zabbix-server-mysql zabbix-agent
- zabbix-server-mysql:数据库
- zabbi-agent:代理程序(上报信息的程序)
- yum install centos-release-scl
- centos发布scl
- yum install zabbix-web-mysql-scl zabbix-apache-conf-scl
- zabbix前台页面
- Creating initial database
- 1.安装数据库
- yum -y install mariadb mariadb-server
- 2.启动数据库
- systemctl enable mariadb
- systemctl start mariadb
- 3.授权zabbix账号
- mysql
- 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;
- mysql> quit;
- 4.初始化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
- Starting Zabbix server 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
- Editing PHP configuration for Zabbix frontend
- 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
- http://zabbix-server-ip/zabbix
- 欢迎页面
- 显示Zabbix安装向导
- php检测
- 数据库信息1
- 数据库信息2(报错提示)
- 服务器命名
- 汇总
- 恭喜你
- 登录
- 用户名: Admin
- 密码: zabbix
- 语言和乱码
- administration>users>admin user
- 右上角用户图标,更换语言
- 设置中文后,查看图形有乱码,文字变成了方块
- 解决方案
- Win+R打开运行,输入fonts,回车进入Windows字体目录,找到微软雅黑-常规字体,复制出来将文件名修改为msyh.ttf,注意后缀ttf
- 将msyh.ttf上传到服务器zabbix字体目录中:/usr/share/zabbix/fonts/
- 注意文件权限
- chmod 777 /usr/share/zabbix/fonts/msyh.ttf
- 查看字体配置# grep FONT_NAME /usr/share/zabbix/include/defines.inc.php -n
- 执行快捷替换
- sed -i "s/graphfont/msyh/g" /usr/share/zabbix/include/defines.inc.php
- 确认是否替换成功
- grep FONT_NAME /usr/share/zabbix/include/defines.inc.php -n
- 45:define('ZBX_GRAPH_FONT_NAME', 'msyh'); // font file name
- 93:define('ZBX_FONT_NAME', 'msyh');
- 字体配置修改成功后,刷新图形界面即可看到图形字体显示正常了。
-
zabbix-agent(192.168.100.20)
-
设置主机名
-
hostname web1
-
防火墙
- systemctl stop firewalld.service
- systemctl disable firewalld.service
-
selinux
- setenforce 0
-
-
准备zabbix-repo
-
vim /etc/yum.repos.d/zabbix.repo
- [zabbix]
name=alibaba zabbix
baseurl=https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/
gpgcheck=0
enabled=1
- [zabbix]
-
-
[zabbix2]
name=alibaba zabbix frontend
baseurl=https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/frontend/
gpgcheck=0
enabled=1
- 安装zabbix-agent
- yum -y install zabbix-agent
- 配置主服务器地址
- vim /etc/zabbix/zabbix_agentd.conf
- Server=192.168.100.10,192.168.100.11 被动模式 zabbix-server-ip
- ServerActive=192.168.100.10,192.168.100.11 主动模式 zabbix-server-ip (谁从我这里采集数据。)
- Hostname=web1 建议使用 $HOSTNAME
- 启动zabbix-agent:10050
- systemctl start zabbix-agent
- systemctl enable zabbix-agent
- ss -anlp |grep :10050
- ("zabbix_agentd",1220,5),("zabbix_agentd",1221,5),("zabbix_agentd",1222,5))
LISTEN 0 128 *:10050 : users:((“zabbix_agentd”,1217,4),(“zabbix_agentd”,1218,4),(“zabbix_agentd”,1219,4),(“zabbix_agentd”,1220,4),(“zabbix_agentd”,1221,4),(“zabbix_agentd”,1222,4))
- 服务器是10051
-
命令行测试
-
zabbix_get (命令行监控)(在服务器上:192.168.100.10)
-
通过zabbix_get 收集客户端数据
- 5.0zabbix并没有默认安装zabbix-get
-
zabbix-server:
-
zabbix默认key
-
zabbix_get -s 192.168.100.20 -k system.uname
-
zabbix_get -s 192.168.100.20 -k system.cpu.load[all,avg15]
-
zabbix_get -s 192.168.100.20 -k net.tcp.service[http]
- 0假
- 1真
-
zabbix_get -s 192.168.100.20 -k net.tcp.service[ftp]
-
-
自定义的key
-
自定义的key,例如针对TCP连接、MySQL增删改查…
-
zabbix_get -s 192.168.100.20 -k mem.free
- ZBX_NOTSUPPORTED: Unsupported item key.
-
zabbix_get -s 192.168.100.20 -k memory.free
- ZBX_NOTSUPPORTED: Unsupported item key.
-
-
-
-
Apache监控示例(图形监控)
-
创建主机组 (zabbix-server-192.168.100.10)
-
创建主机(zabbix-server-192.168.100.10)
- 选择群组
-
创建图形(zabbix-server-192.168.100.10)
模板Template
-
模板图示
-
常用模板
- Template App HTTP Service
- Template App MySQL
- Template OS Linux
-
应用集app
- 通常是监控项目的归类。比如CPU类,内存类,网卡类,系统类
-
监控项item
- 通常是具体的监控参数。比如内存的总大小,剩余空间,使用空间等。
-
图形
-
聚合图形
-
自动发现
-
触发器
Zabbix Items
-
Items 监控项
-
比如监控项:监控内存包含很多维度,某一个维度(信息是数值还是字母,获取数据的间隔。)
-
• 获取监控数据方式
- zabbix-agent
- SNMP-简单的网际管理协议
-
• 取值的数据类型/单位
-
磁盘容量单位一般为B(记住)
-
网卡流量单位为bps
-
MySQL每秒select,insert,每秒访问量 qps
-
CPU
-
Interrupts per second ips
- 每秒的中断总数。
-
user time float %
-
Context switches per second sps
- 每秒上下文切换
进程线程切换
- 每秒上下文切换
-
-
Host boot time unixtime
- 系统启动的时间
-
-
• 监控Key
- 组合命令
-
• 获取数据的间隔
- 1s
- 1m
-
• 历史数据保存的时间
-
• 趋势数据保存的时间
-
-
默认项示例
- Template OS Linux by Prom模板,关于mem的项目有5个
-
新建items
-
监控项:服务器启动分区剩余空间
-
帮助
-
语法
- key
- vfs.fs.size[fs,]
-
说明
- vfs.fs.size[fs,] Calculate disk space for a given volume. Disk space in KB. If mode is missing total is used. In case of mounted volume, unused disk space for local file system is returned.
-
示例
- vfs.fs.size[/,free]
-
-
图示
-
新增模板
-
新增监控项
- zabbix管理页面》配置》模板》Linux_OS_NEW 》监控项》创建监控项
-
查看项
-
新增图形
- 配置》模板》刚刚新建的模板》图形
-
关联主机和模板
-
查看图形
-
验证项
- 点击上图监控项右侧的图形连接
-
-
-
-
监控项:服务器网络接口进出流量
-
帮助
- 网卡流量的监控key
net.if.in[if,] Network interface input statistic. Integer value. If mode is missing bytes is used.
net.if.out[if,] Network interface output statistic. Integer value. If mode is missing bytes is used.
net.if.total[if,] Sum of network interface incoming and outgoing statistics. Integer value. Mode - one of bytes (default), packets, errors or dropped
- 网卡流量的监控key
-
图示
-
新建项IN
- 注意:您的网络接口名称可能是eth0
- 配置》模板》刚刚新建的模板》监控项》创建监控项
-
新建项out
- 注意:您的网络接口名称可能是eth0
-
新建项all
- 注意:您的网络接口名称可能是eth0
-
新建项MEM
-
创建聚合图形
-
-
-
监控项:服务器服务状态
-
帮助
- 监控服务端口key
net.tcp.listen[port] Checks if this port is in LISTEN state. 0 - it is not, 1 - it is in LISTEN state.
net.tcp.port[,port] Check, if it is possible to make TCP connection to the port number. 0 - cannot connect, 1 - can connect. IP address is optional. If ip is missing, 127.0.0.1 is used. Example: net.tcp.port[,80]
net.tcp.service[service,,] Check if service is available. 0 - service is down, 1 - service is running. If ip is missing 127.0.0.1 is used. If port number is missing, default service port is used.
net.tcp.service.perf[service,,] Check performance of service “service”. 0 - service is down, sec - number of seconds spent on connection to the service. If ip is missing 127.0.0.1 is used. If port number is missing, default service port is used.
Example: net.tcp.service[ftp,45]. http,192.168.100.10,80
- 监控服务端口key
-
图示
-
-
监控项:服务器进程数量
-
帮助
- 监控进程key
proc.num[,,,] Number of processes. and same as in proc.mem item. all (default), run, sleep, zomb. filter by command line (supports regex). Example: proc.num[apache2,www-data]. On Windows, only and are supported.proc_info[,,]Different information about specific process(es)
总进程
[root@rhel6 ~]# zabbix_get -s 192.168.122.108 -k proc.num
101
运行进程
[root@rhel6 ~]# zabbix_get -s 192.168.122.108 -k proc.num[,run]
1
睡眠进程
[root@rhel6 ~]# zabbix_get -s 192.168.122.108 -k proc.num[,sleep]
100
- 监控进程key
-
图示
-
总进程
-
运行进程数
- proc.num[,run]
-
睡眠进程数
- proc.num[,sleep]
-
-
-
监控项:服务器CPU状态
-
帮助
- 监控CPU key
system.cpu.intr Device interrupts.
system.cpu.load[,] CPU(s) load. Processor load. The cpu and mode are optional. If cpu is missing all is used. If mode is missing avg1 is used. Note that this is not percentage.
system.cpu.num Number of available proccessors.
system.cpu.switches Context switches.
system.cpu.util[,,] CPU(s) utilisation. Processor load in percents. The cpu, type and mode are optional. If cpu is missing all is used. If type is missing user is used. If mode is missing avg1 is used.
负载
[root@rhel6 ~]# zabbix_get -s 192.168.122.108 -k system.cpu.load
0.000000
1分钟
[root@rhel6 ~]# zabbix_get -s 192.168.122.108 -k system.cpu.load[all,avg1]
0.000000
5分钟负载
[root@rhel6 ~]# zabbix_get -s 192.168.122.108 -k system.cpu.load[,avg5]
0.000000
[root@rhel6 ~]# zabbix_get -s 192.168.122.108 -k system.cpu.load[,avg15]
0.000000
- 监控CPU key
-
图示5分钟
-
1分钟
-
15分钟
-
-
监控项:监控文件修改
-
帮助
- 监控文件
vfs.file.chsum[file]
vfs.file.md5sum[file]
vfs.file.size[file]
- 监控文件
-
-
监控项:磁盘IO情况
-
帮助
- 监控磁盘 I/O
vfs.dev.read[device,,] Device read statistics.
vfs.dev.write[device,,] Device write statistics.
- 监控磁盘 I/O
-
-
[root@rhel6 ~]# zabbix_get -s 192.168.122.108 -k vfs.dev.write[/dev/sda1]
1.200000
[root@rhel6 ~]# zabbix_get -s 192.168.122.108 -k vfs.dev.write[/dev/sda1]
1.200000
- 监控项:磁盘总和
- 帮助
- =========================Calculated==================================
计算表达式(Formula)
剩余磁盘百分比
100*last(“vfs.fs.size[/,free]”,0)/last(“vfs.fs.size[/,total]”,0)
eth0进出流量总和
last(“net.if.in[eth0,bytes]”,0)+last(“net.if.out[eth0,bytes]”,0)
计算磁盘总的剩余量
last(“vfs.fs.size[/,free]”,0)+last(“vfs.fs.size[/var,free]”,0)+last(“vfs.fs.size[/usr,free]”,0)+last(“vfs.fs.size[/boot,free]”,0)
last(“vfs.fs.size[C:,free]”,0)+last(“vfs.fs.size[D:,free]”,0)+last(“vfs.fs.size[E:,free]”,0)+last(“vfs.fs.size[F:,free]”,0)
- 官网
Zabbix User parameters
-
即自定义KEY
-
注意:mysql安装在被监测主机
-
[root@localhost ~]# yum -y install mariadb-server mariadb
-
[root@localhost ~]# systemctl start mariadb
-
[root@localhost ~]# 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语句平均查询时间?
- mysqladmin -u root -proot -h localhost status
-
[root@localhost ~]# vim /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf
- UserParameter=mysql.questions,mysqladmin -uroot status | cut -f4 -d":" | cut -f1 -d"S"
-
[root@localhost ~]# zabbix_agentd -t mysql.questions
-
mysql.questions [t| 9]
-
[root@localhost ~]# systemctl restart zabbix-agent.service
-
-
总结
- 1.通过shell命令调取相应的值。
- 2.将shell命令,定义到/etc/zabbix/zabbix_agentd.d/*.conf
Zabbix Trigger
-
触发器用于定义item的报警阈值
-
触发器对象
- 可以应用给主机,也可应用给模板
- 图示
-
触发器表达式
-
模板:KSY:函数=VALUE
-
{:.()}
-
server: 可是host,也可是模板template
-
key: item(包括自定义的key)
-
函数:
- last()
- max()
- min()
- avg()
- count()
- delta()
- diff()
-
常用模板
-
Template App HTTP Service
-
Template OS Linux
-
观察其中触发器的报警级别,描述,表达式。
-
示例
- {Template App HTTP Service:net.tcp.service[http].max(#3)}=0
-
-
-
Template App MySQL
-
-
-
-
触发器示例
-
CPU负载超过2
-
帮助
- {www.tianyun.com:system.cpu.load[all,avg1].last(0)}>3
- {www.tianyun.com:system.cpu.load[all,avg5].last(0)}>3
- {www.tianyun.com:system.cpu.load[all,avg15].last(0)}>3
- {nginx host template:system.cpu.load[all,avg1].last(0)}>{$HIGLOAD}
- 说明:表示主机www.tianyun.com上所有cpu过去1分的平均负载的最后一次取值大于3时将触发状态转换last函数,last(0)表示最后一次取值
-
图示
-
监控项
-
配置触发器
-
图形监测
-
触发报警
-
-
-
网络流量超50K
-
帮助
-
表达式
- {www.tianyun.com:net.if.in[eth0,bytes].last(0)}>50K
- {www.zabbix.com:net.if.in[eth0,bytes].min(5m)}>100K
- ping -s 60000 被监控的主机
-
-
图示
-
配置触发器
- 50K
-
图形监测
-
-
-
登录用户超出3名
-
帮助
- user login number gt 3
- {Template OS Linux:system.users.num.last()}>3
-
图示
-
监控项目
-
配置触发器
-
图形监测
-
触发报警
-
-
-
FTP is down
-
帮助
- {Template App FTP Service:net.tcp.service[ftp].max(#3)}=0
- 说明:模板Template App FTP Service,监控项net.tcp.service[ftp]最后三次取值的最大值 = 0
-
-
-
关于zabbix的残留
- 新建项时,无法创建。在后台数据库中删除即可。
- cat .mysql_history .txt
-
Zabbix Action
-
动作Action
-
简介
-
当某个触发器状态发生改变(如Problem、OK),可以采取相应的动作,如:
- 执行远程命令
- 邮件,短信,微信告警,电话
-
-
告警实验简介
-
- 创建告警media type(发送消息的方式,例如使用某个mail user连接某个邮件服务器 smtp.126.com love_cloud@126.com xxxx)
-
- 创建用户或组(接收消息的用户例如email address, 注意权限)
-
- 创建Action(使用之前定义好的media type 发送给之前定义好的用户或组)
-
-
邮件告警
-
准备告警信息
-
1 注册新邮箱
-
http://mail.126.com/或mail.qq.com
-
name
- qianfengcloud@126.com
-
password
- QianFeng@123
-
-
2开启POP3的授权码
-
自定义授权码
- QianFeng123
-
-
3zabbix设置邮箱
-
zabbix服务器与邮箱服务器的连通性测试
-
nc smtp.126.com -t 25
-
连接成功
- 220 126.com Anti-spam GT for Coremail System (126com[20140526])
- 421 closing transmission channel
- Ncat: Broken pipe.
-
-
-
设置zabbix链接126邮箱信息
-
-
4创建用户组
-
运维组
-
用户组
-
用户1
-
用户
- 密码自定义
-
告警类型
- 用户属性中的告警类型
- 选择刚刚设定的126邮箱
-
权限
- 赋予超级权限
-
-
用户2
- 用户2设置收件人,使用一个和用户1不同的。
-
-
经理组
-
用户3
- 属于经理组
- 邮箱不同,级别不同,收到的告警信息不同。
-
-
-
-
设置告警
-
设置动作:触发器产生的告警
- 设置一旦模板发生问题,每隔60秒就发送邮件给用户1
当事件升级,发送给更高级用户。 - Trigger: {TRIGGER.NAME}
Trigger status {TRIGGER.STATUS}
- 设置一旦模板发生问题,每隔60秒就发送邮件给用户1
-
-
-
-
{ITEM.NAME1}({HOST.NAME1}:{ITEM.KEY1}):{ITEM.VALUE1}
- 查看告警-
微信告警
-
zabbix微信报警
-
准备工作意义
-
所有准备工作的目的是为了获取以下4个信息:
-
参数
-
应用:报警机器人
-
AgentId:-
1000002
-
-
Secret:-
rIrN51FEjgW6T2bdmSaEoOIB5UbaBTgddQkuC8cca1w
-
-
企业CorpID:
-
wwa1da242f211cdf47
-
-
部门:运维部
-
部门ID:2
-
-
-
手机端操作
-
1.下载企业微信(手机端)
-
2.注册企业(手机端)
-
-
PC端企业微信后台操作
-
打开浏览器输入以下网址,登陆企业微信PC端后台:记录企业ID
-
https://work.weixin.qq.com/wework_admin
-
创建企业,然后通过PC浏览器打开企业微信。
通过手机端扫一扫就可以登录。
记录企业信息中的corpID。
-
-
创建自己的应用(PC后台)(记录AgentId和Secret)
-
添加管理组(PC后台) 添加部门(PC后台) 添加员工(PC后台)
-
测试企业微信接口调试工具(PC后台)
-
API文档->左侧 开发者工具->接口调试工具
-
图示
- 上面测试好之后可以配置python报警监控脚本了
-
-
-
配置python报警监控脚本
-
创建脚本文件:
-
vim /usr/lib/zabbix/alertscripts/wechat.py
- 脚本内容如下:
- #!/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])
- 有如下4个地方需要修改,找到他们修改成之前获取的信息
- self.__corpid = 'wwa1da242f211cdf47'
- 公司的corpid
- self.__secret = 'rIrN51FEjgW6T2bdmSaEoOIB5UbaBTgddQkuC8cca1w'
- 应用的secret
- 'toparty':2,
- //部门id
- 'agentid':"1000002",
- //应用id
- 修改权限:
- [root@ansible alertscripts]# chown zabbix.zabbix /usr/lib/zabbix/alertscripts/wechat.py
- [root@ansible alertscripts]# chmod 777 /usr/lib/zabbix/alertscripts/wechat.py
- 测试脚本:测试结果中invalidparty可以忽略 ,如果正常会收到消息如下
- [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为信件内容
- 图示
- 查看手机端企业微信内的应用“报警机器人”,收到如下图信息,恭喜你测试完成
- 图示
- zabbix配置微信报警
- 创建报警媒介
- 管理->报警媒介类型->创建媒体类型
- 图示
- zabbix 3.0 以后需要在为alert脚本定义参数,以前的版本参数都固定的,现在用户可以自己定义命令行的参数了。添加的参数也就是脚本中的收信人、标题和信息内容
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
- 关联到报警用户
- 添加完成后,需要关联到报警用户 管理-->用户-->Admin-->报警媒介-->添加-->更新
- 图示
- 注意填写的收件人是:企业微信内的员工帐号,比如下面童鞋的帐号为:XuLei
- 图示
- 添加动作,触发条件后报警后发送微信消息。
配置–>动作–>创建动作
维护状态–>非在维护–>添加
触发器条件–>触发器–>添加
点击动作下的操作
- 图示
- Trigger: {TRIGGER.NAME}
Trigger status {TRIGGER.STATUS}
-
{ITEM.NAME1}({HOST.NAME1}:{ITEM.KEY1}):{ITEM.VALUE1}
- 可以通过将触发器的值,调整为正常值/非正常值测试微信报警了。- 关闭被检测网站服务器服务-
远程执行
-
当问题发生,可以通过远程执行命令的方式对目标主机进行控制。
-
1.禁用前面的告警设置
-
2.创建告警
-
条件
-
动作
-
-
3.开启zabbix远程执行的功能
- 在web1上,(被监控主机)
- [root@web1 ~]# vim /etc/zabbix/zabbix_agentd.conf
- EnableRemoteCommands=1
- systemctl restart zabbix-agent.service
-
4.开启sudo权限
- 在web1上,(被监控主机)
- [root@web1 ~]# visudo
- zabbix ALL=NOPASSWD: /usr/bin/systemctl restart httpd
-
5 模拟httpd服务失败
-
在web1上,(被监控主机)
-
systemctl stop httpd
-
systemctl status httpd
-
确认模板正在使用
-
问题已经产生
-
执行远程命令成功
-
-
-
Zabbix Macros
-
Zabbix内置宏
-
{HOST.NAME}
- 主机 名
-
{HOST.IP}
- 主机 IP地址
-
{TRIGGER.DESCRIPTION}
- 触发器 描述
-
{TRIGGER.NAME}
- 触发器 名
-
{TRIGGER.EVENTS.ACK}
- 触发器 事件 是否确认
-
图示
-
-
Zabbix自定义宏
-
通常在Trigger名称和表达式中使用
-
定义宏
-
全局定义宏
-
模板中定义宏
-
-
引用宏
-
Zabbix 自动发现
-
前言
- 为了满足监控企业成千上万台服务器,因此我们需要使用Zabbix批量监控来实现。自动发现和自动注册。
-
zabbix-server
-
1、创建自动发现规则
- “配置”->“自动发现”->“创建发现规则”
填入名称、需发现服务器、设备的IP范围、更新间隔、检查项(ssh和zabbix客户端)、设备唯一性准则
最后勾选已启用、点击添加。 - 图示
- “配置”->“自动发现”->“创建发现规则”
-
2、创建自动发现动作
-
“配置”->“动作”->事件源“自动发现”->“创建动作”
-
图示
-
点击->操作配置,选择具体的操作类型:添加主机、添加到主机群组、与模板关联
-
最后点击添加即可。
-
图示
-
-
3、在“检测中”->“自动发现”可以查看 已发现的设备
-
Zabbix 自动注册
-
前言
- 由客户端主动发起,客户端必须安装并启动Agentd,否则无法被自动注册添加至主机列表。
-
zabbix agent配置
- [root@centos ~]# vim /etc/zabbix/zabbix_agentd.conf
- ServerActive=192.168.0.110 主动模式 zabbix-server-ip
- [root@centos ~]# service zabbix-agentd restart
-
zabbix server配置
-
1、创建自动注册动作
-
“配置”->动作->事件源“自动注册”->“创建动作”
-
图示
-
点击操作配置,选择具体的操作类型:添加主机、添加到主机群组、与模板关联
-
最后点击添加即可。
-
图示
-
-
2、在“配置”->“主机”中查看注册的设备信息
- 只看到两台主机,因有一台未安装Agentd所以注册不了
- 图示
-
实战案例: 监控 TCP连接 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。
-
agent:
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
-
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]
- 0.000000
- [root@localhost ~]# zabbix_get -s 192.168.100.20 -k tcp.status.close
- 0
- [root@localhost ~]# zabbix_get -s 192.168.100.20 -k tcp.status.listen
- 1
-
实战案例: 监控 TCP连接 2
-
agent:
- [root@web1 ~]# vim /etc/zabbix/zabbix_agentd.d/tcp_status.conf
- UserParameter=tcp.status[*],ss -an |grep :80 | grep -i “$1” |wc -l
-
server:
- 使用[传参]来调用
- [root@localhost ~]# zabbix_get -s 192.168.100.20 -k tcp.status[TIME-WAIT]
- 34
- [root@localhost ~]# zabbix_get -s 192.168.100.20 -k tcp.status[LISTEN]
- 1
- [root@localhost ~]# zabbix_get -s 192.168.100.20 -k tcp.status[CLOSE]
- 0
实战案例: 监控 TCP连接 3
-
agent:
-
1 下载自定义key的包
- wget -r ftp://10.18.40.100/zabbix-example
- chmod -R +x zabbix-example/
- chown -R zabbix zabbix-example
-
2 拷贝命令文件至zabbix目录。
-
mkdir /etc/zabbix/tcp_connect.status
-
cp zabbix-example/tcp_connect_status/tcp_connect_status.sh /etc/zabbix/tcp_connect.status/
- #!/bin/bash
#ESTABLISHED/LISTEN/SYN_SENT/SYN_RECV/FIN_WAIT1/FIN_WAIT2/TIME_WAIT/CLOSE/CLOSE_WAIT/LAST_ACK/LISTEN/CLOSING/ERROR_STATUS
- #!/bin/bash
-
-
LISTEN() {
netstat -an |grep ^tcp |grep LISTEN |wc -l
}
ESTABLISHED() {
netstat -an |grep ^tcp |grep ESTABLISHED |wc -l
}
TIME_WAIT() {
netstat -an |grep ^tcp |grep TIME_WAIT |wc -l
}
SYN_SENT() {
netstat -an |grep ^tcp |grep SYN_SENT |wc -l
}
SYN_RECV() {
netstat -an |grep ^tcp |grep SYN_RECV |wc -l
}
CLOSE() {
netstat -an |grep ^tcp |grep CLOSE |wc -l
}
$1
- 3 增加用户自定义KEY
- cp zabbix-example/tcp_connect_status/tcp_connect_status /etc/zabbix/zabbix_agentd.d/tcp_connect_status.conf
- 4 重启服务
- systemctl restart zabbix-agent.service
-
server:
-
6 zabbix-server执行验证
- zabbix_get -s 192.168.100.20 -k tcp.connect.status[LISTEN]
-
7 总结
- 调用KEY,KEY就是脚本,脚本传参即可。
-
8 XML文件
- 是模板文件,直接上传到服务器就是现成的模板,应用集,监控项,触发器,图形,聚合图形。
-
实战案例: 监控 MySQL
-
agent:
- mysql_status.sh //该脚本的作用是获得不同的值
- [root@web43 mysql_status]# /etc/zabbix/mysql_status/mysql_status.sh Com_insert
- 16
- [root@web43 mysql_status]# /etc/zabbix/mysql_status/mysql_status.sh Com_delete
- 15
- [root@web43 mysql_status]# /etc/zabbix/mysql_status/mysql_status.sh Com_update
- 47
- [root@web43 mysql_status]# /etc/zabbix/mysql_status/mysql_status.sh Com_select
- 978981
- MySQL_status //zabbix_agentd.conf 自定义key
- UserParameter=mysql.status[*],/etc/zabbix/mysql_status/mysql_status.sh $1
-
server:
- [root@rhel6 ~]# zabbix_get -s 192.168.122.43 -k mysql.status[Com_insert]
- 18
- [root@rhel6 ~]# zabbix_get -s 192.168.122.43 -k mysql.status[Com_delete]
- 16
- [root@rhel6 ~]# zabbix_get -s 192.168.122.43 -k mysql.status[Com_update]
- 53
- [root@rhel6 ~]# zabbix_get -s 192.168.122.43 -k mysql.status[Com_select]
- 1162239
-
建议使用zabbix自带的mysql 模板
-
mysql_status.xml //导入成模板文件,包括Applications,Items,Trigger,Graph,Screen…
-
图示
实战案例: 监控 Nginx
-
提示
-
开启nginx状态模块
- location /nginx_status {
stub_status;
allow all;
}
- location /nginx_status {
-
测试数据
- wget --quiet -O - http://localhost/nginx_status?auto | awk ‘NR==3 {print $1}’
-
-
zabbix-agent
-
nginx_status.sh //该脚本的作用是获得不同的值
-
[root@web43 nginx]# /etc/zabbix/nginx/nginx_status.sh Active
-
1
-
[root@web43 nginx]# /etc/zabbix/nginx/nginx_status.sh Request
-
20
-
nginx_status //zabbix_agentd.conf 自定义key
-
UserParameter=nginx.status[*],/etc/zabbix/nginx_status.sh $1
-
-
zabbix-server
- [root@rhel6 ~]# zabbix_get -s 192.168.122.43 -k nginx.status[Active]
- 1
- [root@rhel6 ~]# zabbix_get -s 192.168.122.43 -k nginx.status[Request]
- 22
- nginx_status.xml //导入成模板文件,包括Applications,Items,Trigger,Graph,Screen…
实战案例: 监控 PHP-FPM
-
agent:
- php_status.sh //该脚本的作用是获得不同的值
- [root@web43 phpfpm]# /etc/zabbix/phpfpm/php-fpm_status.sh idle
-
1 - [root@web43 phpfpm]# /etc/zabbix/phpfpm/php-fpm_status.sh total
-
2 - [root@web43 phpfpm]# /etc/zabbix/phpfpm/php-fpm_status.sh listenqueuelen
-
128 - nginx_status //zabbix_agentd.conf 自定义key
- UserParameter=php-fpm.status[*],/etc/zabbix/phpfpm/php-fpm_status.sh $1
-
server:
- [root@rhel6 ~]# zabbix_get -s 192.168.122.43 -k php-fpm.status[listenqueuelen]
-
128 - [root@rhel6 ~]# zabbix_get -s 192.168.122.43 -k php-fpm.status[total]
-
2 - php-fpm_status.xml //导入成模板文件,包括Applications,Items,Trigger,Graph,Screen…
实战案例: 监控 Apache
- apache_status
- apache_status.sh
- apache_status.xml
实战案例: 监控 MySQL A-B
-
agent:
-
[MySQL备机]
-
mysql_ab.sh
-
[root@web43 mysql_ab]# /etc/zabbix/mysql_ab/mysql_ab.sh IO_status
-
YES
-
[root@web43 mysql_ab]# /etc/zabbix/mysql_ab/mysql_ab.sh SQL_status
-
YES
-
mysql_ab_status
-
UserParameter=mysql.ab.status[*],/etc/zabbix/mysql_ab/mysql_ab.sh $1
-
-
server:
- [root@server ~]# zabbix_get -s 192.168.122.43 -k mysql.ab.status[IO_status]
- 13
- [root@server ~]# zabbix_get -s 192.168.122.43 -k mysql.ab.status[SQL_status]
- 2
- mysql_ab_status.xml //导入成模板文件,包括Applications,Items,Trigger,Graph,Screen…
- 图示
实战案例: 监控磁盘I/O
-
zabbix监控磁盘IO实现原理
-
基本原理:通过分析工具iostat来对IO的性能进行监控。
-
iostat命令详解介绍:
-
iostat介绍
- iostat用于输出CPU和磁盘I/O相关的统计信息。
-
-
[root@host ~]# iostat
Linux 3.10.0-693.2.2.el7.x86_64 (host-47-98-97-124) 2019年06月20日 x86_64 (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
3.44 0.00 1.09 0.03 0.00 95.44
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 0.61 0.81 3.80 498465 2352284
- iostat语法
- [root@host ~]# iostat --help
用法: iostat [ 选项 ] [ <时间间隔> [ <次数> ] ]
选项:
[ -c ] [ -d ] [ -h ] [ -k | -m ] [ -N ] [ -t ] [ -V ] [ -x ] [ -y ] [ -z ]
[ -j { ID | LABEL | PATH | UUID | … } ]
[ [ -T ] -g <用户组名> ] [ -p [ <设备> [,…] | ALL ] ]
[ <设备> […] | ALL ]
-c:显示cpu状态信息
-d 显示磁盘使用情况
-k 以 KB 为单位显示
-m 以 M 为单位显示
-N 显示磁盘阵列(LVM) 信息
-n 显示NFS 使用情况
-p[磁盘] 显示磁盘和分区的情况
-t 显示终端和CPU的信息
-x 显示详细信息
-V 显示版本信息
- iostat输出内容参数介绍
- [root@host-47-106-141-17 ~]# iostat -d -k -x 1
Linux 3.10.0-693.2.2.el7.x86_64 (host-47-106-141-17) 06/20/2018 x86_64 (1 CPU)
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 0.32 0.05 0.56 0.80 3.80 15.21 1.23 3.41 1.41 3.58 0.67 0.04
对于以上示例输出,我们可以获取到以下信息:
每秒向磁盘上写3.8kb左右数据(wkB/s值)
每秒有0.61次IO操作(r/s+w/s=0.05+0.56),其中以写操作为主体
平均每次IO请求等待时间为3.58毫秒(await),处理时间为0.67毫秒
等待处理的IO请求队列中,平均有1.23(avgqu-sz)个请求驻留
选项 说明
%user CPU在用户态执行进程的时间百分比。
%nice CPU在用户态模式下,用于nice操作,所占用CPU总时间的百分比
%system CPU处在内核态执行进程的时间百分比
%iowait CPU用于等待I/O操作占用CPU总时间的百分比
%steal 管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟CPU的百分比
%idle CPU空闲时间百分比
注:
- 若 %iowait 的值过高,表示硬盘存在I/O瓶颈
- 若 %idle 的值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量
- 若 %idle 的值持续低于1,则系统的CPU处理能力相对较低,表明系统中最需要解决的资源是 CPU
选项 说明
rrqm/s: 每秒进行 merge 的读操作数目.即 delta(rmerge)/s
wrqm/s: 每秒进行 merge 的写操作数目.即 delta(wmerge)/s
r/s: 每秒完成的读 I/O 设备次数.即 delta(rio)/s
w/s: 每秒完成的写 I/O 设备次数.即 delta(wio)/s
rsec/s: 每秒读扇区数.即 delta(rsect)/s
wsec/s: 每秒写扇区数.即 delta(wsect)/s
rkB/s: 每秒读K字节数.是 rsect/s 的一半,因为每扇区大小为512字节.(需要计算)
wkB/s: 每秒写K字节数.是 wsect/s 的一半.(需要计算)
avgrq-sz:平均每次设备I/O操作的数据大小 (扇区).delta(rsect+wsect)/delta(rio+wio)
avgqu-sz:平均I/O队列长度.即 delta(aveq)/s/1000 (因为aveq的单位为毫秒).
await: 平均每次设备I/O操作的等待时间 (毫秒).即 delta(ruse+wuse)/delta(rio+wio)
svctm: 平均每次设备I/O操作的服务时间 (毫秒).即 delta(use)/delta(rio+wio)
%util:在 I/O 请求发送到设备期间,占用 CPU 时间的百分比。用于体现设备的带宽利用率。
注:
- avgqu-sz 的值较低时,设备的利用率较高。
- 当 %util 的值接近 100% 时,表示设备带宽已经占满。
-
编辑userparameter_mysql.conf文件
- [root@host ]# vi /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf
UserParameter=disk.status[*],/usr/local/zabbix/scripts/disk-status.sh $1
- [root@host ]# vi /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf
-
编写磁盘IO监控脚本
- [root@host ]# vi /usr/local/zabbix/scripts/disk-status.sh
#!/bin/bash
- [root@host ]# vi /usr/local/zabbix/scripts/disk-status.sh
if [ $# -ne 1 ];then
echo “Follow the script name with an argument”
fi
case $1 in
rrqm)
iostat -dxk 1 1|grep -w vda |awk '{print $2}'
;;
wrqm)
iostat -dxk 1 1|grep -w vda |awk '{print $3}'
;;
rps)
iostat -dxk 1 1|grep -w vda|awk '{print $4}'
;;
wps)
iostat -dxk 1 1|grep -w vda |awk '{print $5}'
;;
rKBps)
iostat -dxk 1 1|grep -w vda |awk '{print $6}'
;;
wKBps)
iostat -dxk 1 1|grep -w vda |awk '{print $7}'
;;
avgrq-sz)
iostat -dxk 1 1|grep -w vda |awk '{print $8}'
;;
avgqu-sz)
iostat -dxk 1 1|grep -w vda |awk '{print $9}'
;;
await)
iostat -dxk 1 1|grep -w vda|awk '{print $10}'
;;
svctm)
iostat -dxk 1 1|grep -w vda |awk '{print $13}'
;;
util)
iostat -dxk 1 1|grep -w vda |awk '{print $14}'
;;
*)
echo -e "\e[033mUsage: sh $0 [rrqm|wrqm|rps|wps|rKBps|wKBps|avgqu-sz|avgrq-sz|await|svctm|util]\e[0m"
esac
本节作业
- 例如需要上线一个JSP网站?
-
- 购买服务器,并托管到IDC机房
-
- 安装Linux OS,初始化(包括设置公网IP) IaaS
-
- 搭建运行或开发环境,JAVA + Tomcat PaaS
-
- 上传网站代码及配置(连接数据库)
-
- 申请域名关联到服务器公网IP
- IaaS PaaS SaaS …DaaS…XaaS
- 1.了解国内常见的DNS ISP
- 2.了解网站备案相关概念
- 3.了解阿里ECS (Elastic Compute Service, 简称ECS)
- 4.了解亚马逊EC2 Amazon Elastic Compute Cloud (EC2)
- 5.了解国内/外主流云提供商及产品(如Amazon,qingcloud,aliyun,易迈云,Tencent,京东…)
- 6.例如阿里ECS,ACE,RDS
- 7.了解VPS(Virtual Private Server 虚拟专用服务器)和云主机的区别
-
http://jingyan.baidu.com/article/d5a880eb6fea7d13f047cc4c.html - 8.互联网数据中心IDC(Internet Data Center)
- 9.了解国内主流的IDC机房如光环新网
- 10.云主机Instance/映像image
- 例如:运行wordpress
- OS + PHP + Wodpress(code)
- IaaS PaaS SaaS
- KVM/Openstack Docker
- 图示
test
- 随堂测试7.docx
更多推荐

所有评论(0)