监控的对象 硬件 软件 业务
监控的系统的基本功能
采集存储 可视化 告警
采集经由的信到
ssh/telent 传统的网络连接方式,执行命令采集方式
SNMP 接口
IPMI接口
JMX接口
agent :zabbix提供的监控接口
要实现数据存储
SQL 关系型数据库
NOSQL 非关系型数据库
rrd 也算非关系型数据库
......
要实现可视化可以使用
各个监控系统都带有自身提供的可视化接口
也有专业的可视化工具grafana
告警
是一个监控系统具有的基本功能,它是一个内建的组件,一般的告警是允许用户调用外部脚本来实现的,从而就给了用户最大的自由和灵活度
zabbix的组件有
zabbix server
server采集到的数据保存到 zabbix database(也就是mysql或相关的衍生版)
zabbix web gui 我们称为web接口,web接口其实就是运行在amp之上的一个基于PHP研发的用户界面,这个用户界面除了实现监控之外,也是我们配置的唯一入口。
zabbix proxy 分布式监控时可以用到
zabbix agent 部署在每一个server之上,负责本地数据收集的一个组件
任何一个监控对象都应该对应于一个设备,而任何设备无论是路由器还是交换机,甚至是我们的server都被称为主机(host)
在zabbix中任何一个被监控的主机,都应该附着在一台主机上,一个监控设备要想纳入到监控系统中去,我们必须在zabbix中去添加这个主机才可以,主机可以通过地域,功能等进行分组。因此我们可以定义一个监控模板,应用到组上,组内所有的主机都自动拥有了这种监控配置。
主机一旦被添加到监控系统以后,接下来就可以定义主机之上的每一个监控的指标数据源,指标数据源是什么?例如CPU的内核空间的占用比例,用户空间使用比例,所有你产生时间序列的数据源,我们就叫指标数据源,而每一个指标数据源在zabbix中,如果要纳入到监控体系中来,它就被称为一个监控项item
item监控项有一些相近的监控项,比如CPU,内核占用比例,用户空间占用比例,空闲比例等等都是CPU比例。内存也有内存监控项。我们可以把监控项相近的方式来进行分组,而监控项的分组叫application应用也叫监控项的组(不是应用程序,是应用),
定义好监控项组,基于事件源就是能产生事件的事件源位置源源不断的周期性的获取到数据指标,
这个数据指标要定义一个阈值,合理区间和非合理区间的分界点叫临界点,而且一个指标项的阈值可以有多个不同的区间,分别代表不同的事件的严重等级,而阈值相比较来讲在zabbix中是靠一个表达式来定义的,这个表达式我们通常称为trigger触发器表达式。所谓的触发器就是对应的某一个指标数据,它的数据项是否在合理区间当中,一般的我们定义的表达式是一个逻辑表达式,例如一个CPU大于60%,表达式满足条件了是true,代表有问题,表达式不满足代表OK没有问题。
当trigger触发器条件满足了变成true,它会生成触发器事件叫trigger event
action 动作:动作是指有事件触发,一旦产生事件我们就可以触发某个事件,动作有条件
conditions 满足这个条件,加s是条件不止一个
operations 就触发这个操作,加s是动作不止一个
操作是1.打一个脚本尝试恢复问题,如果不能恢复,第二发送告警这叫operation
监控流程的配置过程
host group --host -application --item --trigger -action(conndition,operation)
主机组内添加主机,
在主机上定义application,
在applica上添加item监控项,
在监控项上添加trigger,
trigger可能触发trigger event 被action拿来应用,而action是conndition和operation组成的
poller 轮循器,周期性的操作
不同的采集信道poller还不一样
*******************************************************************************************************************
搭建zabbix
192.168.63.141 zabbix服务器 httpd PHP
192.168.63.131 mysql服务器
192.168.63.132 被监控端
192.168.63.140 被监控端
192.168.63.141 zabbix服务器
https://www.zabbix.com/download
安装zabbix相关的rpm包,这个包的作用是生成一个zabbix的指示文件repolist
修改成清华仓库的的镜像,
rpm -i https://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm
注:网络不好下载不下来,可以直接使用下面的
[root@contes7 ~]# vim /etc/yum.repos.d/zabbix.repo
[zabbix]
name=Zabbix Official Repository - $basearch
baseurl=https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/3.4/rhel/7/x86_64/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-A14FE591
[zabbix-non-supported]
name=Zabbix Official Repository non-supported - $basearch
baseurl=https://mirrors.tuna.tsinghua.edu.cn/zabbix/non-supported/rhel/7/x86_64/
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX
gpgcheck=1
或
[zabbix]
name=Zabbix Official Repository - $basearch
baseurl=https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/3.4/rhel/7/x86_64/
gpgcheck=0
[zabbix-non-supported]
name=Zabbix Official Repository non-supported - $basearch
baseurl=https://mirrors.tuna.tsinghua.edu.cn/zabbix/non-supported/rhel/7/x86_64/
gpgcheck=0
测试
yum repolist
zabbix的环境
yum install zabbix-server-mysql zabbix-web-mysql zabbix-agent -y
yum install httpd php -y
192.168.63.131 mysql服务器
准备mysql环境
安装mysql数据库
maiadb2.sh
iptables -F &> /dev/null #清除防火墙
sed -i -r 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config #更改/etc/selinux/config里面的SELINUX=disabled,关闭selinux
yum install -y libaio &> /dev/null #安装libaio包
getent passwd mysql || echo `useradd -r -d /data/mysqldb -s /sbin/nologin mysql` #查看在/etc/passwd文件里面有没有mysql用户,如果没有创建mysql用户
ls -l /usr/local/mariadb-10.2.15-linux-x86_64 &> /dev/null || echo `tar xvf /root/mariadb-10.2.15-linux-x86_64.tar.gz -C /usr/local/ &> /dev/null`
#查看/usr/local/目录下有没有解压完成的包,如果没有解压二进制包
cd /usr/local #切换到/usr/local/目录
ln -s mariadb-10.2.15-linux-x86_64/ mysql #设置软链接
chown -R root:root mysql/ #设置mysql目录下的所有文件的属主和属组是root
echo PATH=/usr/local/mysql/bin:$PATH > /etc/profile.d/mysql.sh #在/etc/profile.d/mysql.sh文件下加入/usr/local/mysql/bin的PATHA变量
chmod +x /etc/profile.d/mysql.sh #给/etc/profile.d/mysql.sh文件加执行权限
cd #切换到家目录
source /etc/profile.d/mysql.sh #执行/etc/profile.d/mysql.sh脚本
mkdir /data/mysqldb -p #在data目录创建mysqldb目录
chown mysql.mysql /data/mysqldb #设置/data/mysqldb目录的的属主和属组是mysql用户
cd /usr/local/mysql #切换到/usr/local/mysql目录
scripts/mysql_install_db --datadir=/data/mysqldb --user=mysql #在/data/mysqldb下生成数据库
cp /usr/local/mysql/support-files/my-huge.cnf /etc/my.cnf -a #覆盖系统自带的配置文件
sed -i '/\[mysqld\]/a\datadir = /data/mysqldb' /etc/my.cnf &> /dev/null #在配置文件里面的[mysqld]下面添加一行datadir = /data/mysqldb
cp support-files/mysql.server /etc/init.d/mysqld -a #拷贝启动文件到/etc/init.d/mysqld
chkconfig --add mysqld
systemctl start mysql.service #启动mysql
创建初始化数据库,并授权
打开mysql
create database zabbix character set utf8 collate utf8_bin; 创建zabbix数据库
创建一个有连接权限的账号zabbix,授权zabbix用户只能本地访问,密码是zbxpass
grant all privileges on zabbix.* to 'zabbix'@'localhost' identified by 'zbxpass';
授权127.0.0.1的用户访问
grant all privileges on zabbix.* to 'zabbix'@'127.0.0.1' identified by 'zbxpass';
授权远程用户访问
grant all privileges on zabbix.* to 'zabbix'@'192.168.63.%' identified by 'zbxpass';
192.168.63.141 zabbix服务器
导入初始模式和数据
查看create.sql.gz脚本的位置
rpm -ql zabbix-server-mysql
将create.sql.gz脚本导入到数据库,并且让生成到zabbix库中去
zcat /usr/share/doc/zabbix-server-mysql-3.4.11/create.sql.gz | mysql -uzabbix -h 192.168.63.131 -p zabbix
查看
mysql -uzabbix -h192.168.63.131 -pzbxpass
切换到zabbix数据库
MariaDB [(none)]> use zabbix;
查看数据库的表
show tables;
配置zabbix的配置文件
vim /etc/zabbix/zabbix_server.conf
数据库的名字
DBName=zabbix
数据库的地址
DBHost=192.168.63.131
数据库的用户名
DBUser=zabbix
数据库的密码
DBPassword=zbxpass
启动服务
systemctl start zabbix-server
查看端口
配置web界面
vim /etc/httpd/conf.d/zabbix.conf
更改时区为shanghai
启动http服务
systemctl start httpd
查看端口
浏览器访问
http://192.168.63.141/zabbix/setup.php
web首次打开zabbix的界面
单机下一步
检查依赖关系并并下一步
选择连接数据库的类型
可以不定义,使用默认的
登录界面
用户名是Admin
密码 zabbix
zabbix的界面
修改为中文
1.选择Administrator
2.选择User
3.单机Admin
4.选择Language,选择中文,在单机update更新
我们也可以更改主题
把目标监控主机加入到zabbix server监控的主机
添加主机的界面
192.168.63.132 被监控端
vim /etc/yum.repos.d/zabbix.repo
[zabbix]
name=Zabbix Official Repository - $basearch
baseurl=https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/3.4/rhel/7/x86_64/
gpgcheck=0
[zabbix-non-supported]
name=Zabbix Official Repository non-supported - $basearch
baseurl=https://mirrors.tuna.tsinghua.edu.cn/zabbix/non-supported/rhel/7/x86_64/
gpgcheck=0
获取yum源数据
yum repolist
被动监控
zabbix server主动到客户端去拉取数据
主动监控
当前zabbix主动到zabbix server去报告自己应该监控的数据
安装zabbix
yum install zabbix-agent zabbix-sender -y
zabbix的配置文件
被动监控的配置
vim /etc/zabbix/zabbix_agentd.conf
Server=192.168.63.141
注意:zabbix server的地址,如果有主机名,就写主机名,要能解析
ServerActive=192.168.63.141
Hostname=Hostname=zhouyafei.com #标识当前主机的主机名
启动服务
systemctl start zabbix-agent
查看端口
在zabbix的web端添加被监控的主机
1.添加主机
2.添加 host 主机
定义Applications 应用,也就是监控项的组
创建完成Applications 应用
定义items 监控项,监控入站的报文
单机Create item
单机net.if.in[if,
单机Preprocessing 预处理
单数据采集的时候要做什么预处理
当前的采集量减去前一次采集量的除于时长=速率
单机item返回
Units数据项单位叫packets/second或者pps
定义完成
查看
查看数据采集图
单机 Graph
如果我们要添加报文数据项和上一次定义相差不大的字节数bytes项,我们可以克隆
入站的字节数
更改标识和内建的命令
Units数据项单位叫Bps
完成
例如还有出站的字节数
出站的内建命令net.if.out[ens33,bytes]
Units数据项单位叫Bps
例如出站的报文数
查看数据采集图
定义Triggers
用来描述item之上数据的合理区间和非合理区间的分界线,而且同一个item上的分界线还可以有多种
例如:红色警报,蓝色警报
一个item上可以有多个triggers,而triggers会生成triggers event
triggers是一个boolean expression表达式
true :条件满足定义非合理区间,它代表了这个item出现了问题,所以是PROBLEM状态
false:表示OK的状态
定义触发器时常用的函数
avg 平均值
count 计数
change 变化量
date 日期
dayofweek 周几
delta 速率 当前的结果减上一次的结果除去时间
diff 比较
iregexp 正则表达式模式,不区分大小写,模式匹配
last 最后几次或一次
max 最近一段时间中的,或者多少次中的最大值
min 最小值
nodata 没有值
now 此刻
sum 求和
单机triggers
我们加入入站报文 每秒100个,就是受到×××了
创建
几次大于值,可以是多次
值是多少,并确定
查看
依赖关系
一个主机之上的所有应用都应该依赖主机,
一个主机的状态都一个依赖于和zabbix server之间的网络设备
查看数据采集图
Triggers也可以克隆
当触发器发生告警会生成触发事件
定义Actions ,actions不属于单个主机,它可以构建跨主机的actions,条件可以来自多个事件源
创建actions
定义action:所谓的action就是有event driven事件驱动的
而action只要有两部分组成
conditions
operations :而operations有两个
从OK到PROBLEM称为operations 出现问题
从PROBLEM回到OK称为recovery operations 解决问题
ackownlegement operations 报告问题
remote command 远程命令
send message 发警报
remote command 远程命令
执行的过程
1.在远程主机执行命令
2.在本机通过ssh执行命令
send message 发警报
发警报要通过media媒介,一旦发警报就把警报扔到这个媒介上,对方要在媒介上有一个合适的收信息的端点才能收到警报
1.定义媒介
2.定义收件的人
3.zabbix发警报才能扔到这个媒介上
********************************************************************************************************8888
监控一个192.168.63.132主机上的服务在不在线
例如nginx服务
1.添加itmes
2.创建itme
查看
3.定义triggers
创建triggers
查看显示up
现在停止监控端的nginx服务80端口
再次查看显示down
在启动nginx服务
4.定义actions,如果发现nginx服务出现异常,就告警
在被监控主机 zabbix agent 的zabbix进程是没有权限重新启动nginx服务的要在主机上做sudo
192.168.63.132
vim /etc/sudoers
zabbix能在任何用户执行任何命令,并且不需要密码 注意:很危险
在zabbix agentd 的配置文件里面有一行默认禁止远程执行命令的
vim /etc/zabbix/zabbix_agentd.conf
启动zabbix-agent服务
systemctl restart zabbix-agent
单击里面的add
先不定义邮件
停止监控端的nginx服务
systemctl stop nginx
查看状态,显示为down
再次查看,发现nginx服务已经启动
配置邮件,如果nginx服务重启就发服务
定义媒介类型
定义一个本地邮件
定义好媒介以后,能收到这个媒介的人,就必须拥有这个媒介上的端点
这个本地邮件,只能在本地间传邮件,要确保收邮件的账号
发警报
添加第二条命令
发送给谁
模拟重新启动nginx服务,依然找不到80端口
在被监控的主机
192.168.63.132
vim /etc/nginx/nginx.conf
把端口改成8080
选择停止nginx服务
systemctl stop nginx
查看
显示nginx服务已经down
查看邮件
再修复nginx,查看
查看邮件
脚本报警
zabbix 3.0之后调用脚本时,将3个变量定义为内部宏,以后直接引用这3个宏,就能够向脚本彻底参数了
{ALERT.SENDTO} 定义收件人
{ALERT.SUBJECT} 告警信息的标题
{ALERT.MESSAGE} 告警信息的正文
将这三个参数发给脚本,脚本才能够发送消息
Python报警脚本示例
#!/usr/bin/python
#coding:utf-8
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.utils import parseaddr, formataddr
import sys
def formatAddr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr))
def send_mail(to_list,subject,content):
mail_host = 'smtp.exmail.qq.com' #可用的发送邮件服务器地址
mail_user = '[email protected]' #可用的发送邮箱地址
mail_pass = 'YOUR_PASSWORD' #可用的密码
#以上内容根据你的实际情况进行修改
msg = MIMEText(content,'','utf-8')
msg['Subject'] = Header(subject, 'utf-8').encode()
msg['From'] = formatAddr('zabbix监控 <%s>' % mail_user).encode()
msg['to'] = to_list
try:
s = smtplib.SMTP()
s.connect(mail_host)
s.login(mail_user,mail_pass)
s.sendmail(mail_user,to_list,msg.as_string())
s.close()
return True
except Exception,e:
print str(e)
return False
if __name__ == "__main__":
send_mail(sys.argv[1], sys.argv[2], sys.argv[3])
将脚本保存到这个路径,并给执行权限
/usr/lib/zabbix/alertscripts/
图形界面展示接口
我们可以将多个指标放在张图上进行展示
定义入站流量图
定义出站流图
定义的两张图一起显示
插入图片
选择图片
选择第二张图
如果显示的图片太多,一个屏幕显示不完。我们介意切屏,5秒一切换
每隔5秒一切换
假设有多个屏幕
zabbix的宏,其实就是变量,我们也可以理解为文本类型的变量,所有这里定义为预设的文本替换模式
为什么要用到宏?
例如当我们监控了一个80端口,有很多的服务依赖于这个端口,当我们更改了这个80 端口以后,其他服务也要随之更改,这样非常麻烦,我们可以使用内建的变量,只要调用变量就可以了。
在个时候就用到了内置的变量,才能使得我们的配置非常的灵活。这个时候预设的文本替换模式也叫做宏,就能发挥上用场
而在zabbix中宏有三种级别
全局级别:对所有主机,所有模板都有效
模板级别:对匹配了,调用了次模板的主机都有效,模板是可以被多个主机所占用的
主机级别:仅对当前一个主机有效
如果在三个模式都定义了相同的宏,但是值不同,范围越小级别越高
内建宏的调用 例:{EVENT.DATE} 花括号跟上宏名
zabbix支持两类宏
内建宏:{EVENT.DATE} 花括号跟上宏名
自定义宏:{$EVENT.DATE} 花括号跟上$加宏名
命名方式:大写字母,数字和下划线组成,并且不能以数字开头
内建宏的文档,建议用goolge浏览器查看,有翻译
https://www.zabbix.com/documentation/3.4/manual/appendix/macros/supported_by_location
定义全局模式的宏
使用宏
我们查看nginx是up的
我们 现在把我们自定义的宏的值改为8080,它的监听端口就会变成8080
再次查看
定义主机宏,我们不想用全局的宏,想用主机的宏
再次查看,变成up
模板
模板是一个简化主机配置的一个重要功能
查看内建的模板
模板还可以嵌套另一个模板,重要可以拿到其他模板的配置,还可以在定义自己的配置
所谓的模板就是,可以套在主机上的快速配置主机预设的配置监控配置的集合
而zabbix内建了许多配置模板
如果我们想监控我们的linux服务器,我们可以可以链接至已有的模板上
我们也可以自定义模板
也可以定义模板宏
也可以定义itmes或其他
注意,模板只有被链接至在主机上才会被监控
定义完模板也可以分享给别人的zabbix中
导入模板
zabbix模板我们一般不用自己定义,因为在互联网上已经有一些现成的模板
https://share.zabbix.com/
例如redis
导入模板
也可以下载其他的redis模板
自定义key
在zabbix agent端的配置文件通过userparameter指令定义key
在被监控端也就是zabbix agent端
vim /etc/zabbix/zabbix_agentd.d/test.conf
监控内存空间
UserParameter=memory.used,/usr/bin/free |usr/bin/awk '/^Mem/{print $3}'
UserParameter=memory.shm,/usr/bin/free |usr/bin/awk '/^Mem/{print $5}'
这个key就可以针对这个agent来执行了,哪个agent服务器有这个key,就支持这个服务的监控
重启agent服务
systemctl start zabbix-agent
在服务器端测试
yum install zabbix-get -y 安装测试工具
zabbix_get -s 192.168.63.132 -p 10050 -k "memory.used"
指定agent端的ip端口还有key
zabbix_get -s 192.168.63.132 -p 10050 -k "memory.shm"
查看内存状态
cat /proc/meminfo
所有一个key,获取不同的信息的所有量
UserParameter=memory.usage[*],/usr/bin/awk '/^$1/{print $$2}' /proc/meminfo
* 代表可以传递参数给后面的命令$1 $2 $3 ,个命令本身就支持$1 $2等等,我们未来避免冲突,我们可以写成$$1 ,$$2
重新启动服务
systemctl restart zabbix-agent
在服务器端测试
zabbix_get -s 192.168.63.132 -p 10050 -k "memory.usage[MemFree]"
中括号里面传递的参数
zabbix_get -s 192.168.63.132 -p 10050 -k "memory.usage[Shmem]"
我们可以把这个key配置在我们的监控主机
克隆
单位乘以1024
查看
使用redis的模板监控redis服务
agent端 192.168.63.132
将下载的userparameter_redis.conf 文件拷贝到agent端的/etc/zabbix/zabbix_agentd.d/ 目录下
安装redis服务
yum install redis -y
vim /etc/redis.conf
监听本机所有的可用端口
bind 0.0.0.0
启动服务
systemctl start redis
启动agent服务
在zabbix的web已经将3.4_redis_templates.xml模板上传到zabbix上
将agent端纳入监控
zabbix 自带一个监控mysql数据库的模板
网络发现:让zabbix定期监控一个网段,如果发现一个未监控的主机,