1、手动添加一台被监控服务器
添加一台被监控服务器流程
本次测试被监控主机ip:10.55.2.83,OS:RHEL 6.5
被监控端agent安装
a、配置zabbix yum源并安装
#yum install zabbix-agent zabbix-sender
b、修改配置,agent分Passiv checks(等待zabbix主机来抓取数据)和Active checks(主动向zabbix主机提供数据)两种,
本次测试先使用Passive checks模式。
/etc/zabbix/zabbix_agentd.conf
Passive checks related(被动检测相关的配置:agent等待server过来请求数据)
*Server=10.55.2.81 以逗号分隔授权给哪些zabbix-server或zabbix-proxy过来采集数据的服务器地址; ListenPort=10050 ListenIP=0.0.0.0 StartAgents=3
注意点:在配置active模式时Hostname必须填写
##### Active checks related(主动检测相关的配置:agent主动向server发送监控数据) *ServerActive=IP[:Port] 以逗号分隔的、当前agent主动发送监控数据过去的server端; *Hostname=HOSTNAME
c、启动zabbix-agent,并设置开机自启动,agent端启动的默认端口为10050
~]# chkconfig zabbix-agent on ~]# chkconfig --list zabbix-agent zabbix-agent 0:off 1:off 2:on 3:on 4:on 5:on 6:off ~]# service zabbix-agent start Starting Zabbix agent: [ OK ] ss -tnl 10050端口 LISTEN 0 128 :::10050 :::* LISTEN 0 128 *:10050 *:*
在web配置界面上添加监控配置
一次完整的简单监控配置:
host group-->host-->[applications]-->item-->trigger(Events)-->(Media Type,User Group,User)-->action(conditions,operations(send message,remote script))
定义hostgroup
本次测试我使用zabbix内置的Linux servers
定义hosts
定义监控项application
定义items
item中设置,type选择zabbix agent选项
此时便可以在Monitoring中的Latest data中看到最新采样的数据
添加trigger
触发器 trigger events: 一个监控项可以多个trigger;但一个trigger只能关联一个监控项 触发器的等级: 触发器表达式: {
: . (parameter)} :阈值; diff():比较采样值是否事先值的相同;通常通过checksum进行; min():指定区间或时间范围内的最小值; max() avg() nodata()
trigger状态
定义媒介
Administration---->Media types
添加media用户组合用户
注意点:使用zabbix自带的邮件功能,收件人中的邮箱地址只能填写一个
基于trigger添加action
action为zabbix的全局配置,所以在hosts中没有
这里我定义前3个10分钟发送给ops用户
报警升级设定,第4-6个10分钟发送给boss用户
2、告警测试
当一台服务器出现告警时,首先会做的是自行先处理(remote command),如果自行处理失败后会进行告警升级,进行send message
remote command测试
本次测试一台httpd的服务器,监控其80端口,如果down了后自动恢复启动
服务器地址:10.55.10.79
添加监控项,监控其80端口
手动关闭服务进行event测试:——--->ok
[root@itblog yum.repos.d]# systemctl stop httpd.service [root@itblog yum.repos.d]# systemctl start httpd.service
在agent端需要做的配置
tty问题说明: usermod zabbix -s /bin/bash (1)zabbix用户有所需要管理权限(基于sudo授权); 编辑/etc/sudoers(visudo) 1)Defaults requiretty,修改为#Defaults requiretty,表示不需要控制终端。 2)Defaults requiretty,修改为Default:nobody !requiretty,表示仅nobody用户不需要控制终端。 (2)agent进程要允许执行远程命令; EnableRemoteCommands=1 添加remote command脚本,首先要添加zabbix的sudo权限 ~]# visudo 添加 zabbix ALL=(ALL) NOPASSWD: ALL zabbix可在此主机上运行所有操作并无需密码 注释 centos7会有此类要求,不然会报tty的错误 #Defaults requiretty 编辑zabbix配置文件,开启remote command功能 ~]# vim /etc/zabbix/zabbix_agentd.conf EnableRemoteCommands=1 LogRemoteCommands=1 #记录日志 ~]# systemctl restart zabbix-agent.service
添加action
当httpd服务无法自动修复时,进行告警升级,发送邮件
测试结果
手动关闭httpd
[root@itblog ~]# systemctl stop httpd.service [root@itblog ~]# ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 50 *:3306 *:* LISTEN 0 128 *:22 *:* LISTEN 0 128 *:10050 *:* LISTEN 0 128 :::22 :::* LISTEN 0 128 :::10050 :::*
此时会激活action:remote command,自动开启服务
[root@itblog ~]# ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 50 *:3306 *:* LISTEN 0 128 *:22 *:* LISTEN 0 128 *:10050 *:* LISTEN 0 128 :::80 :::* LISTEN 0 128 :::22 :::* LISTEN 0 128 :::10050 :::*
告警之Media Type中的自定义script
send message: Media Type:传递消息的通道; script:用来定义信息通道。完成信息传递的脚本; (1)脚本放置路径:/etc/zabbix/zabbix_server.conf AlertScriptPath=/usr/lib/zabbix/alertscripts (2)zabbix会向脚本传递三个参数: $1:经由此信道发送的信息的目标; $2:信息的subject; $3:信息的body; Users:利用指定信道接收消息; User Groups:用户的逻辑容器;
编写测试script
这里我改了一个python的发邮件脚本,send_mail函数接受上面所述的三个参数
python版本RHEL 6.5自带的2.6.6
[root@wuzabbix ~]# vim /usr/lib/zabbix/alertscripts/altermail.py #!/usr/bin/python # -*- coding:utf-8 -*- import smtplib import sys from email.mime.text import MIMEText import time #reload(sys) #sys.setdefaultencoding('utf8') current_time=time.strftime('%Y-%m-%d%H:%M',time.localtime(time.time())) mail_host ='10.55.1.13' mail_user ='wuzabbix@*******' #mail_pwd = '******' def send_email( content,mailto, get_sub ): #msg = MIMEText( content.encode('utf8'),_subtype = 'html', _charset = 'utf8') msg = MIMEText(content,_subtype='plain',_charset='gb2312') msg['From'] = mail_user msg['Subject'] =get_sub msg['To'] = ",".join( mailto ) try: s = smtplib.SMTP() s.connect(mail_host,25) s.sendmail(mail_user,mailto,msg.as_string()) s.close() except Exception as e: print 'Exception: ', e title=sys.argv[2] cont=""" --------------------------------- Abstract: %s --------------------------------- Date: %s --------------------------------- """%(sys.argv[3],current_time) to_list = [ '%s'%(sys.argv[1]), ] with open('/tmp/sendmail_qs.log','ab') as f: f.write('%s Receive address: %s Title: %s \n'%(current_time,sys.argv[1],title)) send_email(cont,to_list,title)
添加权限并在本机进行发送测试:
chmod +x altermail.py [root@wuzabbix alertscripts]# python altermail.py yaominghe@******* test test
邮件接受OK
自定义media type
编辑我刚才定义的webservice的action
修改刚才定义的ops users,将users中定义的媒介也修改
关闭httpd进行测试
[root@itblog ~]# systemctl stop httpd.service [root@itblog ~]# ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 50 *:3306 *:* LISTEN 0 128 *:22 *:* LISTEN 0 128 *:10050 *:* LISTEN 0 128 127.0.0.1:199 *:* LISTEN 0 128 :::22 :::* LISTEN 0 128 :::10050 :::*
3、key
内建key
基于key+parameter的item添加
相关使用方法可以查看官方文档中的documentation
https://www.zabbix.com/documentation/3.0/manual/config/items/itemtypes/zabbix_agent
测试定义一个网卡的入站流量
store value: As is:数据不做任何处理; Delta(Simple change):本次采样数据减去前一次采样数据; Delta(speed per second):本次采样数据减去前一次采样数据,而后除以采样间隔时长;
此时数据已经过来
用户自定义key
UserParameter
4、展示接口
图像Graphs
在10.55.2.83服务器上继续添加多个item,监控网络流量
在主机设定中选中graphs进行配置
add进行添加,在monitorring就可以进行查看了
screen
把多个graph整合于同一个屏幕进行展示
slide shows
把多个screen以slide show的方式进行展示
5、模板
应用模板测试
新开一台被监控主机10.55.1.13,安装zabbix-agent,zabbix-sender并配置开启
[root@wulmail zabbix]# vim zabbix_agentd.conf Server=10.55.2.81 EnableRemoteCommands=1 LogRemoteCommands=1 ServerActive=127.0.0.1,10.55.2.81 Hostname=wulmail #开启主动监控时必须指定hostname [root@wulmail ~]# service zabbix-agent start Starting Zabbix agent: [确定] [root@wulmail ~]# chkconfig zabbix-agent on [root@wulmail ~]# chkconfig --list | grep zabbix-agent zabbix-agent 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
web端添加主机
由于套用了模板,所有点击add后很多之前需手动添加的东西均自动完成
模板可以使用系统自带的,也可以根据自己需求自己定义。
6、宏和自定义key
宏:macro,预设的文本替换模式;
两种: 内置 自定义{$MACRO} 命名方式:大写字母,数字和下划线; 级别: 全局 模板 主机 主机-->模板-->全局
全局宏
自定义一个{HTTP_PORT}全局宏进行测试
模板宏
主机宏
主机定义一个宏进行测试
用户自定义key
位置:在zabbix agent端实现; zabbix_agentd.conf UserParameter 语法格式: UserParameter=, 使用示例: 监控内存信息 UserParameter=memory.usage[*],cat /proc/meminfo | awk '/^$1:/{print $$2}' 监控nginx状态页面 UserParameter=ngx.active[*],curl -s http://$1:$2/$3 | awk '/^Active/{print $$3}' UserParameter=ngx.accepts[*],curl -s http://$1:$2/$3 | awk '/^[[:space:]]*[0-9]/{print $$1}' UserParameter=ngx.handled[*],curl -s http://$1:$2/$3 | awk '/^[[:space:]]*[0-9]/{print $$2}' UserParameter=ngx.requests[*],curl -s http://$1:$2/$3 | awk '/^[[:space:]]*[0-9]/{print $$3}'
测试:
zabbix被监控主机的agent配置文件修改
[root@itblog ~]# vim /etc/zabbix/zabbix_agentd.conf UserParameter=memory.free,cat /proc/meminfo | awk '/^MemFree:/{print $2}' [root@itblog ~]# systemctl restart zabbix-agent.service
可以在zabbix主机上通过zabbix_get命令进行手动探测
[root@wuzabbix ~]# zabbix_get -s 10.55.10.79 -p 10050 -k "memory.free" 308320 [root@wuzabbix ~]# zabbix_get -s 10.55.10.79 -p 10050 -k "memory.free" 308228
调整成可以添加参数
UserParameter=memory.usage[*],cat /proc/meminfo | awk '/^$1:/{print $$2}'
在zabbix主机上通过zabbix_get命令进行手动探测
[root@wuzabbix ~]# zabbix_get -s 10.55.10.79 -p 10050 -k "memory.usage[MemFree]" 304728 [root@wuzabbix ~]# zabbix_get -s 10.55.10.79 -p 10050 -k "memory.usage[MemFree]" 304656 [root@wuzabbix ~]# zabbix_get -s 10.55.10.79 -p 10050 -k "memory.usage[MemTotal]" 3875148 [root@wuzabbix ~]# zabbix_get -s 10.55.10.79 -p 10050 -k "memory.usage[MemTotal]" 3875148
web上添加item进行监控测试
此时我的监控项已经有数据
所以只要通过脚本能抓取的数据均能通过zabbix监控
7、zabbix自动发现
server扫描到的主机,添加之,自动将模板链接至主机; zabbix网络发现可通过以下方式进行: ip地址范围 可用的服务(ftp,ssh,http,...) zabbix_agnet的响应 snmp_agent的响应 分两个阶段: discovery actions 发现事件: service host 四类事件:discovered,lost,up,down; 可采取的actions: remote command,send message 添加/删除主机; 启用/禁用主机; 将主机添加至组,从组中删除主机; 将模板链接至主机,反链接; 发现状态采取的动作: discovered-->add host lost-->delete host up-->enable down-->disable
测试:
我通过agent方式探测10.55.10网段的机器
添加完成后定义action动作
一旦发现主机,添加了如下动作: 发送邮件,添加主机,链接至模板
指定条件:通过agent.ping被发现的主机,并且Discovery状态为Discovered
主机自动添加
发现后的邮件预警
8、web监控
监控web页面的可用性及性能
web会自动给这个application添加如下items
monitoring中的web页面
9、基于SNMP的监控
主要用于监控路由交换设备
SNMP:简单网络管理协议: 读(get),写(set),trap; 基于161/UDP
测试:
客户端安装
[root@itblog ~]# yum -y install net-snmp [root@itblog ~]# rpm -ql net-snmp /etc/snmp /etc/snmp/snmpd.conf /etc/snmp/snmptrapd.conf /etc/sysconfig/snmpd /etc/sysconfig/snmptrapd /usr/bin/agentxtrap /usr/bin/net-snmp-create-v3-user /usr/bin/snmpconf /usr/lib/systemd/system/snmpd.service /usr/lib/systemd/system/snmptrapd.service /usr/lib/tmpfiles.d/net-snmp.conf /usr/sbin/snmpd /usr/sbin/snmptrapd /usr/share/doc/net-snmp-5.7.2 /usr/share/doc/net-snmp-5.7.2/AGENT.txt /usr/share/doc/net-snmp-5.7.2/COPYING /usr/share/doc/net-snmp-5.7.2/ChangeLog.trimmed /usr/share/doc/net-snmp-5.7.2/EXAMPLE.conf /usr/share/doc/net-snmp-5.7.2/FAQ /usr/share/doc/net-snmp-5.7.2/NEWS /usr/share/doc/net-snmp-5.7.2/PORTING /usr/share/doc/net-snmp-5.7.2/README /usr/share/doc/net-snmp-5.7.2/README.agent-mibs /usr/share/doc/net-snmp-5.7.2/README.agentx /usr/share/doc/net-snmp-5.7.2/README.krb5 /usr/share/doc/net-snmp-5.7.2/README.mib2c /usr/share/doc/net-snmp-5.7.2/README.snmpv3 /usr/share/doc/net-snmp-5.7.2/README.thread /usr/share/doc/net-snmp-5.7.2/TODO /usr/share/doc/net-snmp-5.7.2/ipf-mod.pl /usr/share/doc/net-snmp-5.7.2/passtest /usr/share/man/man1/net-snmp-create-v3-user.1.gz /usr/share/man/man1/snmpconf.1.gz /usr/share/man/man5/snmp_config.5.gz /usr/share/man/man5/snmpd.conf.5.gz /usr/share/man/man5/snmpd.examples.5.gz /usr/share/man/man5/snmpd.internal.5.gz /usr/share/man/man5/snmptrapd.conf.5.gz /usr/share/man/man5/variables.5.gz /usr/share/man/man8/snmpd.8.gz /usr/share/man/man8/snmptrapd.8.gz /usr/share/snmp /usr/share/snmp/snmpconf-data /usr/share/snmp/snmpconf-data/snmp-data /usr/share/snmp/snmpconf-data/snmp-data/authopts /usr/share/snmp/snmpconf-data/snmp-data/debugging /usr/share/snmp/snmpconf-data/snmp-data/mibs /usr/share/snmp/snmpconf-data/snmp-data/output /usr/share/snmp/snmpconf-data/snmp-data/snmpconf-config /usr/share/snmp/snmpconf-data/snmpd-data /usr/share/snmp/snmpconf-data/snmpd-data/acl /usr/share/snmp/snmpconf-data/snmpd-data/basic_setup /usr/share/snmp/snmpconf-data/snmpd-data/extending /usr/share/snmp/snmpconf-data/snmpd-data/monitor /usr/share/snmp/snmpconf-data/snmpd-data/operation /usr/share/snmp/snmpconf-data/snmpd-data/snmpconf-config /usr/share/snmp/snmpconf-data/snmpd-data/system /usr/share/snmp/snmpconf-data/snmpd-data/trapsinks /usr/share/snmp/snmpconf-data/snmptrapd-data /usr/share/snmp/snmpconf-data/snmptrapd-data/authentication /usr/share/snmp/snmpconf-data/snmptrapd-data/formatting /usr/share/snmp/snmpconf-data/snmptrapd-data/logging /usr/share/snmp/snmpconf-data/snmptrapd-data/runtime /usr/share/snmp/snmpconf-data/snmptrapd-data/snmpconf-config /usr/share/snmp/snmpconf-data/snmptrapd-data/traphandle /var/run/net-snmp
开启snmpd服务
[root@itblog snmp]# systemctl start snmpd.service [root@itblog snmp]# ss -unlp State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 *:161 *:* users:(("snmpd",pid=11648,fd=6))
监控端可以安装net-snmp-utils进行SNMP监控测试
yum -y install net-snmp-utils 整棵树的信息 ~]# snmpwalk -c public -v 2c 10.55.10.79 .1.3.6.1.2.1.1 SNMPv2-MIB::sysDescr.0 = STRING: Linux itblog.cptw.com.cn 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 1 9 22:10:57 UTC 2015 x86_64SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10 DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (32627) 0:05:26.27 SNMPv2-MIB::sysContact.0 = STRING: Root
(configure /etc/snmp/snmp.local.conf) SNMPv2-MIB::sysName.0 = STRING: itblog.cptw.com.cn SNMPv2-MIB::sysLocation.0 = STRING: Unknown (edit /etc/snmp/snmpd.conf) SNMPv2-MIB::sysORLastChange.0 = Timeticks: (9) 0:00:00.09 SNMPv2-MIB::sysORID.1 = OID: SNMP-MPD-MIB::snmpMPDCompliance SNMPv2-MIB::sysORID.2 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance SNMPv2-MIB::sysORID.3 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance SNMPv2-MIB::sysORID.4 = OID: SNMPv2-MIB::snmpMIB SNMPv2-MIB::sysORID.5 = OID: TCP-MIB::tcpMIB SNMPv2-MIB::sysORID.6 = OID: IP-MIB::ip SNMPv2-MIB::sysORID.7 = OID: UDP-MIB::udpMIB SNMPv2-MIB::sysORID.8 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup SNMPv2-MIB::sysORID.9 = OID: SNMP-NOTIFICATION-MIB::snmpNotifyFullCompliance SNMPv2-MIB::sysORID.10 = OID: NOTIFICATION-LOG-MIB::notificationLogMIB SNMPv2-MIB::sysORDescr.1 = STRING: The MIB for Message Processing and Dispatching. SNMPv2-MIB::sysORDescr.2 = STRING: The management information definitions for the SNMP User-base d Security Model.SNMPv2-MIB::sysORDescr.3 = STRING: The SNMP Management Architecture MIB. SNMPv2-MIB::sysORDescr.4 = STRING: The MIB module for SNMPv2 entities SNMPv2-MIB::sysORDescr.5 = STRING: The MIB module for managing TCP implementations SNMPv2-MIB::sysORDescr.6 = STRING: The MIB module for managing IP and ICMP implementations SNMPv2-MIB::sysORDescr.7 = STRING: The MIB module for managing UDP implementations SNMPv2-MIB::sysORDescr.8 = STRING: View-based Access Control Model for SNMP. SNMPv2-MIB::sysORDescr.9 = STRING: The MIB modules for managing SNMP Notification, plus filterin g.SNMPv2-MIB::sysORDescr.10 = STRING: The MIB module for logging SNMP Notifications. SNMPv2-MIB::sysORUpTime.1 = Timeticks: (8) 0:00:00.08 SNMPv2-MIB::sysORUpTime.2 = Timeticks: (8) 0:00:00.08 SNMPv2-MIB::sysORUpTime.3 = Timeticks: (8) 0:00:00.08 SNMPv2-MIB::sysORUpTime.4 = Timeticks: (8) 0:00:00.08 SNMPv2-MIB::sysORUpTime.5 = Timeticks: (8) 0:00:00.08 SNMPv2-MIB::sysORUpTime.6 = Timeticks: (8) 0:00:00.08 SNMPv2-MIB::sysORUpTime.7 = Timeticks: (8) 0:00:00.08 SNMPv2-MIB::sysORUpTime.8 = Timeticks: (8) 0:00:00.08 SNMPv2-MIB::sysORUpTime.9 = Timeticks: (9) 0:00:00.09 SNMPv2-MIB::sysORUpTime.10 = Timeticks: (9) 0:00:00.09 检测具体数信息 ~]# snmpget -c public -v 2c 10.55.10.79 system.sysDescr.0 SNMPv2-MIB::sysDescr.0 = STRING: Linux itblog.cptw.com.cn 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 1 9 22:10:57 UTC 2015 x86_64
zabbix上配置
在10.55.10.79主机上添加SNMP interfaces
添加snmp的item