第十周作业

  1. zabbix 架构原理,及常用组件及用途分析。
  2. 监控LNMP架构,并配置报警升级,0-5分钟不报警执行重启应用,5-30分钟通知运维,30-60分钟短信通过总监。
  3. zabbix api批量添加多个主机,要求一些不走代理,一些支持走代理。
  4. 基于角色完成部署LNMP架构,并支持一键发布,回滚应用。同时基于zabbix角色批量部署zabbix。
  5. 总结zabbix自定义监控项,基于自定义监控项监控nginx。基于zabbix实现邮件或微信告警。
  6. 总结zabbix自动发现监控

一、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工作进程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
默认情况下 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
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#安装server机器
#环境:rocky8+mysql+nginx+zabbix安装在一台机器上(生产环境中,mysql单独安装在一台机器)

#注意:因采用网址登录,所以需提前进行DNS域名解析
[root@zabbix_server ~]#vim install_zabbix5.0_for_nginx_mysql.sh
#!/bin/bash
rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/8/x86_64/zabbix-release-5.0-1.el8.noarch.rpm
sed -i 's#http://repo.zabbix.com#https://mirrors.tuna.tsinghua.edu.cn/zabbix#' /etc/yum.repos.d/zabbix.repo
dnf clean all
dnf -y install zabbix-server-mysql zabbix-web-mysql zabbix-nginx-conf zabbix-agent2
yum -y install mysql-server
systemctl enable --now mysqld
cat << EOF | mysql
create database zabbix character set utf8 collate utf8_bin;
create user zabbix@localhost identified by '123456';
grant all privileges on zabbix.* to zabbix@localhost;
EOF
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p123456  zabbix
sed -i.bak '/# DBPassword/a DBPassword=123456' /etc/zabbix/zabbix_server.conf
systemctl enable --now nginx
sed -i.bak '/^server/a\        listen 80;\n        server_name     zabbix.magedu.org; ' /etc/nginx/conf.d/zabbix.conf
sed -i.bak '/date.timezone/c php_value[date.timezone] = Asia/Shanghai' /etc/php-fpm.d/zabbix.conf
systemctl restart zabbix-server zabbix-agent2 nginx php-fpm
systemctl enable zabbix-server zabbix-agent2 nginx php-fpm
:wq
#以上就创建好了简单的安装脚本
[root@zabbix_server ~]#bash install_zabbix5.0_for_nginx_mysql.sh

#此时网站是英文环境,需提前安装中文包,才能设置为中文环境
[root@zabbix_server ~]#yum -y install langpacks-zh_CN
#但图形里面会有一些乱码

#将Windows里的字体文件放入到zabbix-server主机里会解决此问题,Windows字体路径:控制面板\外观和个性化\字体

#将中文字体上传到 Zabbix Server 的目录 /usr/share/zabbix/assets/fonts 下
[root@zabbix_server ~]#cd /usr/share/zabbix/assets/fonts
[root@zabbix_server fonts]#ll
total 0
lrwxrwxrwx 1 root root 33 Dec  9 09:17 graphfont.ttf -> /etc/alternatives/zabbix-web-font
[root@zabbix_server fonts]#mv graphfont.ttf graphfont.ttf.bak
[root@zabbix_server fonts]#ls
graphfont.ttf.bak
[root@zabbix_server fonts]#rz -E
rz waiting to receive.
[root@zabbix_server fonts]#ls
graphfont.ttf.bak  simsun.ttc
[root@zabbix_server fonts]#cp simsun.ttc graphfont.ttf   #将上传的字体设置为linux的字体
[root@zabbix_server fonts]#ls
graphfont.ttf  graphfont.ttf.bak  simsun.ttc

***********************************************************************************

