Zabbix

post thumb
Ops
作者 Louis 发表于 2018年7月24日

摘要:

  • 监控系统满足的条件
  • Zabbix概述
  • Zabbix安装配置及相关术语
  • Zabbix实现QQ邮箱通知监控

监控系统满足的条件

  • 采集
agentless: SSH/Telnet
SNMP: simple network manage protocal 
	UDP
IPMI: intelligent 
jmx(java management eXtensions):
agent:
	sensor
  • 存储
NVPS (New Values Per Second)
Zabbix:MySQL,PGSQL...PHP...
Cacti:rrd(round-robin database)...SNMP...Nagios
Prometheus: NOSQL,Agent(exporter),Time Series /Streaming Databases.... PHP
  • 可视化
gafana #一个图形界面
  • 告警
Nagios,bash shell

Zabbix组件概述

Zabbix server
Database Storage
Web interface
Proxy
Agent

zabbix介绍

zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。

zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。

zabbix由2部分构成,zabbix server与可选组件zabbix agent。

**zabbix server可以通过SNMP,zabbix agent,ping,端口监视等方法提供对远程服务器/网络状态的监视,数据收集等功能,**它可以运行在Linux, Solaris, HP-UX, AIX, Free BSD, Open BSD, OS X等平台上。

**zabbix agent需要安装在被监视的目标服务器上,它主要完成对硬件信息或与操作系统有关的内存,CPU等信息的收集。**zabbix agent可以运行在Linux,Solaris,HP-UX,AIX,Free BSD,Open BSD, OS X, Tru64/OSF1, Windows NT4.0, Windows (2000/2003/XP/Vista)等系统之上。

zabbix server可以单独监视远程服务器的服务状态;同时也可以与zabbix agent配合,可以轮询zabbix agent主动接收监视数据(agent方式),同时还可被动接收zabbix agent发送的数据(trapping方式)。

另外zabbix server还支持SNMP (v1,v2),可以与SNMP软件(例如:net-snmp)等配合使用。

zabbix程序的组件:

zabbix_server:服务端守护进程;
zabbix_agentd:agent守护进程;
zabbix_proxy:代理服务器,可选组件;
zabbix_get:命令行工具,手动测试向agent发起数据采集请求;
zabbix_sender:命令行工具,运行于agent端,手动向server端发送数据;
zabbix_java_gateway: java网关;
zabbix_database:MySQL或PostgreSQL;
zabbix_web:Web GUI

zabbix逻辑组件:

主机组(host group)
主机 (hosts)
监控项(item)
	key:实现获取监控的目标上的数据的命令或脚本的名称;
应用(application):同一类监控项的集合;
触发器(trigger):表达式;PROBLEM, OK;
事件(event):
动作(action):由条件(condition)和操作(operation)组件;
媒介(media):发送通知的通道;
通知(notification):
远程命令(remote command):
报警升级():
模板(template):快速定义被监控主机的各监控项的预设项目集合;
图形(graph):用于展示历史数据或趋势数据的图像;
屏幕(screen):由多个graph组成;

Zabbix安装

Zabbix镜像选择

仓库准备,这里选择国内的阿里云镜像(也可以选择清华源),这里使用zabbix3.4

$ vim /etc/yum.repos.d/zabbix.repo
[zabbix]
name=zabbix
baseurl=https://mirrors.aliyun.com/zabbix/zabbix/3.4/rhel/7/x86_64/
gpgcheck=0

[zabbix-non]
name=zabbixnon
baseurl=https://mirrors.aliyun.com/zabbix/non-supported/rhel/7/x86_64/          
gpgcheck=0
##复制到从节点一份
$ scp /etc/yum.repos.d/zabbix.repo node01:/etc/yum.repos.d/

安装并配置Zabbix_Server

  1. 开始安装Zabbix server, frontend, agent, get;搭建lamp环境,如果不会可以看前面的博客lamp搭建
# yum install zabbix-server-mysql zabbix-web-mysql zabbix-agent zabbix-get -y
# yum install -y httpd mariadb-server php php-mysql 
  1. 创建数据库,授权zabbix用户并导入数据。
