zabbix/Zabbix.md

65 KiB
Raw Permalink Blame History

Zabbix

image-20231114170009801

proxy

zabbix面试问题

1.你用过哪些监控软件? 2.zabbix和nagios的区别 3.zabbix和nagios、cacti、ganglia有什么区别 4.zabbix的好处 5.zabbix的监控流程 6.常见监控项 7.zabbix优化 架构优化 分布式监控 主动模式 被动模式

8.zabbix和prometheus的区别

zabbix和nagios区别

1.nagios图形不是特别好也可以安装图形插件但是也不怎么好看
2.nagios一般情况下如果需要图形可以和cacti配合使用
3.cacti的监控是轮询监控,效率低图形相对nagios比较好看
4.zabbix和nagios因为是并发监控对cpu的要求更高
5.zabbix在性能和功能上都强大很多
6.zabbix的图形相当漂亮
7.支持多种监控方式 zabbix-agent  snmp 等等
8.支持分布式监控,能监控的agent非常多
9.zabbix有图形的web配置界面配置简洁
10.zabbix支持自动发现功能

zabbix分布式监控 监控中心zabbix-server | ------------------------------ | | ---proxy--- ---proxy--- | | | | agent agent agent agent

监控基本介绍

   MRTG使用 SNMP 协议获取主机 CPU、内存、磁盘、网卡流量等数据.
    用脚本将获取到的 SNMP 数据存入数据库中,然后再使用一种名为 MRTG 的软件根据获取的数据绘制图表来分析数据的变化。MRTG(Multi Router Traffic Grapher),顾名思义,这款软件最初是设计用于监控网络链路流量负载的。它可以用过 SNMP 获取到设备的流量信息,并根据这些信息绘制成图表并保存为 PNG 格式的图片,再将这些 PNG 图片以HTML 页面的方式显示给用户.
	不过,MRTG 展示的页面和图表曲线相对简陋,它在一张图片中最多只能绘制两个数据的变化曲线,并且由于是 PNG 格式的静态图片,所以无法针对某一时间进行细化展示。为了解决这个问题,人们又开发了 RRDTOOL 工具.直接使用 RRDTOOL 绘图操作起来很麻烦。同时,现如今的数据中心动辄成百上千的设备,一个个的去提取、绘制、监控显然是不现实的事情.

   Cacti是一套基于 PHP、MySQL、SNMP 及 RRDTool 开发的监测图形分析工具,Cacti 是使用轮询的方式由主服务器向设备发送数据请求来获取设备上状态数据信息的,如果设备不断增多,这个轮询的过程就非常的耗时,轮询的结果就不能即时的反应设备的状态了。Cacti 监控关注的是对数据的展示,却不关注数据异常后的反馈。如果凌晨 3 点的时候设备的某个数据出现异常,除非监控人员在屏幕前发现这个异常变化,否则是没有任何报警机制能够让我们道出现了异常。

   Nagios是一款开源的免费网络监控报警服务,能有效监控 Windows、Linux 和 Unix 的主机状态,交换机、路由器和防火墙等网络设置,打印机、网络投影、网络摄像等设备。在系统或服务状态异常时发出邮件或短信报警第一时间通知运维人员,在状态恢复后发出正常的邮件或短信通知。Nagios 有完善的插件功能,可以方便的根据应用服务扩展功能。
Nagios 已经可以支持由数万台服务器或上千台网络设备组成的云技术平台的监控,它可以充分发挥自动化运维技术特点在设备和人力资源减少成本。只是 Nagios 无法将多个相同应用集群的数据集合起来,也不能监控到集群中特殊节点的迁移和恢复。

   Ganglia是UC Berkeley 发起的一个开源集群监视项目,设计用于测量数以千计的节点。Ganglia 的核心包含 gmond、gmetad 以及一个 Web 前端。主要是用来监控系统性能,如:CPU 、内存、硬盘利用率, I/O 负载、网络流量情况等,通过曲线很容易见到每个节点的工作状态,对合理调整、分配系统资源,提高系统整体性能起到重要作用,目前是监控HADOOP 的官方推荐服务。

Zabbix介绍