#安装agent2
#Rocky8.6系统,简单脚本如下
[root@zabbix_agent2 ~]#vim install_zabbix5.0_agent2_for_rocky8
rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/8/x86_64/zabbix-release-5.0-1.el8.noarch.rpm
sed -i 's#http://repo.zabbix.com#https://mirrors.tuna.tsinghua.edu.cn/zabbix#' /etc/yum.repos.d/zabbix.repo
dnf clean all
dnf -y install zabbix-agent2
sed -i.bak '/^Server=/c Server=10.0.0.190' /etc/zabbix/zabbix_agent2.conf  #zabbix_server安装在10.0.0.190(ip地址也可以写成网址,相对应的需要在本机上解析此网址)
 #其中两种方法
 #①在/etc/hosts里面添加 10.0.0.190  网址
 #②在/etc/sysconfig/network-scripts/ifcfg-eth0里面将DNS指向10.0.0.128(此ip是自己设置的DNS解析服务器,里面有10.0.0.190所对应的网址)
systemctl start zabbix-agent2
systemctl enable zabbix-agent2
:wq
[root@zabbix_agent2 ~]#bash install_zabbix5.0_agent2_for_rocky8

#下一步需要在zabbix_server的web端进行设置,允许监视zabbix_agent2

2.3、配置报警升级

2.3.1、实现故障自愈功能(检测到Apache关闭时,自动重启)

配置远程命令的操作类似于发送消息,区别在于一个执行命令,一个发送消息

远程命令可以直接在ZabbixServer, ZabbixProxy和ZabbixAgent上执行。

但在Zabbix agent和Zabbix proxy上,远程命令默认是不开启的,它们可以通过以下方式启用:

1
2
3
4
在agent配置中添加AllowKey=system.run[*]、UnsafeUserParameters=1参数
#zabbix5.0版本以上,AllowKey=system.run[*]代替EnableRemoteCommands,agent2默认没有此命令手工加入
#EnableRemoteCommands=1 #开启远程执行命令,此指令在zabbix5.0版本以上淘汰
在proxy配置中,将enableremotecomcommands参数设置为1;
2.3.1.1、zabbix agent开启远程命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@zabbix_agent2 ~]#vim /etc/zabbix/zabbix_agent2.conf
UnsafeUserParameters=1    #取消此行注释,并将0改为1.允许远程执行命令的时候使用不安全的参数
AllowKey=system.run[*]    #添加此行,#开启远程执行命令
:wq
[root@zabbix_agent2 ~]#systemctl restart zabbix-agent2.service

#默认zabbix agent是使用zabbix用户启动的,有些特权命令zabbix用户是没有权限执行,会导致定义好的自治愈策略因为权限拒绝为执行失败,所以需要事先对zabbix用户进行授权.
[root@zabbix_agent2 ~]#ll /etc/sudoers
-r--r-----. 1 root root 4328 Apr 20  2022 /etc/sudoers
[root@zabbix_agent2 ~]#chmod u+w /etc/sudoers
[root@zabbix_agent2 ~]#ll /etc/sudoers
-rw-r-----. 1 root root 4328 Apr 20  2022 /etc/sudoers
[root@zabbix_agent2 ~]#vim /etc/sudoers
## Allow root to run any commands anywhere 
root    ALL=(ALL)       ALL
zabbix ALL=(ALL)   NOPASSWD: ALL           #添加此行
:wq
[root@zabbix_agent2 ~]#chmod u-w /etc/sudoers
[root@zabbix_agent2 ~]#ll /etc/sudoers
-r--r----- 1 root root 4359 Dec 11 15:29 /etc/sudoers
[root@zabbix_agent2 ~]#visudo -c                #检查语法是否错误
/etc/sudoers: parsed OK
2.3.1.2、创建相关动作

①创建触发器

image-20221211160352740

②创建动作

image-20221211155520092

③创建远程操作细节

image-20221211155824026

④停止apache看是否重新启动

1
[root@zabbix_agent2 ~]#systemctl stop httpd

在监测页面可以看到动作执行

image-20221211160930949

