zabbix进阶
zabbix宏和用户自定义监控(02)_
zabbix发现、自动注册和web监控(03)_
zabbix分布式监控(04)_
1. web宏和自定义监控
要求:宏的名字只能使用大写字母、数字、下划线,只能以大写字母开头//不能有小写
zabbix有许多内置的宏
宏定义:zabbix支持在全局,模板或主机级别使用用户自定义的宏,(user marco)
引用:用户自定义宏要使用{$MACRO}调用宏,//系统定义的宏,不需要使用$
应用:应用在item keys和description,trigger名称和表达式上,主机接口IP/DNS及端口,discovery机制,的SNMP协议的相关信息上
分类:全局宏,模板宏,主机级别宏,
宏替换次序:主机级别-à主机上的一级模板{多个模板按其ID号排序}----à二级模板--。。。
全局宏
自定义宏的创建:
全局宏:“Administration----general----Macros” //自定义宏
主机或模板级别的宏:编辑响应的主机或模板的属性即可
administrator—template-àmacros //模板级别的宏
//在模板中定义宏,假如以后需要修改的话,只需要修改宏即可,不在需要修改值
测试:
在自定义模板中:configurationàtemplates---新建的模板名: macros :{$NETINLIMIT} => 8000
configurationàtemplates---新建的模板名:triggers--:expression:{10.0.0.201:net.if.in[ieno16777736].last(,0)}>{$NETINLIMIT} //直接使用即可
创建宏的方法:
1. configuration—template—模板名{Macros} //定义宏
//如果使用的是模板,则模板中的macro大于admin中的Macro
2. Administrator—General---右侧选择Macros---创建一个宏即可
用户自定义参数Userparameter功能
//在agent上执行脚本,
free | awk '/^Mem:/{print $4}' //获取空闲空间
语法:UserParameter=
一般来说返回的数据量不能大于512k,不能返回太大的数据
vim /etc/zabbix/agntd.conf 修改该配置文件即可,在agentd上
UserParameter=memory.free,/usr/bin/free | awk '/^Mem:/{pring $4}' //这样就会有一个返回值,返回退出,然后重启agent
server端,使用:zabbix_get -s 10.0.0.201 -k "memory.free" //可以测试得到大小
//在server上添加item对应key,memory.free
//最后在monitoring---latest data上可以看到效果
//但是获取到的数据是以k计算的
修改item---use custom information---1024//,然后清空数据,会自动变成,再次查看lastest data会自动变成 M的
清空数据:
configuration—hsots---选中主机名---最后一个:clear history and trends //清空数据
cat /proc/meminfo | awk '/^MemFree/{print $2}' //也可以获取内存还剩多少
UserParameter=key[*],command //其实可以接受多个参数
接受多个参数:
vim /etc/zabbix/zabbix_agentd.conf
UserParameter=memory.usage[*],/bin/cat /proc/meminfo | awk ‘/^$1:/{print $$2}’
//cat命令的执行结果,就是函数的返回值
//命令自身也有变量的话,需要在$之前再加一个$, awk一定要使用单引号
zabbix_get -s 10.0.0.201 -k "memory.usage[MemTotal]" //在服务器端测试
这样在/etc/proc/meminfo 中的信息都能够被采集到
//作业:
创建多个item,实现监控agent的memory的使用情况
注意:在此之前删除mem的相关item
监控nginx的信息:
例如:监控nginx的各种信息
1实验parameter
UserParameter=Nginx.active[*], /usr/bin/curl -s "http://$1:$2/status" | awk '/^Active/ {print $NF}'
UserParameter=Nginx.reading[*], /usr/bin/curl -s "http://$1:$2/status" | grep 'Reading' | cut -d" " -f2
UserParameter=Nginx.writing[*], /usr/bin/curl -s "http://$1:$2/status" | grep 'Writing' | cut -d" " -f4
UserParameter=Nginx.waiting[*], /usr/bin/curl -s "http://$1:$2/status" | grep 'Waiting' | cut -d" " -f6
UserParameter=Nginx.accepted[*], /usr/bin/curl -s "http://$1:$2/status" |
awk '/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $$1}'
//开头是数字
UserParameter=Nginx.handled[*], /usr/bin/curl -s "http://$1:$2/status" |
awk '/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $$2}'
UserParameter=Nginx.requests[*], /usr/bin/curl -s "http://$1:$2/status" |
awk '/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $$3}'
活动的个数 //$1,$2 服务器地址和端口
reading:nginx读到客户端的Header信息数
writing:返回给客户端Heade信息数
waiting:开启keep-alive的情况下,这个值active – ( reading + writing) ,意思是Nginx已经处理完,正在等候下次请求指令的驻留连接数
实验:监控nginix
1. yum install nginx
vim /etc/nginx/conf.d/default.conf
启用nginx status
server { //在server中
。。。。。
stub_status on;
location /status {
access_log off;
allow 127.0.0.1;
allow 10.0.0.0/24;
deny all;}
。。。。
}
service nginx start
curl http://127.0.0.1/status //测试一下
2. 在agent上vim /etc/zabbix/zabbix_agentd.d/nginx.conf //新建的配置文件
把1实验parameter贴上
UserParameter=Nginx.active[*], /usr/bin/curl -s "http://$1:$2/status" | awk '/^Active/ {print $NF}'
UserParameter=Nginx.reading[*], /usr/bin/curl -s "http://$1:$2/status" | grep 'Reading' | cut -d" " -f2
UserParameter=Nginx.writing[*], /usr/bin/curl -s "http://$1:$2/status" | grep 'Writing' | cut -d" " -f4
UserParameter=Nginx.waiting[*], /usr/bin/curl -s "http://$1:$2/status" | grep 'Waiting' | cut -d" " -f6
//前三个都需要减去前值,后三个不需要减去前值,delta
UserParameter=Nginx.accepted[*], /usr/bin/curl -s "http://$1:$2/status" | awk '/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $$1}'
UserParameter=Nginx.handled[*], /usr/bin/curl -s "http://$1:$2/status" | awk '/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $$2}'
UserParameter=Nginx.requests[*], /usr/bin/curl -s "http://$1:$2/status" | awk '/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $$3}'
在server上测试:
zabbix_get -s 10.0.0.201 -k "Nginx.accepted[10.0.0.201,80]"
//也就是说 s 为agent,测试也为自己
3. 创建item
name: nginx-1
key :Nginx.accepted[{HOST.IP},80] //HOST.IP是一个宏
Nginx. handled [{10.0.0.201},80] //第二个item
Nginx.active[{10.0.0.201},80]
Store value:delta
New Application:nginx-status
4. 假如要使用脚本的话, 一次只能返回一个值,而且是单个,其次,
脚本,放在
rpm –ql zabbix-agent //server端, 默认路径/usr/lib/zabbix/externalscripts
在agent上,放在任何路径下都可以,
5. 添加自定义脚本,agent上,实现监控
要求:
1. 必须有输出值
2. zabbix用户必须有执行权限,或者777
3. 接受的参数:$1--$9
6.实现:
vim zabbix_agentd.conf
UnsafeUserParameters=1 //自定义脚本的时候需要开启
UserParameter=test.icmp[*],/etc/zabbix/script/2.sh $1
出现错误,item
很有可能是因为,采集的数值不匹配//创建item时,采用的单位不对
pkloss和restime 的: type of information:float
units: % 和 ms
2.sh脚本
#!/bin/bash
count=1
server=`grep -i "^server" /etc/zabbix/zabbix_agentd.conf | head -1 |cut -d= -f2`
# get the server ip
data=`ping -c $count $server`
case $1 in
"pkloss")
echo $data | grep loss | head -1 | awk -F, '{print $3}'| cut -d% -f1 | cut -d' ' -f2
;;
"restime")
echo $data | grep rtt |cut -d/ -f5
;;
*)
esac
3.脚本:
#!/bin/bash
count=1
server=`grep -i "^server" /etc/zabbix/zabbix_agentd.conf | head -1 |cut -d= -f2`
# get the server ip
data=`ping -c $count $server`
case $1 in
"pkloss")
echo $data | grep loss | head -1 | awk -F, '{print $3}'| cut -d% -f1 | cut -d' ' -f2
;;
"restime")
echo $data | grep rtt |cut -d/ -f5
;;
"min")
echo $data | awk -Frtt '{print $2}' | tail -1 | cut -d/ -f4 |cut -d' ' -f3
;;
"max")
echo $data | awk -Frtt '{print $2}' | tail -1 | cut -d/ -f6
;;
*)
esac
7. 附加基于UDP的测试,还有其他指标
cat a | awk -Frtt '{print $2}' | tail -1 | cut -d/ -f4 |cut -d' ' -f3min
cat a | awk -Frtt '{print $2}' | tail -1 | cut -d/ -f6max
任务:
1.安装hping3
写一个脚本调用 udpnock实现,userparameter的功能
wget http://www.hping.org/hping3-20051105.tar.gz //使用源码安装
1. yum install gcc
2. yum install libpcap-devel
3. yum install tcl-devel
4. vim bytesex.h
ln -s /usr/include/pcap-bpf.h /usr/include/net/bpf.h //为其创建链接,文件
./configure
make && make install
问题1:
touch: 无法创建"/tmp/a.tmp": 权限不够
方案:使用变量保存起来
问题2:udpnock 用法
/etc/zabbix/bin/udpnock -c 10 -i 40 -P 5900 60.205.230.140 5130
-c :请求次数
-i :源端口,ip,目标端口
-P :
/udpnock的使用方法:
在agent上,实现,nock测试 //端口是否是指定的,本地的端口是自定义打开的,但是对端的端口是需要手动打开的,而且要接受参数
hping3的使用方法:
hping
-c :发送多少个
-i :间隔,默认是s,可以使用ms,us
-n :不进行lookup
-q :只显示最后的统计数据
-z :ctrl+z增减发送出去包的TTL,按一次增加1,按两次增加2,按住不放过是减少TTL
-0|-1|-2|-8| :RAW IP模式,ICMP,UDP,扫描模式,默认tcp
//all所有端口,1-65535,known:/etc/service记录的所有端口,
//多个不相连的端口:1,4,443,445-224
//!kown 取反
-9 : --listen signature //监听模式,监听含有特定signature的包并且将含有该signature的包dump;
-a :(--spoof hostname)伪装自己的地址,会造成自己收不到返回的包,在进行idle扫描时候有用,// ip地址是成功的伪装了,但是mac还是自己的
--rand-source : 使用随机地址伪装自己的地址
--rand-dest : 随机选择目标
-t :制定包的TTL ,具体要设定为多大要看是做什么,最大是255;
-r : 显示id的增量,而不显示id
hping3 192.168.0.107 -m 8 -f //-m:mtu,-f fragment,mtu默认是16kbyte,当发送包的大小大于16kbyte的时候,就进行fragment,
-G: --rroute 显示路由
-s:(--baseport)设定发送包的最开始的端口,如果要使用一个固定的端口的话,就要加上 -k(--keep)
hping –i u1 10.0.0.1 //每一us发送一个 ,这是一种***行为
hping3 -8 known -S 192.168.0.1 <---这里-S 表示采用SYN扫描
hping3 -8 1-1024 -S 192.168.0.1 //指定扫描端口
hping3 -a www.baidu.com 192.168.0.107 //自己是收不到包的,会返回给192.168.0.107
hping3 --rand-source 192.168.0.107 //在防火墙货这路由器上可以看到效果
hping3 --rand-dest -I eth0 192.168.0.x <--使用x代表0-255,要是在整个网络中选择目标可以换成4个x;在这种模式下一定要制定interface,
hping3 192.168.0.107 -m 8 -f
hping -G www.baidu.com
hping3 -s 2 192.168.0.107
iperf的安装和使用
wget https://iperf.fr/download/fedora/iperf3-3.1.3-1.fc24.x86_64.rpm
yum localinstall
在服务端运行iperf,输入命令iperf –s –p 12345 –i 1 以在本机端口12345上启用iperf
客户端:iperf –c server-ip –p server-port –i 1 –t 10 –w 20K
-c:客户端模式,后面是server-ip
-p:server的监听端口
-i:带宽报告的时间间隔,s
-t:设定测试的时长默认为s
-w:设置tcp窗口大小,一般可以不用设置,默认即可
//以上为单线程TCP
iperf –c 10.0.0.200 -p 12345 –i 1 –t 3 –P 2 //启动两个线程 ,客户单
iperf –s -p 12345 –m –i 1 //server端
UDP测试
iperf –s -u –p 12345 –i 1 以在本机端口12345上启用iperf,并运行于udp模式
iperf -c server-ip -p server-port -i 1 -t 10 –b
-c:以什么身份运行
-b:设置udp的发送带宽,单位bit/s
显示的内容:
Jitter:抖动, Lost/Total:丢包率,Datagrams为包数量