Zabbix 是由Alexei Vladishev创建目前由Zabbix SIA在持续开发和支持。  Zabbix 是一个基于 WEB 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案zabbix 能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。允许用户为几乎任何事件配置基于邮件的告警。这样可以快速反馈服务器的问题。基于已存储的数据Zabbix提供了出色的报告和数据可视化功能。这些功能使得Zabbix成为容量规划的理想方案。 
Zabbix支持主动轮询和被动捕获。Zabbix所有的报告、统计信息和配置参数都可以通过基于Web的前端页面进行访问。基于Web的前端页面可以确保您从任何方面评估您的网络状态和服务器的健康性。适当的配置后Zabbix可以在IT基础架构监控方面扮演重要的角色。对于只有少量服务器的小型组织和拥有大量服务器的大型公司也同样如此。 
Zabbix是免费的。Zabbix是根据GPL通用公共许可证第2版编写和发行的。这意味着它的源代码都是免费发行的可供公众任意使用。 
[商业支持](http://www.zabbix.com/support.php) 由Zabbix公司提供。 

优点

开源,无软件成本投入
对设备性能要求低
支持设备多,自带多种监控模板
支持分布式集中管理,有自动发现功能,可以实现自动化监控
开放式接口,扩展性强,插件编写容易
当监控的 item 比较多服务器队列比较大时可以采用被动状态,被监控客户端主动 从server 端去下载需要监控的 item 然后取数据上传到 server 端。 这种方式对服务器的负载比较小。
Api 的支持,方便与其他系统结合

缺点

需在被监控主机上安装 agent,所有数据都存在数据库里, 产生的数据据很大,瓶颈主要在数据库。

Zabbix 系统监控对象

数据库:   MySQL,MariaDB,Oracle,SQL ServerDB2
应用软件Nginx,Apache,PHP,Tomcat                    agent
----------------------------------------------------------------------------------------

集群:      LVS,Keepalived,HAproxy,RHCS,F5
虚拟化:   VMware,KVM,XEN                            agent
操作系统Linux,Unix,Windows性能参数
----------------------------------------------------------------------------------------

硬件: 服务器,存储,网络设备                            IPMI
网络: 网络环境(内网环境,外网环境)                     SNMP
----------------------------------------------------------------------------------------

Zabbix架构

image-20220224101700174

Zabbix由如下几个主要的软件组件构成

Server

Zabbix server 是agent程序报告系统可用性、系统完整性和统计数据的核心组件是所有配置信息、统计信息和操作数据的核心存储器。

数据库存储

所有配置信息和Zabbix收集到的数据都被存储在数据库中。 

Web界面

为了从任何地方和任何平台都可以轻松的访问Zabbix, 我们提供基于Web的Zabbix界面。该界面是Zabbix Server的一部分通常(但不一定)跟Zabbix Server运行在同一台物理机器上。 
如果使用SQLite,Zabbix Web界面必须要跟Zabbix Server运行在同一台物理机器上。

Proxy代理服务器

Zabbix proxy 可以替Zabbix Server收集性能和可用性数据。Proxy代理服务器是Zabbix软件可选择部署的一部分当然Proxy代理服务器可以帮助单台Zabbix Server分担负载压力。

Agent监控代理

Zabbix agents监控代理 部署在监控目标上能够主动监控本地资源和应用程序并将收集到的数据报告给Zabbix Server。 

数据流

了解Zabbix内部的数据流同样很重要。
监控方面,为了创建一个监控项(item)用于采集数据必须先创建一个主机host。
告警方面在监控项里创建触发器trigger通过触发器trigger来触发告警动作action。 因此如果你想收到Server XCPU负载过高的告警你必须: 
1. 为Server X创建一个host并关联一个用于对CPU进行监控的监控项Item。 
2. 创建一个Trigger设置成当CPU负载过高时会触发 
3. Trigger被触发发送告警邮件 
虽然看起来有很多步骤但是使用模板的话操作起来其实很简单Zabbix这样的设计使得配置机制非常灵活易用。

Zabbix常用术语的含义

主机 (host)

一台你想监控的网络设备用IP或域名表示 

主机组 (host group)

主机的逻辑组;它包含主机和模板。一个主机组里的主机和模板之间并没有任何直接的关联。通常在给不同用户组的主机分配权限时候使用主机组。

监控项 (item)

你想要接收的主机的特定数据,一个度量数据。 

触发器 (trigger)

一个被用于定义问题阈值和“评估”监控项接收到的数据的逻辑表达式 
当接收到的数据高于阈值时触发器从“OK”变成“Problem”状态。当接收到的数据低于阈值时触发器保留/返回一个“OK”的状态。 

事件 (event)

单次发生的需要注意的事情,例如触发器状态改变或发现有监控代理自动注册 

异常 (problem)

一个处在“异常”状态的触发器 

动作 (action)

一个对事件做出反应的预定义的操作。 
一个动作由操作(例如发出通知)和条件(当时操作正在发生)组成 

升级 (escalation)

一个在动作内执行操作的自定义场景; 发送通知/执行远程命令的序列 

媒介 (media)

发送告警通知的手段;告警通知的途径 

通知 (notification)

利用已选择的媒体途径把跟事件相关的信息发送给用户 

远程命令 (remote command)

一个预定义好的,满足一些条件的情况下,可以在被监控主机上自动执行的命令

模版 (template)

一组可以被应用到一个或多个主机上的实体监控项触发器图形聚合图形应用LLDWeb场景的集合 
 模版的任务就是加快对主机监控任务的实施;也可以使监控任务的批量修改更简单。模版是直接关联到每台单独的主机上。 

应用 (application)

一组监控项组成的逻辑分组

web 场景 (web scenario)

利用一个或多个HTTP请求来检查网站的可用性
一年当中服务的可用时间和整年时间的一个百分比 99.9999 

前端 (frontend)

Zabbix提供的web界面 GUI

Zabbix API

Zabbix API允许你使用JSON RPC协议来创建、更新和获取Zabbix对象如主机、监控项、图形和其他信息或者执行任何其他的自定义的任务 
grafana

Zabbix server

Zabbix软件实现监控的核心程序主要功能是与Zabbix proxies和Agents进行交互、触发器计算、发送告警通知并将数据集中保存等 

Zabbix agent

一个部署在监控对象上的,能够主动监控本地资源和应用的程序 
Zabbix agent部署在监控的目标上主动监测本地的资源和应用(硬件驱动,内存,处理器统计等)。 
Zabbix agent收集本地的操作信息并将数据报告给Zabbix server用于进一步处理。一旦出现异常 (比如硬盘空间已满或者有崩溃的服务进程), Zabbix server会主动警告管理员指定机器上的异常。. Zabbix agents 的极端高效缘于它可以利用本地系统调用来完成统计数据的收集。

被动passive和主动active检查(面试题)

Zabbix agents可以执行被动和主动两种检查方式。 
passive check 模式中agent应答数据请求,Zabbix server(或者proxy)询问agent数据,CPU负载情况,然后Zabbix agent回送结果。 
Active checks 处理过程将相对复杂。 Agent必须首先从Zabbix sever索取监控项列表以进行独立处理,然后周期性地发送新值给server 
执行被动或主动检查是通过选择相应的监测项目类型来配置的。item type. Zabbix agent处理监控项类型有'Zabbix agent''Zabbix agent (active)' 

Zabbix proxy

一个帮助Zabbix Server收集数据分担Zabbix Server的负载的程序 
Zabbix Proxy是一个可以从一个或多个受监控设备收集监控数据并将信息发送到Zabbix sever的进程基本上是代表sever工作的。 所有收集的数据都在本地进行缓存然后传送到proxy所属的Zabbix sever。 
部署Proxy是可选的但是可能非常有益于分散单个Zabbix sever的负载。 如果只有proxy收集数据sever上的进程就会减少CPU消耗和磁盘I/O负载。 
Zabbix proxy是完成远程区域、分支机构、没有本地管理员的网络的集中监控的理想解决方案。 
Zabbix proxy需要使用独立的数据库。 

Zabbix安装

Server端安装配置

1.Install and configure Zabbix server

a.Install Repository with MySQL database

# rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabbix-release-6.0-2.el8.noarch.rpm

b. Install Zabbix server, frontend, agent

# yum install zabbix-server-mysql zabbix-web-mysql zabbix-agent -y

c. Create initial database

# yum install mariadb mariadb-server -y
# systemctl start mariadb

# mysql -uroot -p 
password
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> grant all privileges on zabbix.* to zabbix@localhost identified by 'password';
mysql> flush privileges;
mysql> quit;              

Import initial schema and data. You will be prompted to enter your newly created password.

# zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p -D zabbix   

d. Configure the database for Zabbix server

# vim /etc/zabbix/zabbix_server.conf
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=password

# cd /usr/share/zabbix/conf
# ls
zabbix.conf.php
# cp zabbix.conf.php.example zabbix.conf.php
# vim zabbix.conf.php   //修改数据库密码
$DB['PASSWORD'] = 'qianfeng';

e. Start Zabbix server and agent processes

Start Zabbix server and agent processes and make it start at system boot:
# systemctl start  zabbix-server zabbix-agent httpd
# systemctl enable zabbix-server zabbix-agent httpd

f. Configure PHP for Zabbix frontend

Apache configuration file for Zabbix frontend is located in  /etc/httpd/conf.d/zabbix.conf. Some PHP settings are already configured.  But it's necessary to uncomment the “date.timezone” setting and set the  right timezone for you.
# vim /etc/httpd/conf.d/zabbix.conf
    php_value max_execution_time 300
    php_value memory_limit 128M
    php_value post_max_size 16M
    php_value upload_max_filesize 2M
    php_value max_input_time 300
    php_value always_populate_raw_post_data -1
    # php_value date.timezone Europe/Riga
	php_value date.timezone Asia/Shanghai  #修改时区

# systemctl restart httpd
Now your Zabbix server is up and running!

Configure Zabbix frontend Connect to your newly installed Zabbix frontend: http://server_ip_or_name/zabbix

Follow steps described in Zabbix documentaion: Installing frontend

输入用户名 Admin 以及密码 zabbix 以作为Zabbix超级用户登陆。

Start using Zabbix See Quickstart guide

如果数据库为mysql8.0 ,配置前端如果报错

连接不上数据库提示The server requested authentication method unknown to the client.

解决:修改认证插件

# mysql -uroot - p
mysql> use mysql;
mysql> alter user zabbix@localhost identified with mysql_native_password by 'password';
mysql> flush privileges;

Agent端安装配置

[root@web1 ~]# yum -y install zabbix-agent -y
[root@web1 ~]# vim /etc/zabbix/zabbix_agentd.conf
Server=192.168.122.206,192.168.122.207          #被动模式 zabbix-server-ip
ServerActive=192.168.122.206,192.168.122.207    #主动模式 zabbix-server-ip
Hostname=web1                                   #客户端主机名称
UnsafeUserParameters=1                          #是否限制用户自定义 keys 使用特殊字符

启动服务:
[root@web1 ~]# systemctl start zabbix-agent
[root@web1 ~]# systemctl enable zabbix-agent

[root@web1 ~]# ss -anlp |grep :10050

Zabbix使用

Zabbix数据流详解

Host Groups(设备组) ->Hosts(设备) ->Templates(模板){模板内有众多Applications应用集也就是监控项组}
->Items (监控项,添加监控项后可添加图形) ->Triggers(触发器,监控项可以选择性关联触发器)->Actions (告警动作)->Medias (告警方式)->User Groups(用户组)->Users(用户)

添加新的主机组

点击配置->主机组->创建主机组 在组名称中填入新的主机组名称,点击存档即可。

添加监控主机

点击配置->主机->创建主机,创建一台新的监控主机。 file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/1.png

**何为JMX**了解 JMXJava Management eXtensions即JAVA管理扩展是一套标准的代理和服务用来监视和管理JVM以及其运行的操作系统。 从JAVA 5开始JDK提供了一些JVM检测的API这就是有名的java.lang.management 包包里提供了下面9个MXBean ClassLoadingMXBean 用于 Java 虚拟机的类加载系统的管理接口。 CompilationMXBean 用于 Java 虚拟机的编译系统的管理接口。 GarbageCollectorMXBean 用于 Java 虚拟机的垃圾回收的管理接口。 MemoryManagerMXBean 内存管理器的管理接口。 MemoryMXBean Java 虚拟机的内存系统的管理接口。 MemoryPoolMXBean 内存池的管理接口。 OperatingSystemMXBean 用于操作系统的管理接口Java 虚拟机在此操作系统上运行。 RuntimeMXBean Java 虚拟机的运行时系统的管理接口。 ThreadMXBean Java 虚拟机线程系统的管理接口。

IPMI方式 了解

IPMI方式主要是用来监控服务器硬件的健康状态 服务器远程管理方面,典型的解决方案是基于服务器操作系统的软件管理方式,但这样的方式有一个致命的缺陷就在于对操作系统的依赖程度太高,一旦系统出现问题将无能为力 IPMI是智能型平台管理接口Intelligent Platform Management Interface的缩写是管理基于 Intel结构的企业系统中所使用的外围设备采用的一种工业标准,该标准由英特尔、惠普、NEC、美国戴尔电脑和SuperMicro等公司制定。用户可以利用IPMI监视服务器的物理健康特征,如温度、电压、风扇工作状态、电源状态等使用该种方式,用户无需担心操作系统的状态,即使系统崩溃也可以轻松得到机器状态、重要系统日志等信息,还能实现系统的重启、关机等控制。 IPMI的核心是一个专用芯片/控制器(叫做服务器处理器或基板管理控制器(BMC))其并不依赖于服务器的处理器、BIOS或操作系统来工作可谓非常地独立是一个单独在系统内运行的无代理管理子系统只要有BMC与IPMI固件其便可开始工作而BMC通常是一个安装在服务器主板上的独立的板卡服务器主板必须提供对IPMI的支持。IPMI良好的自治特性便克服了以往基于操作系统的管理方式所受的限制例如操作系统不响应或未加载的情况下其仍然可以进行开关机、信息提取等操作。

下图为IPMI板卡插在服务器主板上 file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/2.png

设置监控项

通过上图界面的模版标签,设置监控项这里的监控项都是zabbix自带的

添加新的监控项

项目(Item)指的是对于主机所监控的项目,例如监控 CPU 使用率、磁盘使用率、网卡流量等等。默认情况下,监控模版“Template OS Linux”所能监控的项目已经非常丰富了。我们也可以根据需要添加更多我们所需要的监控项目。

点击配置->主机可以列出当前所监控的主机及相关各项信息。如下图所示,我们对agent-19主机监控项目为83个。 file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/7.png 点击项目,然后在新的页面中点击创建项目,进入项目配置页面。 file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/8.png 注意!由于为了尽快获取到实验的演示效果,该监控项的更新间隔为 10 秒。在生产环境中,是不需要这么频繁的更新的!另外,不要忘记配置完成后点击存档,保存你的配置结果。 再回到项目页面,就可以看到新增了一个名为“web.server.online.monitor”的监控项目。

历史数据和趋势数据

历史数据和趋势数据是zabbix存储数据的两种方式它们都是以天数为单位的。

历史数据zabbix监控到的数据在数据库中保存的天数过去这个时间便会自动的被zabbix的管理机制删除所以强烈建议历史数据保存所允许的尽可能小的天数,这样是为了防止数据库负载太大的数据。可以用趋势数据来代替很长的历史数据。比如可以保存历史数据14天和趋势数据5年。

当保存很短的历史数据时,我们仍然可以查看老的数据在数据表中,因为数据表是用趋势数据列出老的数据。

趋势数据这是zabbix内置的历史数据还原机制它保存的是每小时收集到数据的最小值最大值和平均值以及每小时收集到值的总数。趋势数据设置的保留时间往往要比历史数据保留的时间长。

定义自定义key和监控脚本

不带参数的自定义key

1、定义key

agent端操作

# vim /etc/zabbix/zabbix_agentd.conf
UserParameter=diskfree,/etc/zabbix/scripts/diskfree.sh

# cat /etc/zabbix/scripts/diskfree.sh
echo `df  / | awk 'NR==2{print $4}'`/1024 |bc

# systemctl restart zabbix-agent

server端操作

利用zabbix_get命令测试key的可用性
# yum install zabbix-get -y
# zabbix_get -s 192.168.26.29 -p 10050 -k diskfree 
29363

2、调用key

image-20220224175919413

带参数的自定义key

1、定义key

agent端操作

# vim /etc/zabbix/zabbix_agentd.conf
UserParameter=diskfree[*],/etc/zabbix/scripts/diskfree.sh $1

# cat diskfree.sh 
if [ $1 == "swap" ];then
	free -m | awk 'NR==3{print $4}'
else
	echo `df  $1 | awk 'NR==2{print $4}'`/1024 |bc
fi

# systemctl restart zabbix-agent

2、调用key

image-20220225112114923

添加触发器

找到需要添加触发器的被监控主机

image-20220225110145046

点击创建触发器

image-20220225110230412

image-20220225110613367

关于上图中第3点的表达式,点击添加按钮

image-20220225111145649

添加新的监控图形

添加好新的监控项目后,并不会直接看到监控的信息。还需要在图形中增加该项目的图形输出Zabbix才会把监控图表绘制出来。首 先 , 我 们 先 为 单 台 主 机 增 加 “web.server.online.monitor”的监控图形。 点击配置->主机->图形-> 创 建 图 形 按 照 如 下 图 配 置 , 在 项目 一 栏 中 , 点 击 添 加 ,然 后 选 择“web.server.online.monitor”,配置好后,不要忘记存档。 file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/9.png 接下来,点击监控中->图形,选择对应的监控项就可以看到监控图形了。 默认情况下,将 Zabbix 显示语言设置为中文后,Zabbix 绘制图形中的文字会成为乱码,这是由于没有合适的中文字体而导致的。只需要将/usr/share/zabbix/fonts/graphfont.ttf 替换成合适的字体文件即可。 以上的配置是修改单台主机的图形输出。如果不想一台台机器的去设置,可以直接修改模版的图形输出配置就可以了。

添加到常用图形

监测--主机--图形--选择要添加的图形后,点击页面右上角的"五星图标",完成添加.

image-20220225115413915

添加维护期间

维护期间(Maintenance)指的是服务器定期维护的时间段。Zabbix 可以设置在这个时间段里不需报警。 点击配置->维护->创建维护时段 file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/20.png 以上页面配置项的含义为: 名称:该维护配置的名称。 维护类型:该时间段内是否需要采集数据,一般选择不采集。 作用中从/直到:该维护配置生效的时间范围。 file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/21.png 以上页面配置项的含义为: 期间类型:配置维护的时间是一次性的还是循环性的。可选一次性/每日/每周/每月。 日期/每日/每周/每月:设置执行维护的时间。 维护期间长度:维护的时间长度。 file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/22.png 以上页面配置项的含义为: 维护中主机:哪些主机在该维护期间进行维护。 维护中的组:哪些主机组在该维护期间进行维护。

报警事件确认

概述

以往服务器出现报警,运维人员处理完事之后,报警自动取消,但是下一次出现同样一个错误,但是换了一个运维人员,他可能需要重新排查问题,直到问题处理完毕。针对这种情况,zabbix提供了event acknowledgment事件确认功能一旦处理好某个问题运维人员可以再里面写上备注说明造成此问题的原因以及处理方法下一次运维人员遇到这个报警先看前一次的事件确认。 Acknowledgment也可以在action中使用一旦运维人员没有及时填写事件确认可以向他的主管或者经理发送一个通知xxx人员没有写事件确认.

事件确认界面

在zabbix首页的last 20 issues在每条报警列都有Ack如果是NO说明还没有对事件进行确认如果是Yes表明已经提交了事件描述.

公网邮箱邮件报警

邮件系统简要介绍 电子邮件系统包括两个组件MUA(Mail User Agent,邮件用户代理和MTA(Mail Transport Agent,邮件传送代理 postfixMUA是邮件系统为用户提供的可以读写邮件的界面而MTA是运行在底层能够处理邮件的收发工作的程序。简单的说用户可以 使用MUA写信、读信、而通过MTA收信、发信。Foxmail、Outlook、Webmail都属于MUA。 邮件的接收是MTA和MUA配合完成的。远程的MUA首先向远程MTA连接并验证发信人身份然后由远程MTA向本地MTA发送邮件。接受者通过本 地MUA接收阅读邮件。邮件的发信也是MTA和MUA配合完成的不过方向正好相反。本地MUA首先向本地的MTA连接并验证发信人身份然后由本地 MTA向远程MTA发送邮件再由远程的MUA读取邮件。 mail和mailx即为负责查看、编写邮件和向MTA发送邮件的MUA。mailx是mail的功能加强版。 sendmail即为负责邮件在网络上传输的MTA将邮件从一个MTA传送至另一个MTA。

扩展了解邮件服务架构里面也有agent代理 现在已经很少公司内部自己部署 postfix 邮局(MTA)------邮递员(smtp 25)------邮局(MTA) | | MDA maildrop dovecote MDA | | 邮递员(smtp 25) 邮递员(pop3 110 imap4 143) | dns | 邮筒(MUA) 邮筒(MUA) | | lilei(user1) hanmeimei(user2)

agent 代理

开干 1.注册163邮箱 2.登陆网页邮箱设置客户端授权密码 file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/1.png file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/2.png

file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/3.png file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/4.png

Centos-stream9之前的版本使用mailx作为发邮件工具

安装MUA软件mailx

# yum install mailx  -y
# mail -V
12.5 7/5/10

# mailx -V
12.5 7/5/10

配置公网邮箱信息

# vim /etc/mail.rc   追加 以下内容
set from=18612540627@163.com邮箱地址 
set smtp=smtp.163.comsmtp服务器 
set smtp-auth-user=18612540627@163.com(用户名) 
set smtp-auth-password=yanqiang20182018邮箱密码-这里是授权码) 
set smtp-auth=login

使用mailx发邮件的方式

方式1mailx -s "邮件标题" 收件箱Email < 包含正文的文件
方式2cat 包含正文的文件 | mailx -s "邮件标题" 收件箱Email
方式3echo "正文内容" | mailx -s "邮件标题" 收件箱Email
方式4mailx -s "邮件标题" 收件箱Email回车按CTRL+D发送

手动发送邮件测试:

# mailx -v -s 'hello' '收件人@163.com'
手写邮件内容 回车然后ctrl+d正常结束)
EOT 

 Resolving host smtp.163.com … done. 
 Connecting to 123.125.50.135:smtp … connected. 
 220 163.com Anti-spam GT for Coremail System (163com[20141201])
   EHLO localhost 
   250-mail 
   250-PIPELINING 
   250-AUTH LOGIN PLAIN 
   250-AUTH=LOGIN PLAIN 
   250-coremail 1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UFHbOaIUCa0xDrUUUUj 
   250-STARTTLS 
   250 8BITMIME 
   AUTH LOGIN 
   334 dXNlcm5hbWU6 
    emhpZ3VvbGl1MTFAMTYzLmNvbQ== 
   334 UGFzc3dvcmQ6 
   bHpnODY3MTM1NzM5 
   235 Authentication successful 
   MAIL FROM:18612540627[@163.com](http://mailto:lisi@163.com) 
   250 Mail OK 
   RCPT TO:18612540627[@163.com](http://mailto:zhangsan@163.com) 
   250 Mail OK 
   DATA 
   354 End data with . 
   . 
   250 Mail OK queued as smtp5,D9GowAAnNd6vschZY_bxAA.277S2 1506324911 
   QUIT 
   221 Bye

或者将邮件内容放到一个文件中content.txt

# cat content.txt | mailx -v -s hello zhangsan@163.com

手动使用mailx发送邮件测试结果 file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/5.png

Centos-stream9之后更新了系统发送邮件的软件和命令

安装软件

# yum install s-nail -y

配置发件服务器和账户

# vim /etc/s-nail.rc   //追加以下5行内容

set from=276267003@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=276267003@qq.com
set smtp-auth-password=czvwopjypcmacbdb
set smtp-auth=login

发送邮件测试

echo "this is test" | s-nail -s "s-nail test email" 276267003@qq.com

发送邮件脚本内容/usr/lib/zabbix/alertscripts

#!/bin/sh 
#export.UTF-8
echo "$3" | sed s/'\r'//g | s-nail -s "$2" $1

其他步骤一样

zabbix添加邮件报警功能 注:使用新的方式--利用公网邮件服务器发送报警需要关闭postfix服务

配置 zabbix 的邮件报警功能需要以下三个角色的参与。 1、 示警媒体(Media) 2、 触发器(Triggers) 可以直接使用前面配置的触发器 3、 动作(Action)

示警媒体: 指的是 zabbix 采用何种方式进行报警,目前 Zabbix 支持的示警媒体包括邮件、Jabber、短信。jabber是linux下一种即时通讯工具,可以和yahoo,icq等工具通信

触发器: 指的是当监控对象达到某个条件或条件集合的时候,触发 Zabbix 产生事件。

动作: 指的是 Zabbix 产生对应事件后,它通过示警媒体发送报警。

接下来,我们配置一个邮件报警功能的范例。效果是当 WEB 页面获取时间超过 3 秒,则触发报警,管理员将会收到一封 Zabbix 发出的报警邮件。

示警媒体的配置 首先需要配置 Zabbix 的邮件功能。 点击 管理->报警媒介类型->创建媒体类型 image-20220225152214569

然后在页面中填入你的报警媒介类型信息,例如下图所示: 注:脚本名称任意,存放于/usr/lib/zabbix/alertscripts (生产上的测试服放这:/usr/local/zabbix/share/zabbix/alertscripts

名称sendmail //名称任意 类型:脚本 脚本名称sendmail.sh 脚本参数: //一定要写,否则可能发送不成功 {ALERT.SENDTO} //照填,收件人变量 {ALERT.SUBJECT} //照填,邮件主题变量,变量值来源于‘动作’中的‘默认接收人’ {ALERT.MESSAGE} //照填,邮件正文变量,变量值来源于‘动作’中的‘默认信息’
配置完成后,不要忘记点击存档,保存你的配置。
file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/7.png

zabbix5.0 可以在此界面设置message template

file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/8.png

修改zabbix服务端配置文件编写脚本

指定脚本的存储路径:
# vim /etc/zabbix/zabbix_server.conf
AlertScriptsPath=/usr/lib/zabbix/alertscripts

编写邮件脚本

# cd /usr/lib/zabbix/alertscripts
# vim sendmail.sh    
 #!/bin/sh 
 #export.UTF-8
 echo "$3" | sed s/'\r'//g | mailx -s "$2" $1

修改权限

# chmod u+x sendmail.sh && chown zabbix.zabbix sendmail.sh 

修改admin用户的报警媒介 用户默认是没有设置报警媒介的,设置后就可以接收报警消息了。 file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/9.png
接下来,设置接受报警用户的电子邮件。 点击:管理->报警媒介类型->Admin->报警媒介->添加 file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/10.png

触发器的配置: 接下来,点击配置->主机 我们给 agent-19 这台主机增加一个触发器。点击 agent-19 这一行中的“触发器”,然后再点击创建触发器。 该页各配置项含义如下: 名称:填入触发器的名字 表达式:用于配置触发器的触发条件,点击添加按钮有条件选项。 多重事件产生:如果选中,则问题如果持续多重的发生则每次都触发,否则只触发一次 点击表达式右侧的添加按钮: file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/11.png 再点击项目右侧的选择,选择我们之前配置过的“web.server.online.monitor”,并设置触发的阀值,如下图所示 image-20220225164708909

Zabbix 会自动生成表达式。接下来根据情况选择事件的严重性。配置完毕后,点击存档保存。 file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/13.png

动作的配置 点击:配置->动作->事件源下拉菜单中选择触发器->创建动作 可以在内容中使用 Zabbix 内置宏,邮件发出时会自动将宏替换成对应的值。

名称: 任意写

默认接收人: 故障级别:{TRIGGER.STATUS}。服务器:【{HOSTNAME1} 】 发生:{TRIGGER.NAME} 故障! 注:默认接收人:相当于邮件的主题

默认信息:邮件的主题 告警主机:{HOSTNAME1} 告警时间:{EVENT.DATE} {EVENT.TIME} 告警等级:{TRIGGER.SEVERITY} 告警信息:{TRIGGER.NAME} 告警项目:{TRIGGER.KEY1} 问题详情:{ITEM.NAME}{ITEM.VALUE} 当前状态:{TRIGGER.STATUS}{ITEM.VALUE1} 事件ID{EVENT.ID}

恢复邮件: 恢复主题: 服务器:【{HOSTNAME1}】故障已恢复。故障原因:{TRIGGER.NAME} 恢复信息:恢复邮件的正文。当故障恢复正常后也发邮件通知一下。

确认操作:
file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/14.png

点击:操作->编辑:

file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/15.png 发送间隔60秒 步骤发送10次发送到admin用户 仅使用sendmail方式发送

file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/16.png 需要特别解释一下的是“步骤”部分的配置。所谓步骤是指报警可以有多个步骤,做不同的报警。例如,自从 1 到 3,就是指报警的步骤有三个。步骤持续时间就是一定时间后如果监控人员仍未响应报警就进入下一个报警步骤。 例如,发邮件给你报警,如果60 秒后你没响应,那就发 jabber 信息提醒你。如果 60 秒后还没响应,那就发短信给你。要是还没响应,就没有然后了。你可以形象的把它理解为 Zabbix 的一哭二闹三上吊。 到此,一个邮件报警功能就配置完毕了。如果你想立即看到结果,可以修改触发器的条件,将条件的阀值设置为 N>0.0003。你马上就会收到 Zabbix 发来的报警邮件了。

file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/17.png
file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/18.png

远程执行脚本

1.创建报警媒介关联脚本,脚本不需要参数

测试报警媒介失败报错host key verifify faild

解决修改zabbix_server.conf把如下参数的值修改成1

AllowRoot=1

2.修改用户关联报警媒介

3.邮件报警基础上动作内添加步骤

[root@zabbixserver alertscripts]# pwd
/usr/lib/zabbix/alertscripts
[root@zabbixserver alertscripts]# ls
mail.sh  test.sh  wechat.py
[root@zabbixserver alertscripts]# cat test.sh 
ssh web1 'echo hello ce shi >> /tmp/hello'

image-20240514114145502

image-20240514113935579

image-20240514114009853

微信应用报警(已失效)

下面所有准备操作是为了获取下面4个信息

应用:报警机器人
     AgentId1000002
     SecretrIrN51FEjgW6T2bdmSaEoOIB5UbaBTgddQkuC8cca1w

企业CorpIDwwa1da242f211cdf47
 
部门:  运维部
部门ID2

大部分操作在PC端后台完成手机端不行 1.下载企业微信 2.注册企业 3.创建自己的应用 4.添加员工(可以不添加) 5.添加管理组 6.添加部门 7.测试企业微信接口调试工具

file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/1.png file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/2.png file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/3.png file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/4.png file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/5.png file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/6.png

API文档->企业内部开发 查看文档->工具与资源 file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/7.png file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/8.png

建立连接获取AccessToken 请求地址: https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=wwa1da242f211cdf47&corpsecret=rIrN51FEjgW6T2bdmSaEoN8s_mMW-Nu7gHysmagfdXc 返回结果:

HTTP/1.1 200 OK
Connection: keep-alive
Error-Code: 0
Error-Msg: ok
Content-Type: application/json; charset=UTF-8
Content-Length: 277 {"errcode":0,"errmsg":"ok","access_token":"9O7DSEqnUsQ8MD2bRGfFs26cabY1XcGErPnnJF_mfBBnI5zsM2I3u9-9Sj0tAzW2TOuC27zHHUxaVH8dYRDneqqocmhRiGXP4zTkkg_GzqwPiVLZMAZzSKKFAD6x2nOKMNG1QBiBOkRz6KL04SB5xGyEnjL2iYzKY4Z-ggY6BahOByGZvzDNaFoJj3YTp5blSPkm9exizerPUpDZNiGXtw","expires_in":7200} 

上面测试好之后可以配置监控脚本了 ==这里是额外的东西=================== 函数(){ 如果过滤到关键字,那么就 内容=获取过滤到的日志内容 执行wechat.py 收件人信息 标题 $内容 返回1 } file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/9.png

=================

python监控脚本 有4个地方需要修改找到他们修改成之前获取的信息

self.__corpid = 'wwa1da242f211cdf47'   //公司的corpid

self.__secret = 'rIrN51FEjgW6T2bdmSaEoOIB5UbaBTgddQkuC8cca1w' //应用的secret

'toparty':2,         //部门id

'agentid':"1000002",    //应用id
[root@ansible alertscripts]# cat wechat.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 此脚本暂时只适用于Python2,在centos8上安装python2即可
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])

修改权限:

[root@ansible alertscripts]# chown zabbix.zabbix /usr/lib/zabbix/alertscripts/wechat.py && chmod 777 /usr/lib/zabbix/alertscripts/wechat.py

测试脚本下面的invalidparty可以忽略 ,如果正常会收到消息如下图

[root@ansible alertscripts]# ./wechat.py wusong test test
{u'invalidparty': u'2', u'invaliduser': u'wusong', u'errcode': 0, u'errmsg': u'ok'}

[root@ansible alertscripts]# ./wechat.py YanQiang test test
{u'invalidparty': u'2', u'invaliduser': u'', u'errcode': 0, u'errmsg': u'ok'}

file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/10.png

zabbix配置微信报警 创建报警媒介: 管理->报警媒介类型->创建媒体类型 file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/11.png

zabbix 3.0 需要在为alert脚本定义参数以前的版本参数都固定的现在用户可以自己定义命令行的参数了。添加的参数也就是脚本中的$1、$2、$3等。

file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/12.png

添加完成后需要关联到报警用户Administration-->Users-->Media-->add 配置收件人:

注意填写的收件人是企业微信内的员工帐号比如下面童鞋的帐号为Tigerfive file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/13.png file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/14.png file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/15.png

添加动作,触发条件后报警后发送微信消息。 Configuration-->Actions-Event source(Triggers)-Create action file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/16.png

file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/17.png

恢复操作和确认操作都可以配置,同上

file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/18.png

微信报警报错处理

报错信息: [root@zabbix-server alertscripts]# ./wechat.py YanQiang test yingwen Traceback (most recent call last): File "./wechat.py", line 84, in a.sendMessage(sys.argv[1],sys.argv[3]) File "./wechat.py", line 66, in sendMessage self.authID() File "./wechat.py", line 25, in authID content = self.getToken(data) File "./wechat.py", line 42, in getToken result = urllib2.urlopen(response) File "/usr/lib64/python2.7/urllib2.py", line 154, in urlopen return opener.open(url, data, timeout) File "/usr/lib64/python2.7/urllib2.py", line 431, in open response = self._open(req, data) File "/usr/lib64/python2.7/urllib2.py", line 449, in _open '_open', req) File "/usr/lib64/python2.7/urllib2.py", line 409, in _call_chain result = func(*args) File "/usr/lib64/python2.7/urllib2.py", line 1258, in https_open context=self._context, check_hostname=self._check_hostname) File "/usr/lib64/python2.7/urllib2.py", line 1214, in do_open raise URLError(err) urllib2.URLError: <urlopen error [Errno -2] Name or service not known>

公司dns不允许访问QQ修改dns服务器 [root@zabbix-server alertscripts]# cat /etc/resolv.conf # Generated by NetworkManager nameserver 101.198.198.198

测试成功: [root@zabbix-server alertscripts]# ./wechat.py YanQiang test yingwen {u'invalidparty': u'2', u'invaliduser': u'', u'errcode': 0, u'errmsg': u'ok'}

微信群聊机器人报警

1.下载安装企业微信并注册账号创建自己的企业 2.创建群聊添加2个成员 3.在群聊内创建一个机器人并记录其webhook地址 https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=a0f1bd92-ad41-4130-b5ea-dbfb1507f1e1

4.创建脚本(python3)

# yum install python3-requests -y
# cd /usr/lib/zabbix/alertscripts
# ls
dingding.py  mail.sh  wechat.py

# vim dingding.py
#!/usr/bin/python
import requests
import json
import sys
import os

headers = {'Content-Type': 'application/json;charset=utf-8'}
api_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=a0f1bd92-ad41-4130-b5ea-dbfb1507f1e1
" #这就是先前的webhook地址
def msg(text):
    json_text= {
     "msgtype": "text",
        "text": {
            "content": text
        },
    }
    print(requests.post(api_url,json.dumps(json_text),headers=headers).content)

if __name__ == '__main__':
    text = sys.argv[1]
    msg(text)

5.修改权限测试脚本发送信息

# chmod +x wechat.py
# chown zabbix.zabbix wechat.py

测试:查看机器人收发消息
# ./wechat.py  "hello"
b'{"errcode":0,"errmsg":"ok"}'

6.添加触发器、创建报警媒介(只需要一个参数{ALERT.MESSAGE},收件人写群名即可配置admin用户关联报警媒介创建动作测试结果

钉钉群聊机器人报警

准备工作

1、安装钉钉注册钉钉账号。
2、创建一个群聊把需要得到监控信息的人加到一起.
3、在钉钉上面添加一个机器人.

创建机器人

进入群聊-->群设置-->智能群助手-->添加机器人-->

image-20220705094947856

image-20220705095037276

image-20200922225527472

image-20220705170018181

image-20200922230226633

image-20220705095333158

创建python脚本

zabbix-server机器上操作

[root@zabbix-server ~]# yum install python2-requests python3-requests -y
[root@zabbix-server ~]# cd /usr/lib/zabbix/alertscripts/
[root@zabbix-server alertscripts]# vim dingding.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
# 本脚本适用python2和python3注意print函数即可
import requests
import json
import sys
import os

headers = {'Content-Type': 'application/json;charset=utf-8'}
api_url = ""       ---这里就是刚才复制钉钉的那个webhook

def msg(text):
    json_text= {
     "msgtype": "text",
        "at": {
            "atMobiles": [
                ""
            ],
        },
        "text": {
            "content": text
        }
    }
    print(requests.post(api_url,json.dumps(json_text),headers=headers).content)

if __name__ == '__main__':
    text = sys.argv[1]
    msg(text)


[root@zabbix-server alertscripts]# chmod 777 dingding.py && chown zabbix.zabbix dingding.py 
[root@zabbix-server alertscripts]# ll
total 8
-rwxrwxrwx 1 zabbix zabbix 631 Sep 22 23:06 dingding.py
-rwxr--r-- 1 zabbix zabbix  70 Sep 22 22:19 sendmail.sh
[root@zabbix-server alertscripts]# yum -y install python-requests python #安装python与请求模块
手动测试钉钉报警:
# 发送的报警信息中需要添加关键字
# ./dingding.py  告警主机  //此处的"告警主机"为关键字
b'{"errcode":0,"errmsg":"ok"}'

由于之前已经配置好监控项和触发器了。就直接配置zabbix的报警媒介

开始配置web界面

示警媒体的配置:
点击 管理->报警媒介类型->创建媒体类型

image-20200922221650028

1.然后在页面中填入你的报警媒介类型信息,例如下所示:

注:脚本名称任意,存放于/usr/lib/zabbix/alertscripts (生产上的测试服放这:/usr/local/zabbix/share/zabbix/alertscripts


名称dingding                  #名称任意
类型:脚本
脚本名称dingding.py      
脚本参数:                  
    {ALERT.MESSAGE}            #邮件正文变量,变量值来源于‘动作’中的‘默认信息’

配置完成后,不要忘记点击存档,保存你的配置

注意:这里和微信报警不一样,只需添加一个参数{ALERT.MESSAGE}

image-20200922232312249

管理---用户--Admin--报警媒介--添加

image-20220705120012972

收件人填写群名称zabbix报警

剩下的步骤和微信报警一样了,创建动作,测试

image-20220705115900916

自定义监控脚本

自定义key测试工具--安装在ZabbixServer上

# yum install zabbix-get -y

自定义key--在agent上: 配置文件/etc/zabbix/zabbix_agentd.conf定义key和监控脚本的位置名称

# mkdir /etc/zabbix/scripts
# vim  /etc/zabbix/zabbix_agentd.conf
UserParameter=testkey,echo "hello"
UserParameter=free_mem,/etc/zabbix/scripts/free_mem.sh
UserParameter=mem[*],/etc/zabbix/scripts/mem.sh $1
[root@agent_1 scripts]# cat free_mem.sh 
#!/bin/bash
#获取剩余内存
free_mem=`free -m |  awk 'NR==2{print $4}'`
echo $free_mem

[root@agent_1 scripts]# cat mem.sh 
#!/bin/bash
#内存  可以接收 total used 其他任意
if [ "$1" = "total" ];then
	free -m | awk 'NR==2{print $2}'
elif [ "$1" = "used" ];then
	free -m | awk 'NR==2{print $3}'
else
	free_mem=`free -m |  awk 'NR==2{print $4}'`
	echo $free_mem
fi

在ZabbixServer上测试不带参数的key:
[root@zabbix-server ~]# zabbix_get -s 10.0.0.21 -p 10050 -k mem

在ZabbixServer上测试带参数的key:
[root@zabbix-server ~]# zabbix_get -s 10.0.0.21 -p 10050 -k mem[total]
2014
[root@zabbix-server ~]# zabbix_get -s 10.0.0.21 -p 10050 -k mem[free]
1048
[root@zabbix-server ~]# zabbix_get -s 10.0.0.21 -p 10050 -k mem[used]
308

现在的机器 客户端:

# vim /etc/zabbix/zabbix_agentd.conf 
    UserParameter=mysql.version,mysql -V
    UserParameter=mysql.ping,mysqladmin -uroot -p11Www.hotyq.com -S /var/lib/mysql/mysql.sock ping | grep -c alive
    UserParameter=mysql.status[*],/etc/zabbix/scripts/checkmysqlperformance.sh $1 $2
# vim /var/lib/mysql/.mysqlpasswd
    11Www.hotyq.com
#vim /etc/zabbix/scripts/checkmysqlperformance.sh
    #!/bin/sh 
    #监控Mysql各种状态
    #version 0.1  author 闫强
     

    MYSQL_SOCK="/var/lib/mysql/mysql.sock"
    MYSQL_PWD=`cat /var/lib/mysql/.mysqlpasswd`
    ARGS=1
    if [ $# -ne "$ARGS" ];then
        echo "Please input one arguement:" 
    fi
    case $1 in
        Uptime)
                    result=`mysqladmin -uroot -p${MYSQL_PWD} -S $MYSQL_SOCK status|cut -f2 -d":"|cut -f1 -d"T"`
                    echo $result ;;
        Com_update)
                    result=`mysqladmin -uroot -p${MYSQL_PWD} -S $MYSQL_SOCK extended-status |grep -w "Com_update"|cut -d"|" -f3`
                    echo $result ;;
        Slow_queries)
                    result=`mysqladmin -uroot -p${MYSQL_PWD} -S $MYSQL_SOCK status |cut -f5 -d":"|cut -f1 -d"O"`
                    echo $result ;;
        Com_select)
                    result=`mysqladmin -uroot -p${MYSQL_PWD} -S $MYSQL_SOCK extended-status |grep -w "Com_select"|cut -d"|" -f3`
                    echo $result 
                    ;;
        Com_rollback)
                    result=`mysqladmin -uroot -p${MYSQL_PWD} -S $MYSQL_SOCK extended-status |grep -w "Com_rollback"|cut -d"|" -f3`
                    echo $result 
                    ;;
        Questions)
                    result=`mysqladmin -uroot -p${MYSQL_PWD} -S $MYSQL_SOCK status|cut -f4 -d":"|cut -f1 -d"S"`
                    echo $result 
                    ;;
        Com_insert)
            result=`mysqladmin -uroot -p${MYSQL_PWD} -S $MYSQL_SOCK extended-status |grep -w "Com_insert"|cut -d"|" -f3`
                    echo $result 
                    ;;
        Com_delete)
            result=`mysqladmin -uroot -p${MYSQL_PWD} -S $MYSQL_SOCK extended-status |grep -w "Com_delete"|cut -d"|" -f3`
                    echo $result 
                    ;;
        Com_commit)
            result=`mysqladmin -uroot -p${MYSQL_PWD} -S $MYSQL_SOCK extended-status |grep -w "Com_commit"|cut -d"|" -f3`
                    echo $result 
                    ;;
        Bytes_sent)
            result=`mysqladmin -uroot -p${MYSQL_PWD} -S $MYSQL_SOCK extended-status |grep -w "Bytes_sent" |cut -d"|" -f3`
                    echo $result 
                    ;;
        Bytes_received)
            result=`mysqladmin -uroot -p${MYSQL_PWD} -S $MYSQL_SOCK extended-status |grep -w "Bytes_received" |cut -d"|" -f3`
                    echo $result 
                    ;;
        Com_begin)
            result=`mysqladmin -uroot -p${MYSQL_PWD} -S $MYSQL_SOCK extended-status |grep -w "Com_begin"|cut -d"|" -f3`
                    echo $result 
                    ;;
            *)
            echo "Usage:$0(Uptime|Com_update|Slow_queries|Com_select|Com_rollback|Questions)" 
            ;;
    esac