在agent服务器端也可以看到80端口已启动

image-20221211161027470

2.3.2、实现邮件报警通知
2.3.2.1、创建报警媒介类型实现发信人功能

管理–>报警媒介类型–>创建报警媒介类型

image-20221211161904592

添加消息模板用于发送信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#可以修改两个消息模板
# 问题
主题: 告警: {EVENT.NAME}
告警主机:{HOST.NAME1}
告警服务: {ITEM.NAME1}
告警Key1: {ITEM.KEY1}:{ITEM.VALUE1}
告警Key2: {ITEM.KEY2}:{ITEM.VALUE2}
严重级别: {TRIGGER.SEVERITY}
# 恢复 Problem Recovery
主题: 恢复: {EVENT.DURATION}: {EVENT.NAME}
恢复主机:{HOST.NAME1}
恢复服务: {ITEM.NAME1}
恢复Key1:{ITEM.KEY1}:{ITEM.VALUE1}
恢复Key2: {ITEM.KEY2}:{ITEM.VALUE2}

image-20221211162254882

2.3.2.2、给指定用户添加报警媒介实现收件人功能

image-20221211163011697

2.3.2.3、在动作里面添加邮件报警

image-20221211163652192

 

三、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
2
3
4
5
6
7
user.login                                    #用户登录
host.get(create|delete|update)                #主机操作
hostgroup.get(create|delete|update)           #主机组操作
item.get(create|delete|update)                #监控项目操作
history.get                                   #历史数据查询
event.get                                     #事件查询
trigger.get                                   #触发器查询

3.1、获取Token

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#获取token的脚本,其中的用户密码是登陆zabbix-web页面的账号密码(原始账号:Admin密码:zabbix),此脚本可在任意服务器使用,但需注意域名解析
[root@zabbix_agent2 ~]#cat zabbix-api-token.sh 
#!/bin/bash
ZABBIX_SERVER=zabbix.magedu.org
curl -s -X POST -H 'Content-Type:application/json' -d '
{
    "jsonrpc": "2.0",
    "method": "user.login",
    "params": {
        "user": "zhangtianxiang",
        "password": "123456"
    },
    "id": 1
}' http://$ZABBIX_SERVER/api_jsonrpc.php
[root@zabbix_agent2 ~]#vim /etc/hosts
10.0.0.190  zabbix.magedu.org          #添加此行
:wq
[root@zabbix_agent2 ~]#bash zabbix-api-token.sh 
{"jsonrpc":"2.0","result":"5e5f4cd57c79a24319cffecae0d7261c","id":1}
#其中5e5f4cd57c79a24319cffecae0d7261c即为获取的token

注意:

①在通常的测试场景中,直接输出JSON结果的结果很乱,没有换行,没有任何格式,看起来很复杂,如果想要格式化输出,需要花费很多的时间对结果进行处理,使用python的json.tool可以直接将结果以json格式输出,看起来美观易读

②还可以利jq工具实现类似的效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#使用python的json.tool
[root@zabbix_agent2 ~]#yum -y install python3
[root@zabbix_agent2 ~]#bash zabbix-api-token.sh | python3 -m json.tool
{
    "jsonrpc": "2.0",
    "result": "45909ac689943e0761e5e3deaea55a51",
    "id": 1
}

#利jq工具
[root@zabbix_agent2 ~]#bash zabbix-api-token.sh | jq
{
  "jsonrpc": "2.0",
  "result": "05ab62b170e52a584ea4b9c6656782a0",
  "id": 1
}

3.2、通过API批量添加主机

