第十周作业
- 监控LNMP架构,并配置报警升级,0-5分钟不报警执行重启应用,5-30分钟通知运维,30-60分钟短信通过总监。
- zabbix api批量添加多个主机,要求一些不走代理,一些支持走代理。
- 基于角色完成部署LNMP架构,并支持一键发布,回滚应用。同时基于zabbix角色批量部署zabbix。
- 总结zabbix自定义监控项,基于自定义监控项监控nginx。基于zabbix实现邮件或微信告警。
什么是Zabbix?
zabbix 是一个基于 WEB 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。(LAMP架构)
zabbix 能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。
监控功能
主机的性能监控、网络设备性能监控、数据库性能监控、多种告警方式、详细的报表图表绘制;
可监控对象:
设备:服务器、路由器、交换机等
软件:OS、网络、应用程序等
主机性能指标监控
故障监控:宕机,服务器不可用,主机不可达
为什么需要对各类系统进行监控?
在系统构建时的正常流程中,通常是不允许未被监控的系统或应用上线的,因为未被监控的系统存在不可预知性、故障未知性等不稳定因素,且无法及时被发现并排除。这对整个架构或系统来说都是很大的风险隐患。所以我们原则上是需要对整个架构或系统进行监控,随时监测系统各方面的指标是否正常,以提高整个系统的稳定性。
Zabbix是如何实现系统监控的?
一个完整的监控系统所需指标:
1.采样:周期性的获取某个被监测指标的相关数据
2.存储:将采集到的数据存储在指定的存储系统中,Zabbix默认是MySQL
3.展示:采集完数据后,为了使数据能更直观的展现在用户面前,可将采集到的数据做二次处理,做成各类图形。
Zabbix就是使用的PHP程序将采集的数据通过Web GUI直观的展示给用户。
4.报警:当监控的指标出现异常时需要监控系统能自动的发出告警信息,甚至在出现报警后能自动完成修复。
Zabbix支持的数据采集协议:
1.SNMP:(Simple Network Management Protocol),简单网络管理协议。这是一个非常古老的且通用的监控协议,几乎任何设备都支持用此方式进行系统监控。
2.Agent:在被监控端安装专门的监控程序,将数据采集后通过Agent发送至Server。
3.IPMI:智能平台管理接口。可在常用的服务器上看到类似以太网口的接口。
4.JMX:Java Management Extensions
Zabbix的常用组件:
1.Zabbix Web GUI:提供Web界面
2.Zabbix Database:提供数据存储功能,专用于存储配置信息,以及采集到的数据
3.Zabbix Server:接收Agent采集数据的核心组件。
4.Zabbix Agent:部署在被监控主机上,用于采集本地数据。
5.Zabbix Proxy:当被监控节点较多时,用于减轻Server压力的组件,也用于分布式监控系统。由Proxy接收数据后统一发送至Server。
Zabbix架构图:
Zabbix逻辑组件:
主机组(host groups):主机组通常在给用户或用户组指派监控权限时使用
主机(hosts):要监控的网络设备,可由IP或DNS名称指定
应用(application):一组item的集合(mysql,redis,nginx,等)
监控项(items):一个特定监控指标(比如mysql主从状态)的相关的数据;这些数据来自于被监控对象;item是zabbix进行数据收集的核心,相对某个监控对象,每个item都由"key"标识
触发器(triggers)一个表达式,用于评估某监控对象的特定item内接收到的数据是否在合理范围内,也就是阈值;接收的数据量大于阈值时,触发器状态将从"OK"转变为"Problem",当数据再次恢复到合理范围,又转变为"OK";
事件(events):触发一个值得关注的事情,比如触发器状态转变,新的agent或重新上线的agent的自动注册等;
动作(actions):指对于特定事件事先定义的处理方法,如发送通知,何时执行操作
媒介(media):发送通知的通道,短信,邮件等
通知(notiflcations):通过选定的媒介向用户发送的有关某事件的信息
远程命令(remote command):预定义的命令,可在被监控主机处于某特定条件下时自动执行
报警升级(escalation):发送警报或者执行远程命令的自定义方案,如每隔5分钟发送一次警报,共发送5次等
模板(template):用于快速定义被监控主机的预设条目集合,通常包含了item、trigger、graph、screen、application以及low-level discovery rule;模板可以直接链接至某个主机
Zabbix实现监控的两种模式:
简单的讲,主动模式和被动模式都是将Agent作为参照的
主动模式:由Agent主动建立TCP链接并向Server端发送请求。
被动模式:由Server建立TCP链接并向Agent端发送请求。
zabbix工作进程
默认情况下 zabbix 包含6个进程:zabbix_agentd、zabbix_get、zabbix_proxy、zabbix_sender、zabbix_server,另外一个zabbix_java_gateway是可选的,这个需要单独安装。 zabbix_agentd 客户端守护进程,此进程收集客户端数据,例如cpu负载、内存、硬盘使用情况等。 zabbix_get zabbix 工具,单独使用的命令,通常在 server 或者 proxy 端执行获取远程客户端信息的命令。通常用于排错。例如在 server 端获取不到客户端的内存数据,可以使用 zabbix_get 获取客户端的内容的方式来做故障排查。 zabbix_sender zabbix 工具,用于发送数据给 server 或者 proxy,通常用于耗时比较长的检查。很多检查非常耗时间,导致 zabbix 超时。于是在脚本执行完毕之后,使用 sender 主动提价数据。 zabbix_server zabbix 服务端守护进程。zabbix_agentd、zabbix_get、zabbix_sender、zabbix_proxy、zabbix_java_gateway的数据最终都是提交到server(说明:当然不是数据都是主动提交给zabbix_server,也有的是 server 主动去取数据) zabbix_proxy zabbix 代理守护进程。功能类似server,唯一不同的是它只是一个中转站,它需要把收集到的数据提交/被提交到 server 里。 zabbix_java_gateway zabbix2.0之后引入的一个功能。顾名思义:Java网络,类似agentd,但是只用于 Java 方面。需要特别注意的是,它只能主动去获取数据,而不能被动获取数据。它的数据最终会给到 server 或者proxy。
二、监控LNMP架构,并配置报警升级,0-5分钟不报警执行重启应用,5-30分钟通知运维,30-60分钟短信通过总监
2.1、zabbix环境
rocky8+zabbix5.0
2.2、搭建监控LNMP架构
1
|
|
2.3、配置报警升级
2.3.1、实现故障自愈功能(检测到Apache关闭时,自动重启)
配置远程命令的操作类似于发送消息,区别在于一个执行命令,一个发送消息
远程命令可以直接在ZabbixServer, ZabbixProxy和ZabbixAgent上执行。
但在Zabbix agent和Zabbix proxy上,远程命令默认是不开启的,它们可以通过以下方式启用:
1
|
|
2.3.1.1、zabbix agent开启远程命令
1
|
|
2.3.1.2、创建相关动作
①创建触发器
②创建动作
③创建远程操作细节
④停止apache看是否重新启动
1
|
|
在监测页面可以看到动作执行
在agent服务器端也可以看到80端口已启动
2.3.2、实现邮件报警通知
2.3.2.1、创建报警媒介类型实现发信人功能
管理–>报警媒介类型–>创建报警媒介类型
添加消息模板用于发送信息
1
|
|
2.3.2.2、给指定用户添加报警媒介实现收件人功能
2.3.2.3、在动作里面添加邮件报警
三、zabbix api批量添加多个主机,要求一些不走代理,一些支持走代理
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组功能的能力,而又无需直接使用源代码,或理解内部工作机制的细节。
Zabbix API允许你以编程方式检索和修改Zabbix的配置,并提供对历史数据的访问。它广泛用于:
-
创建新的应用程序以使用Zabbix
-
将Zabbix与第三方软件集成
-
自动执行常规任务
Zabbix API是基于Web的API,作为Web前端的一部分提供。它使用JSON-RPC 2.0协议,这意味着两件事:
-
该API包含一组独立的方法
-
客户端和API之间的请求和响应使用JSON格式进行编码
API 采用 JSON-RPC 实现。这意味着调用任何函数,都需要发送 POST 请求,输入输出数据都是以JSON 格式。
Zabbix API由许多名义上分组的独立API方法组成。每个方法执行一个特定任务。
例如,方法 host.create 隶属于 host 这个API分组 ,用于创建新主机。API分组有时被称为“类”。
大多数API至少包含四种方法: get, create, update 和 delete ,分别是检索,创建,更新和删除数据,但是某些API提供一套完全不同的一组方法。
Zabbix常用API
1
|
|
3.1、获取Token
1
|
|
注意:
①在通常的测试场景中,直接输出JSON结果的结果很乱,没有换行,没有任何格式,看起来很复杂,如果想要格式化输出,需要花费很多的时间对结果进行处理,使用python的json.tool可以直接将结果以json格式输出,看起来美观易读
②还可以利jq工具实现类似的效果
1
|
|
3.2、通过API批量添加主机
通过API添加主机命令格式:API添加主机为预先知道要添加的主机IP、预先安装并配置好zabbix agent、预先知道要关联的模板ID/组ID等信息,然后同API提交请求添加
例如:
1
|
|
3.2.1、获取组的ID
直接在web界面上点击相应的组就会出现对应的ID
3.2.2、获取关联模板的ID
直接在web界面上点击相应的模板就会出现对应的ID
3.2.3、获取代理proxy的ID
直接在web界面上点击相应的代理就会出现对应的ID
3.2.4、使用脚本批量添加主机
1
|
|
四、基于角色完成部署LNMP架构,并支持一键发布,回滚应用。同时基于zabbix角色批量部署zabbix。
4.1、自定义监控项
系统内置的监控项:zabbix5.0参考文档
1
|
|
4.1.1、自定义监控项配置
监控项键值的格式
1
|
|
客户端可以自定义监控项,在Zabbix Agent 配置文件添加内容,格式如下
1
|
|
注意:
- key 必须整个系统唯一。注意大小写是敏感的, Key名允许的字符如下
1
|
|
key使用 [*] 用于定义该key接受括号内的参数。参数需在配置监控项时给出;参数禁止使用下列字符:\ ’ ” ` * ? [ ] { } ~ $ ! & ; ( ) <>
- Command:命令用于生成key对应的值。可以在命令中使用位置引用$1 … $9来引用监控项Key中的相应参数。Zabbix解析监控项Key的[]中包含的参数,并相应地替换$1,…,$9。$0会替换为完整的原始命令(在对$0,…,$9执行替换之前的命令)运行。不管位置参数($0,…,$9)是用双引号( “ )还是单引号( ’ )括起来,都会解析位置引用
测试监控项
1
|
|
4.2、监控Nginx服务
4.2.1、自定义监控nginx(状态页)
1
|
|
4.2.2、配置agent2
1
|
|
4.2.3、自定义模板及监控项并添加监控的主机上关联模板
创建模板
添加监控项
关联主机
查看是否更新数据
五、总结zabbix自定义监控项,基于自定义监控项监控nginx。
基于zabbix实现邮件或微信告警。
5.1、注册企业微信
微信告警首先得注册一个企业微信,然后才能实现微信告警。
浏览器访问下面链接,注册企业微信
1
|
|
5.2、创建部门和人员
5.2.1、创建部门
5.2.2、加入人员
方法1: 直接微信邀请,让相关人员自行扫码加入
方法2:手动添加人员
5.3、将微信应用中添加相关的部门或人员
注意记下以下信息:
1
|
|
1
|
|
5.4、授权可信ip
在应用中添加 企业可信IP (最近添加的功能,必须配置IP白名单才能发微信,否则会出错)
106.117.126.69
添加可信ip前还需要添加真实域名(因暂未添加,所以后面只展示步骤,不再展示测试结果)
5.5、测试发送微信消息
5.6、创建发送微信脚本
官方微信教程
官方微信API参考文档
1
|
|
官方微信API参考文档
1
|
|
发送微信可以使用各种语言,下面使用shell脚本实现
1
|
|
5.7、创建微信报警媒介类型
报警媒介类型为脚本,脚本参数为以下三项
1
|
|
官方宏参考:
1
|
|
注意:此处可以只填写{ALERT.SENDTO}和{ALERT.MESSAGE}即可
修改消息模板
1
|
|
5.8、给Zabbix用户添加报警媒介
5.9、创建动作
5.9.1、编辑已有动作
如果已经创建动作,可以修改已有动作,如下所示
5.9.2、创建动作
如果之前没有动作,新创建动作
六、总结zabbix自动发现监控
6.1、自动发现
6.1.1、Zabbix网络发现介绍
之前都是手动一台一台主机的添加到 Zabbix 中进行监控,很是繁琐,可以利用自动发现功能,自动添加被监控的主机
当众多的服务器都已经安装了agent或者snmp后,利用自动发现功能,Zabbix server 可以自动扫描预先配置好的ip段,自动添加主机,自动关联模板,自动加到主机组里等等。
网络发现功能更快速的部署zabbix、简化zabbix管理、并且在经常变动的环境里面也不需要花太多的精力,毕竟网络发现也能随时发现变化。
当然网络发现也不是万能的,虽然网络发现能干很多事情,但是它无法发现网络拓扑的变化。
由于自动发现效率比较低,严重消耗Zabbix Server资源和网络带宽,大规模环境中较少使用
自动发现虽然能自动完成发现并添加主机,但仍然存在一些问题
-
发现时间长,效率较低
-
扫描过程中容易漏扫
-
当IP地址不固定难以实现
-
无法实现不同类型主机关联不同模板
官方文档
1
|
|
6.1.2、实现Zabbix网络发现
自动发现由两个步骤组成:
-
发现discovery: Zabbix周期性地扫描在”网络发现规则”中定义的IP段,发现满足规则的主机
-
动作action: 对这些主机完成动作,包括添加主机、添加模板、发送通知等等。
6.1.2.1、创建自动发现指定需要监控的网段
配置– 自动发现– 创建发现规则
指定名称,IP范围和逢动发现检查等信息
可见名称为IP地址
6.1.2.2、创建添加主机的自动发现动作
创建新的动作
操作增加三个操作: 添加主机,添加群组,添加模板
也可以添加发送消息给Admin等操作
6.1.2.3、创建删除主机的自动发现动作
6.2、自动注册
6.2.1、自动注册介绍
当客户端众多时,将每台主机手动添加到Zabbix,还手动添加关联模板,无疑是低效的.
但是利用网络发现实现,Zabbix Server 资源消耗又比较严重
利用Zabbix的自动注册功能,实现添加主机的自动化,可以大幅减少运维的工作量,减少Zabbix Server 的资源消耗
此方式和自动发现不同,是由Active agent主动发起请求zabbix server将这些agent加到主机里。
注意: Agent 必须使用主动模式才支持自动注册
自动注册由于比自动发现效率更好,Zabbix Server资源消耗更少,更适合大规模及云环境IP地址不固定的场景使用
官方帮助
1
|
|
在Zabbix agent 端的配置文件修改以下项目
1
|
|
6.2.2、修改Zabbix agent的配置
1
|
|
6.2.3、在Zabbix Server配置动作
在配置—动作—选择自动注册动作
指定动作中条件的主机名的值
或者使用元数据添加
1
|
|
指定操作