报警格式优化

邮件内容 名称Action-Email 默认接收人:故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障! 默认信息: 告警主机:{HOSTNAME1} 告警时间:{EVENT.DATE} {EVENT.TIME} 告警等级:{TRIGGER.SEVERITY} 告警信息: {TRIGGER.NAME} 告警项目:{TRIGGER.KEY1} 问题详情:{ITEM.NAME}:{ITEM.VALUE} 当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1} 事件ID:{EVENT.ID}

短信内容 短信这里使用的是脚本,短信标题传给$2,短信内容传给$3用户设置里面的收件人手机号会传给$1 脚本 我们这里只需设置短信内容: 原始写法: 触发: {TRIGGER.NAME} 状态: {TRIGGER.STATUS} 级别: {TRIGGER.SEVERITY} 项目: {ITEM.NAME1} ({HOST.NAME1}:{ITEM.KEY1}): {ITEM.VALUE1} Original event ID: {EVENT.ID}

经wing修改
主机: {HOST.NAME1}
时间: {EVENT.DATE} {EVENT.TIME}
级别: {TRIGGER.SEVERITY}
触发: {TRIGGER.NAME}
详情: {ITEM.NAME1}:{ITEM.KEY1}:{ITEM.VALUE1}
状态: {TRIGGER.STATUS}