通过API添加主机命令格式:API添加主机为预先知道要添加的主机IP、预先安装并配置好zabbix agent、预先知道要关联的模板ID/组ID等信息,然后同API提交请求添加

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
curl -s -X POST -H 'Content-Type:application/json' -d '
 {
     "jsonrpc": "2.0",
     "method": "host.create", #定义方法,N多种
     "params": {
         "host": "API Add Host Test", #自定义添加后的agent的名称
         "proxy_hostid": "10273",#proxy的ID
         "interfaces": [
             {
                 "type": 1, #类型为1表示agent,2是SNMP,3是IMPI,4是JMX
                 "main": 1, #more接口
                 "useip": 1, #0是使用DNS,1是使用IP地址
                 "ip": "192.168.0.24", #添加的zabbix agent的IP地址
                 "dns": "",
                 "port": "10050" #agent端口
             }
         ],
         "groups": [
             {
                 "groupid": "2" #添加到的组的ID
             }
         ],
         "templates": [
             {
                 "templateid": "10001" #关联的模板的ID
             }
         ]
     },
     "auth": "977781251d1222ebead6f05da1a9ec4d", 
     "id": 1
 }' http://192.168.7.101/zabbix/api_jsonrpc.php
3.2.1、获取组的ID

直接在web界面上点击相应的组就会出现对应的ID

image-20221213105402925

3.2.2、获取关联模板的ID

直接在web界面上点击相应的模板就会出现对应的ID

image-20221213105254983

3.2.3、获取代理proxy的ID

直接在web界面上点击相应的代理就会出现对应的ID

image-20221213105208702

3.2.4、使用脚本批量添加主机
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
[root@zabbix_agent2 ~]#chmod +x zabbix-api-token.sh
#因为下方zabbix_api_add.sh调用zabbix-api-token.sh脚本,所以zabbix-api-token.sh需加执行权限
[root@zabbix_agent2 ~]#cat zabbix_api_add.sh
#!/bin/bash
ZABBIX_SERVER=zabbix.magedu.org
TOKEN=$(./zabbix-api-token.sh| awk -F'"' '{print $8}')
IPLIST=(10.0.0.184 10.0.0.219 10.0.0.130)