$ systemctl start mariadb httpd
$ mysql -uroot -ppassword
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> grant all privileges on zabbix.* to zabbix@'192.168.1.%' identified by 'centos';
$ zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -pcentos zabbix -h192.168.1.18
  1. 编辑zabbix_server.conf,修改数据库的密码项及主机,其他不变动
$ vim /etc/zabbix/zabbix_server.conf
LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=0
PidFile=/var/run/zabbix/zabbix_server.pid
SocketDir=/var/run/zabbix
DBHost=192.168.1.18
DBName=zabbix
DBUser=zabbix
DBPassword=centos
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
Timeout=4
AlertScriptsPath=/usr/lib/zabbix/alertscripts
ExternalScripts=/usr/lib/zabbix/externalscripts
LogSlowQueries=3000
  1. 修改httpd下的zabbix.conf文件的时区
$ vim /etc/httpd/conf.d/zabbix.conf
php_value date.timezone Asia/Shanghai   #修改为上海时区。
  1. 启动服务
$ systemctl restart zabbix-server zabbix-agent httpd
$ systemctl enable zabbix-server zabbix-agent http

访问http://host/zabbix,进行傻瓜式安装,安装生成的配置文件:/etc/zabbix/web/zabbix.conf.php

安装配置好后进入登录界面,默认用户名Admin,密码zabbix。

配置Agent端

  • node01
$ yum install -y zabbix-agent

Unit file: zabbix-agent.service 
  • 配置说明
配置文件:/etc/zabbix/zabbix_agentd.conf 
	############ GENERAL PARAMETERS #################
	##### Passive checks related
		被动监控相关配置
	##### Active checks related
		主动监控相关配置,agent端主动向server周期性发送数据;
	############ ADVANCED PARAMETERS #################
	####### USER-DEFINED MONITORED PARAMETERS #######
		用户自定义参数
	####### LOADABLE MODULES #######
	####### TLS-RELATED PARAMETERS #######			

##### Passive checks related
	Server=IP1, IP2, ...
	ListenPort=10050
	ListenIP=0.0.0.0
	StartAgents=3
	
##### Active checks related
	ServerActive=IP1[:port], IP2[:port], ...
	Hostname=Unique_HOSTNAME
		必须与服务器配置的监控主机的主机名称保持一致;

zabbix术语

  • zabbix入门
监控系统:
    采集 --> 存储(MySQL/PGSQL/Sqlite) --> 报警 --> 可视化    
zabbix:
    采集:
        agent/snmp/IPMI/jmx         
    设备:主机(hosts) --> 主机组(hostgroups)
         监控项(items) --> 应用组(applications)
         触发器(triggers, 表达式) --> trigger events
         动作(actions, CONDITIONS, OPERATIONS, RECOVERY OPERATIONS)
            OPERATIONS:
                remote command
                send message --> USERS (media)
            Media Type:Email/
                
    可视化:
        graph, slide show, map       
        grafana:
  • 配置流程说明
术语:host groups --> host --> application --> item --> trigger --> action (conditions, operations)
	    graph: 
		simple: 每个item定义完成后自动生成 
		customed:用于将多个item的数据整合于一个图形中展示				
  • items
items: key+parameter
	key: 
		zabbix内建:
			type: 
				agent (server:pull)
				agent(active) (agent:push)
				snmp v1
				...
		用户自定义(UserParameter)
		
	采集到的数据的类型:
		数值:
			整数
			浮点数 
		字符串:
			字符串
			文本
			
	存储的值:
		As is:不对数据做任何处理
		Delta:(simple change),本次采样减去前一次采样的值的结果
		Delta:(speed per second),本次采样减去前一次采样的值,再除以经过的时长;
  • trigger