扩展

zabbix-agent使用

显示已知监控项并打印其当前返回值

[root@zabbix-agent /]# zabbix_agentd -p
agent.hostname                                  [s|zabbix-agent]
agent.ping                                           [u|1]
agent.version                                      [s|3.4.11]
system.localtime[utc]                          [u|1532591443]
system.run[echo test]            [m|ZBX_NOTSUPPORTED] [Remote commands are not enabled.]
web.page.get[localhost,,80]                   [t|HTTP/1.1 200 OK
Date: Thu, 26 Jul 2018 07:50:43 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Wed, 25 Jul 2018 07:21:37 GMT
ETag: "7-571cdbaad95ec"
Accept-Ranges: bytes
Content-Length: 7
Connection: close
Content-Type: text/html; charset=UTF-8

hello ]
web.page.perf[localhost,,80]                  [d|0.000336]

测试指定监控项

-t --test <item key>
# zabbix_agentd -t agent.ping
agent.ping                                    [u|1]

批量添加主机

利用zabbix的主动发现功能 点击配置->发现->创建发现规则 file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/1.png 注意:上图中键值名称写错了,应该为"system.uname"

以上图片各项参数的含义是: 名称(Names) :该项发现配置的名字,填写便于识别的名称。 由代理节点进行发现(Discovery by Proxy) :是否通过代理发现 IP 范围(IP range) :IP 地址的范围,可以写一段地址也可以写多段 延迟(Delay) :检测的周期时间,默认为 3600 秒,即每小时执行一次发现 检查(Checks) :设置通过何种方式发现监控主机,根据情况设置多种方式确保发现主机 设备唯一性标准(Device uniqueness criteria) :设备的唯一名称 已启用(Enable) :是否启用 Zabbix 代理选项中的配置含义是: 端口范围:Zabbix Agent 端的监听端口,默认为 10050 键值 :以 Zabbix Agent 端的哪些键值作为发现依据