for ((i=0; i<${#IPLIST[@]}; i++ ));do
add_host='
{
   "jsonrpc": "2.0",
   "method": "host.create",
   "params": {
      "host": "'${IPLIST[$i]}'",
      "name": "'web-api-${IPLIST[$i]}'",
      "interfaces": [
          {
          "type": 1,
          "main": 1,
          "useip": 1,
          "ip": "'${IPLIST[$i]}'",
          "dns": "",
          "port": "10050"
          }
       ],
       "groups": [
          {
          "groupid": "18"
          }
       ],
       "templates": [
          {
          "templateid": "10444"
          }
       ]
   },
"id": 1,
"auth": "'$TOKEN'"
}'
add_proxy_host='
{
   "jsonrpc": "2.0",
   "method": "host.create",
   "params":
   {
      "host": "'${IPLIST[$i]}'",
      "name": "'web-proxy-api-${IPLIST[$i]}'",
      "proxy_hostid": "10446",
      "interfaces":
      [
         {
         "type": 1,
         "main": 1,
         "useip": 1,
         "ip": "'${IPLIST[$i]}'",
         "dns": "",
         "port": "10050"
         }
      ],
      "groups":
      [
         {
         "groupid": "18"
         }
      ],
      "templates":
      [
         {
         "templateid": "10444"
         }
      ]
   },
"id": 1,
"auth": "'$TOKEN'"
}'

   if [ $i -lt 2 ];then
       curl -s -XPOST -H "Content-Type: application/json-rpc" -d "${add_host}" http://${ZABBIX_SERVER}/api_jsonrpc.php
   else
       curl -s -XPOST -H "Content-Type: application/json-rpc" -d "${add_proxy_host}" http://${ZABBIX_SERVER}/api_jsonrpc.php
   fi
done
[root@zabbix_agent2 ~]#bash zabbix_api_add.sh
{"jsonrpc":"2.0","result":{"hostids":["10451"]},"id":1}{"jsonrpc":"2.0","result":{"hostids":["10452"]},"id":1}{"jsonrpc":"2.0","result":{"hostids":["10453"]},"id":1}

image-20221213120542304

 

四、基于角色完成部署LNMP架构,并支持一键发布,回滚应用。同时基于zabbix角色批量部署zabbix。

4.1、自定义监控项

系统内置的监控项:zabbix5.0参考文档

1
2
https://www.zabbix.com/documentation/5.0/zh/manual/config/items/itemtypes/zabbix
_agent
4.1.1、自定义监控项配置

监控项键值的格式

1
https://www.zabbix.com/documentation/5.0/zh/manual/config/items/item/key

image-20221213124541429

客户端可以自定义监控项,在Zabbix Agent 配置文件添加内容,格式如下

1
2
3
4
5
6
7
8
9
#cat /etc/zabbix/zabbix_agentd.conf
#cat /etc/zabbix/zabbix_agent2.conf
UserParameter=<key>,<shell command>
Include=/etc/zabbix/zabbix_agentd.d/*.conf

#或者创建独立的自定义文件
#cat /etc/zabbix/zabbix_agentd.d/*.conf
#cat /etc/zabbix/zabbix_agent2.d/*.conf
UserParameter=<key>,<shell command>

注意

  • key 必须整个系统唯一。注意大小写是敏感的, Key名允许的字符如下
1
0-9a-zA-Z_-.

key使用 [*] 用于定义该key接受括号内的参数。参数需在配置监控项时给出;参数禁止使用下列字符:\ ’ ” ` * ? [ ] { } ~ $ ! & ; ( ) <>

  • Command:命令用于生成key对应的值。可以在命令中使用位置引用$1 … $9来引用监控项Key中的相应参数。Zabbix解析监控项Key的[]中包含的参数,并相应地替换$1,…,$9。$0会替换为完整的原始命令(在对$0,…,$9执行替换之前的命令)运行。不管位置参数($0,…,$9)是用双引号( “ )还是单引号( ’ )括起来,都会解析位置引用

测试监控项

1
2
3
4
5
#在Zabbix Agent 上执行测试
zabbix_agent -t "在客户端定义的key名"

#在Zabbix Server上可以使用zabbix_get工具获取自定义监控项
zabbix_get -s 客户端IP -p 10050 -k "在客户端定义的key名"

4.2、监控Nginx服务

4.2.1、自定义监控nginx(状态页)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@zabbix_agent2_centos ~]#yum -y install nginx
[root@zabbix_agent2_centos ~]#vim /etc/nginx/nginx.conf
server {
        erver_name  10.0.0.220;
        ..........                      #添加以下内容
        location /nginx_status {
             stub_status;
             allow 127.0.0.1;
             allow 10.0.0.190;
             allow 10.0.0.186;
             deny  all;
        }
        ............
}
:wq
[root@zabbix_agent2_centos ~]#nginx -t
[root@zabbix_agent2_centos ~]#systemctl restart nginx.service 
[root@zabbix_agent2_centos ~]#curl http://10.0.0.220/nginx_status
Active connections: 1 
server accepts handled requests
 1 1 1 
Reading: 0 Writing: 1 Waiting: 0
4.2.2、配置agent2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#在对应目录下创建zabbix监控nginx的监控配置和获取nginx状态页的脚本
[root@zabbix_agent2_centos ~]#cd /etc/zabbix/zabbix_agent2.d/
[root@zabbix_agent2_centos zabbix_agent2.d]#cat nginx_status.sh
#!/bin/bash

PORT=80
HOST=10.0.0.220

case $1 in
  active)
	/usr/bin/curl "http://$HOST:"$PORT"/nginx_status/" 2>/dev/null| grep 'Active' | awk '{print $NF}'
	;;
  reading)
	/usr/bin/curl "http://$HOST:"$PORT"/nginx_status/" 2>/dev/null| grep 'Reading' | awk '{print $2}'
	;;
  writing)
	/usr/bin/curl "http://$HOST:"$PORT"/nginx_status/" 2>/dev/null| grep 'Writing' | awk '{print $4}'
	;;
  waiting)
	/usr/bin/curl "http://$HOST:"$PORT"/nginx_status/" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
	;;
  accepts)
	/usr/bin/curl "http://$HOST:"$PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $1}'
	;;
  handled)
	/usr/bin/curl "http://$HOST:"$PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $2}'
	;;
  requests)
	/usr/bin/curl "http://$HOST:"$PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $3}'
	;;
  *)
    echo $"Usage: $0 { active | reading | writing | waiting | accepts | handled | requests}"
esac
[root@zabbix_agent2_centos zabbix_agent2.d]#chmod +x nginx_status.sh
[root@zabbix_agent2_centos zabbix_agent2.d]#vim nginx_status.conf
UserParameter=nginx_status[*],/etc/zabbix/zabbix_agent2.d/nginx_status.sh $1
:wq
[root@zabbix_agent2_centos zabbix_agent2.d]#systemctl restart zabbix-agent2.service

#agent2测试
[root@zabbix_agent2_centos zabbix_agent2.d]#zabbix_agent2 -t nginx_status[requests]
nginx_status[requests]                        [s|22]

#zabbix server测试
[root@zabbix_server ~]#zabbix_get -s 10.0.0.220 -k nginx_status[requests]
23
4.2.3、自定义模板及监控项并添加监控的主机上关联模板

创建模板

image-20221213180906577

添加监控项

image-20221213181712612

关联主机

image-20221213181809843

查看是否更新数据

image-20221213182129242

 

五、总结zabbix自定义监控项,基于自定义监控项监控nginx。

基于zabbix实现邮件或微信告警。

5.1、注册企业微信

微信告警首先得注册一个企业微信,然后才能实现微信告警。

浏览器访问下面链接,注册企业微信

1
https://work.weixin.qq.com/

image-20221218093434434

5.2、创建部门和人员

5.2.1、创建部门

image-20221218093706256

5.2.2、加入人员

方法1: 直接微信邀请,让相关人员自行扫码加入

image-20221218094259182

方法2:手动添加人员

image-20221218094325434

5.3、将微信应用中添加相关的部门或人员

image-20221218094842011

image-20221218095111843

注意记下以下信息:

1
2
应用的 AgentId值1000002
应用的 Secret的值gc-CapCl6aSxmZm9knrTC_IqbwS70I5A8Q3BwywoXpY

image-20221218095518624

1
查看到企业ID的值为 ww488a1e5ba0db2852

5.4、授权可信ip

在应用中添加 企业可信IP (最近添加的功能,必须配置IP白名单才能发微信,否则会出错)

106.117.126.69 

image-20221218102330483

添加可信ip前还需要添加真实域名(因暂未添加,所以后面只展示步骤,不再展示测试结果)

image-20221218102904870

5.5、测试发送微信消息

image-20221218101302299

5.6、创建发送微信脚本

官方微信教程

官方微信API参考文档

1
https://developer.work.weixin.qq.com/document/path/90664

image-20221218103217343

官方微信API参考文档

1
https://developer.work.weixin.qq.com/document/path/91039

发送微信可以使用各种语言,下面使用shell脚本实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#查看zabbix server的配置文件
[root@zabbix_server ~]#grep AlertScriptsPath /etc/zabbix/zabbix_server.conf
### Option: AlertScriptsPath
# AlertScriptsPath=${datadir}/zabbix/alertscripts
AlertScriptsPath=/usr/lib/zabbix/alertscripts

#实现发信微信的脚本
[root@zabbix_server ~]#cd /usr/lib/zabbix/alertscripts
[root@zabbix_server alertscripts]#cat wechat.sh 
#!/bin/bash

CorpID="ww488a1e5ba0db2852"
Secret="gc-CapCl6aSxmZm9knrTC_IqbwS70I5A8Q3BwywoXpY"
GURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?
corpid=$CorpID&corpsecret=$Secret"
Token=$(/usr/bin/curl -s -G $GURL |awk -F\": '{print $4}'|awk -F\" '{print $2}')

PURL="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$Token"

function body(){
	local int agentid=1000002
	local UserID=$1
	local PartyID=2
	local Msg=$(echo "$@" | cut -d" " -f3-)
	printf '{\n'
	printf '\t"touser": "'"$UserID"\"",\n"
	printf '\t"toparty": "'"$PartyID"\"",\n"
	printf '\t"msgtype": "text",\n'
	printf '\t"agentid": "'"$agentid"\"",\n"
	printf '\t"text": {\n'
	printf '\t\t"content": "'"$Msg"\""\n"
	printf '\t},\n'
	printf '\t"safe":"0"\n'
	printf '}\n'
}

/usr/bin/curl --data-ascii "$(body $1 $2 $3)" $PURL

[root@zabbix_server alertscripts]#chmod +x wechat.sh

#发送测试微信,其中wangxiaochun为企业微信的帐号,并且不区分大小写,在通讯录的用户成员详情中可以看到帐号
[root@zabbix_server alertscripts]#./wechat.sh zhangtianxiang 微信告警标题 微信告警信息
{"errcode":60020,"errmsg":"not allow to access from your ip, hint: [1671332081303762937774104], from ip: 106.117.126.69, more info at https://open.work.weixin.qq.com/devtool/query?e=60020"}
#表示106.117.126.69这个IP地址不允许访问,只有上面的可信ip添加后才能使用

5.7、创建微信报警媒介类型

image-20221218105754672

报警媒介类型为脚本,脚本参数为以下三项

1
2
3
{ALERT.SENDTO}--收件人媒介
{ALERT.SUBJECT}--通知主题,因为微信没有主题,此项无效,可以不填写
{ALERT.MESSAGE}--通知内容

官方宏参考:

1
https://www.zabbix.com/documentation/5.0/zh/manual/appendix/macros/supported_by_location

image-20221218110019612

注意:此处可以只填写{ALERT.SENDTO}和{ALERT.MESSAGE}即可

image-20221218110305045

image-20221218110418418

修改消息模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#可以添加两个消息类型
# 问题
主题: 告警: {EVENT.NAME}
告警主机:{HOST.NAME1}
告警服务: {ITEM.NAME1}
告警Key1: {ITEM.KEY1}:{ITEM.VALUE1}
告警Key2: {ITEM.KEY2}:{ITEM.VALUE2}
严重级别: {TRIGGER.SEVERITY}
# 恢复 Problem Recovery
主题: 恢复: {EVENT.DURATION}: {EVENT.NAME}
恢复主机:{HOST.NAME1}
恢复服务: {ITEM.NAME1}
恢复Key1:{ITEM.KEY1}:{ITEM.VALUE1}
恢复Key2: {ITEM.KEY2}:{ITEM.VALUE2}

5.8、给Zabbix用户添加报警媒介

image-20221218110824993

5.9、创建动作

5.9.1、编辑已有动作

如果已经创建动作,可以修改已有动作,如下所示

image-20221218111152744

5.9.2、创建动作

如果之前没有动作,新创建动作

image-20221218111301406

 

 

 

六、总结zabbix自动发现监控

6.1、自动发现

6.1.1、Zabbix网络发现介绍

之前都是手动一台一台主机的添加到 Zabbix 中进行监控,很是繁琐,可以利用自动发现功能,自动添加被监控的主机

当众多的服务器都已经安装了agent或者snmp后,利用自动发现功能,Zabbix server 可以自动扫描预先配置好的ip段,自动添加主机,自动关联模板,自动加到主机组里等等。

网络发现功能更快速的部署zabbix、简化zabbix管理、并且在经常变动的环境里面也不需要花太多的精力,毕竟网络发现也能随时发现变化。

当然网络发现也不是万能的,虽然网络发现能干很多事情,但是它无法发现网络拓扑的变化。

由于自动发现效率比较低,严重消耗Zabbix Server资源和网络带宽,大规模环境中较少使用

自动发现虽然能自动完成发现并添加主机,但仍然存在一些问题

  • 发现时间长,效率较低

  • 扫描过程中容易漏扫

  • 当IP地址不固定难以实现

  • 无法实现不同类型主机关联不同模板

官方文档

1
https://www.zabbix.com/documentation/5.0/zh/manual/discovery/network_discovery
6.1.2、实现Zabbix网络发现

自动发现由两个步骤组成:

  • 发现discovery: Zabbix周期性地扫描在”网络发现规则”中定义的IP段,发现满足规则的主机

  • 动作action: 对这些主机完成动作,包括添加主机、添加模板、发送通知等等。

6.1.2.1、创建自动发现指定需要监控的网段

配置– 自动发现– 创建发现规则

image-20221218112135483

指定名称,IP范围和逢动发现检查等信息

image-20221218112450399

可见名称为IP地址

image-20221218112558972

6.1.2.2、创建添加主机的自动发现动作

创建新的动作

image-20221218112813468

image-20221218113431123

操作增加三个操作: 添加主机,添加群组,添加模板

image-20221218113149142

也可以添加发送消息给Admin等操作

image-20221218113552143

6.1.2.3、创建删除主机的自动发现动作

image-20221218113812972

image-20221218113919777

6.2、自动注册

6.2.1、自动注册介绍

当客户端众多时,将每台主机手动添加到Zabbix,还手动添加关联模板,无疑是低效的.

但是利用网络发现实现,Zabbix Server 资源消耗又比较严重

利用Zabbix的自动注册功能,实现添加主机的自动化,可以大幅减少运维的工作量,减少Zabbix Server 的资源消耗

此方式和自动发现不同,是由Active agent主动发起请求zabbix server将这些agent加到主机里。

注意: Agent 必须使用主动模式才支持自动注册

自动注册由于比自动发现效率更好,Zabbix Server资源消耗更少,更适合大规模及云环境IP地址不固定的场景使用

官方帮助

1
https://www.zabbix.com/documentation/5.0/zh/manual/discovery/auto_registration

在Zabbix agent 端的配置文件修改以下项目

1
2
3
4
5
6
Server=<Zabbix Server IP>
ServerActive=<Zabbix Server IP> #客户端主动模式是实现自动注册的前提条件
Hostname=<agent IP>
#HostnameItem=system.hostname    
HostMetadata==<key>           #非必须项,可以做为添加主机的验证标识和分类,或者实现加入主机的验证功能
HostMetadataItem=<监控项Item> #非必须项,监控项的值可以做为添加主机的验证标识和分类
6.2.2、修改Zabbix agent的配置
1
2
3
4
5
6
[root@Rocky8 ~]#vim /etc/zabbix/zabbix_agentd2.conf
Server=zabbix.magedu.org              #或者写server的IP地址10.0.0.190
ServerActive=zabbix.magedu.org        #或者写server的IP地址10.0.0.190
Hostname=web-10.0.0.18  #指定主机名,如果不指定,则服务器将使用agent的系统主机名
HostMetadata=web
[root@Rocky8 ~]#systemctl restart zabbix-agent2.service
6.2.3、在Zabbix Server配置动作

在配置—动作—选择自动注册动作

image-20221218115136642

指定动作中条件的主机名的值

image-20221218115333696

或者使用元数据添加

image-20221218115717334

1
2
3
#上图中的主机元数据值web和zabbix-agent2.conf里面的HostMetadata设置有关
HostMetadata=web
#HostMetadata设置是什么,到时候主机元数据值添对应的值

指定操作

image-20221218115528257

posted @   小洛兵  阅读(81)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示