trigger:
    界定某特定的item采集到的数据的非合理区间或非合理状态:逻辑表达式 
    
	逻辑表达式,阈值;通常用于定义数据的不合理区间;
		OK:正常 状态 --> 较老的zabbix版本,其为FALSE;
		PROBLEM:非正常 状态 --> 较老的zabbix版本,其为TRUE;
		
		OK --> PROBLEM 
		Recovery:PROBLEM --> OK 
		
	触发器存在可调用的函数:
		nodata()
		last()
		date()
		time() 
		now()
		dayofmonth()
		...
		
	Severity:严重等级
		Not classified
		Information
		Warning
		Average
		High
		Disaster
		
	触发器表达式:
		{hostname:key[paramters].function(arguments) 
			>, <, =, #(not equal)...
			+, -, *, /
			&, |
		
		{n1.magedu.com:net.if.in[eno16777736,packets].last(#1)}>15
		
	trigger间存在依赖关系:
        zabbix server <--> Router1 <--> Host1
 
 事件机制:
    四种事件源:trigger, discovery, auto registration, internal
  • Media
Media:媒介
	告警信息的传递通道;
	类型:
		Email:邮件
		Script:自定义脚本
		SMS:短信
		Jabber:
		Ez Texting:
		
	接收信息的目标为zabbix用户:
		需要用户上定义对应各种媒介通道的接收方式;
  • Action
conditions:	
	多个条件之间存在逻辑关系;
operations:
	条件满足时触发的操作;
		
	send message:
		(1) Media type:传递信息的通道;
			(a) Email
			(b) Script:报警脚本;
				脚本放置路径:zabbix_server.conf配置文件中AlertScriptsPath参数定义的路径下;
					/usr/lib/zabbix/alertscripts/
				zabbix服务器在调用脚本时,会向其传递三个参数:
					$1:经由此信道接收信息的目标;
					$2:subject
					$3:body
					
	            zabbix 3.0之后的版本,此三个变量定义为内部宏:
	                {ALERT.SENDTO}
	                {ALERT.SUBJECT}
	                {ALERT.MESSAGE}
	                
		(2) 信息接收人:
			(a) User Groups
			(b) Users
	            admin: 
  • 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 = 'USERNAME@DOMAIN.TLD'
    mail_pass = 'YOUR_PASSWORD'
    #以上内容根据你的实际情况进行修改,pass为stmp的授权码。
    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])
  • remote command
功能:
	在agent所在的主机上运行用户指定的命令或脚本;例如:
		重启服务;
		通过IPMI重启服务器;
		任何用户自定义脚本中定义的操作; 
		
可执行的命令类型:
	IPMI
	ssh 
	telnet 
	Custom Script
	Global Script
	
前提:
在agent需要完成的配置:
	(1) zabbix用户拥有所需要的管理权限;
		编辑/etc/sudoers文件,注释如下行;
		]# visudo
		# Defaults requiretty
		添加如下行:
		zabbix  ALL=(ALL)  NOPASSWD: ALL
		
	(2) agent进程要允许执行远程命令; 
		]# vim /etc/zabbix/zabbix_agentd.conf,设置如下配置:
		EnableRemoteCommands=1
		
		重启服务生效;
  • 总结:
host groups --> host --> application --> item (key) --> trigger --> action
	
	(1) media type
	(2) user group/user

action operations: 可定义为升级方式;
	send message 
	remote command

Zabbix告警消息通过qq邮件发送

  • 情形
zabbix_server (Zabbix) 3.4.11
zabbix_agentd (daemon) (Zabbix) 3.4.11
--------------------------
Zabbix_server 192.168.1.18
Zabbix_agent 192.168.1.28    

Zabbix-server配置

  • 安装相关的邮件服务,当然qq号不会是自己的啦
$ yum install -y mailx dos2unix
$ vim /etc/mail.rc
set from=932165012@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=932165012@qq.com
set smtp-auth-password=************   #此次password是授权码,而不是登录密码,自行谷歌解决。
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb
  • 测试邮件服务是否可用,收到邮件即可认为成功
$ echo "zabbix test mail" |mail -s "zabbix" 932165012@qq.com
  • 编写bash脚本,/usr/lib/zabbix/alertscripts/mail.sh,Zabbix的配置文件定义此文件为脚本文件目录。
$ vim /usr/lib/zabbix/alertscripts/mail.sh
#!/bin/bash
to=$1
subject=$2
body=$3
#三个参数对应是收件人,主题,邮件主体内容