为批量添加主机自动设置模版: 目的:自动发现的主机就可以完全自动化的加入监控 点击配置->动作->在创建动作按钮下面的事件源中选择“发现”->创建动作 file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/2.png

该页有三栏组成: 第一栏:触发条件类型 第二栏:条件判断符号,满足/不满足。 第三栏:判断值 可以根据情况添加触发条件,例如下图的判断条件为:由发现规则“net192.168.42.0”发现的 主机,且收到 Agent 传来的对应值,则执行接下来的操作。 file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/3.png 接下来,设置操作。配置好后,点击存档。 file://C:/Users/86186/AppData/Local/Temp/.9FVTH1/4.png 再次点击监测中->发现,就可以看到自动发现的主机。它们将自动的加入到监控当中。

zabbix报错

server端测试key报出如下信息Not all processes could be identified, non-owned process info will not be show

调试脚本的时候,打印出的日志中出现了 “Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.” 错误

原因
经过排查后发现脚本中有运行 netstat 查看进程的命令,因为是在普通用户下执行的 netstat命令所以权限不足

解决办法
登陆root用户执行如下命令让其它用户瞬间获得文件所有者的权限
# chmod +s /bin/netstat

Zabbix优化

1.架构上的优化

底层应用分离

web

mysql

分布式监控

zabbix-server的高可用

2.配置优化

被动模式

主动模式

系统优化

cpu 内存 硬盘 网络

应用

mysql tomcat apache nginx zabbix

数据流

监控主机组

监控主机

监控项

1.监控模板

监控模板-->应用集-->监控项

2.自定义

手动创建监控项

被监控机器-->定义key-->监控脚本

监控图形

触发器 关联监控项 设置阈值

报警媒介

用户 收报警

动作

触发器被触发之后通过相应的报警媒介发给用户

作业

编写监控脚本实现nginx状态监控

编写监控脚本实现cpu使用率cpu负载系统进程总数的监控

编写监控脚本实现内存总数内存剩余buffer/cache使用量的监控

微信报警

上次作业里的脚本

每个人必须得准备几个监控项

nginx mysql tomcat redis nfs vsftpd wiki

git gitlab jenkins elk rabbitmq