date "+%F %T" >> /usr/lib/zabbix/alertscripts/sendmail.log
echo "$to" "$subject" "$body"  >> /usr/lib/zabbix/alertscripts/sendmail.log
#记录发件日志

echo "$body" | dos2unix -k | mail -s "$subject" "$to"
#发邮件的命令,dos2unix转码发送。防止乱码
$ chmod +x /usr/lib/zabbix/alertscripts/mail.sh

web界面进行配置

主机相关配置

  • hosts配置
Host name   	node01.fenghong.tech
Visible name   	node01
Groups
	My Servers	
Agent interfaces
	IP address		DNS name	Connect to		  Port	 Default
	192.168.1.28 							     10050
#Groups随便从列表里选一个,我选的是my servers。
#主要是主机名,别名和Agent的IP配置,当然如果有DNS解析,填写主机名也是没有问题的
#点击Add添加即可
  • applications
Configuration-----> node01 -----> Applications ------> Create Application
	name    nginx status
  • items
Configuration-----> node01 -----> items -----> Create item 
	Name				Nginx service state
	Type				Zabbix agent			#系统默认
	Key					net.tcp.port[192.168.1.28,80]
	Host interface 		 192.168.1.28:10050		#系统默认
	Type of information   Numeric(unsigned)		#系统默认
	Update interval		 5s
	Applications 		 nginx status   #刚创建的
  • trigger配置
Configuration-----> node01 -----> triggers -----> create trigger
	Name		nginx down
	Severity	High
	Exprssion	-----> add
		Last of(T)   3   Count #下拉选择Count
		insert
	
	#配置完成Add		

报警动作配置

  • Meida types配置
Administration-----> Media types ------> create media type

Name  QqMailAlarm  		#名字随便写
Type  Script       		#选择Script
Script name  mail.sh	#填写为上面编写的脚本文件
Script parameters    Parameter						Action
					{ALERT.SENDTO}
					{ALERT.SUBJECT}
					{ALERT.MESSAGE}
#这三个宏变量顺序不能错,然后点击Add即可
  • 用户配置
Administration-----> Users -----> Admin -----> Media -----> Add

Type 			QqMailAlarm 	 	#Media Type 的名称,下拉选项
Send to  		932165012@qq.com	 #填写发送至相应的qq邮箱
When active 	1-7,00:00-24:00		 #发送的时间
Use if severity						#级别,建议根据人员的级别而发送不同的通知,默认全部勾选
	Not classified
	Information
	Warning
	Average
	High
	Disaster
	Enabled
# 配置好后,点击添加Add完成用户的配置。
  • 配置action,默认已经配置好trigger和hosts。比如
Configuration -----> Actions -----> create action -----> Action
Name	nginx sevice    #选择一个名字,这里用nginx服务来检测
Conditions	 Label		Name							Action
			A		Trigger = node01: nginx down		 Remove
#node01 为配置好的hosts
#nginx down 为配置好的trigger
#选择Trigger,点击select即可选择配置好的trigger
New condition
	Add
Enabled

-----> Operations
Default operation step duration   	  60s	#选择60s为了方便检测是否发送了邮件
Default subject			Problem: {TRIGGER.NAME}   #默认即可
Default message
		Problem started at {EVENT.TIME} on {EVENT.DATE}
		Problem name: {TRIGGER.NAME}
		Host: {HOST.NAME}
		Severity: {TRIGGER.SEVERITY}
		Original problem ID: {EVENT.ID}
		{TRIGGER.URL}
----> 点击Operation New,来进行配置动作。
	Send to Users	然后Add选择Admin
	Send only to    下拉选择QqMailAlarm  

#然后点击最下面的Add,添加Action
#至此,基本结束。
  • 验证告警信息是否成功自动发送邮件,停止node01上的nginx服务,能立马收到邮件。
$ systemctl stop nginx
  • 当然,Zabbix也支持远程的脚本命令来进行某些操作,比如重启nginx服务,这里面又涉及Remote command,这里不赘述了。
上一篇
Redis

文章推荐