> For the complete documentation index, see [llms.txt](https://hezhiqiang.gitbook.io/about-the-author/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hezhiqiang.gitbook.io/about-the-author/yun-wei-huan-jing-da-jian/centos-da-jian-zabbix-jian-kong-ping-tai.md).

# CentOS 安装 Zabbix 5.0

#### 博客作者：联系请[点击](https://hezhiqiang.gitbook.io/about-the-author/lian-xi-zuo-zhe)，搬运不易，希望请作者喝咖啡，可以点击联系[博客作者](https://hezhiqiang.gitbook.io/about-the-author/lian-xi-zuo-zhe)

## 前言

{% hint style="success" %}
说明：本文介绍CentOS 8.3 搭建 Zabbix5.0 监控平台安装及相关要求&#x20;
{% endhint %}

## 一、安装要求&#x20;

### 内存和磁盘&#x20;

Zabbix同时需要物理内存和磁盘空间。刚开始使用Zabbix，建议128MB物理内存和256MB可用磁盘空间。然而, 具体需要的内存大小和磁盘空间要根据主机数量和监控参数而定。如果你计划对监控的参数进行长期保存，你应该考虑至少在数据库中预留几个GB的空间，以用来保留历史数据。 每个Zabbix的守护进程需要与数据库服务器建立多个连接。分配给连接的内存数量，取决于数据库引擎的配置。&#x20;

### CPU&#x20;

根据监控参数及选择的数据库引擎，Zabbix，特别是Zabbix数据库，可能需要大量的CPU资源，

### 其他硬件&#x20;

如果需要启用短信（SMS）通知功能，需要串行通讯口（serial communication port）和串行GSM调制解调器（serial GSM modem）。USB转串行转接器也同样可以工作。

### [具体配置参考官方文档](https://www.zabbix.com/documentation/5.0/zh/manual/installation/requirements)

### 关闭NFtables和SElinux

```
systemctl disable --now firewalld.service
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
```

### &#x20;安装**系统常用软件包**

```python
dnf install -y sysstat traceroute  net-tools telnet  tree  \
net-snmp-utils  vim lrzsz tcpdump wget git zip tar
```

## 二、安装 **Zabbix 服务端**

### Zabbix 官方源

```
rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/8/x86_64/zabbix-release-5.0-1.el8.noarch.rpm
```

### 替换为阿里云Zabbix源

```
sed -i '3c baseurl=https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/8/$basearch/' /etc/yum.repos.d/zabbix.repo
```

### 安装 **Z**abbix 服务端

```bash
dnf -y install zabbix-server-mysql zabbix-web-mysql zabbix-apache-conf zabbix-agent vim
```

### 安装Apache和MariaDB并启动

```
dnf install -y @httpd @mariadb
systemctl enable --now httpd mariadb
```

### 数据库根用户添加密码及安全设置

```
mysql_secure_installation
```

#### 步骤如下：

> * 要求你配置VALIDATE PASSWORD component（验证密码组件）： 输入y ，回车进入该配置
> * 选择密码验证策略等级， 我这里选择0 （low），回车
> * 输入新密码两次
> * 确认是否继续使用提供的密码？输入y ，回车
> * 移除匿名用户？ 输入y ，回车
> * 不允许root远程登陆？ 不需要输入y，需要远程登陆输入n ，回车
> * 移除test数据库？ 输入y ，回车
> * 重新载入权限表？ 输入y ，回车

![](/files/-McmTVNxyPysCAeEFKT5)

#### 查询下root是否可以远程登陆，没有就配置一下

```sql
mysql -uroot -p

use mysql;
select host,user from user;
```

#### 配置远程登陆

```sql
mysql -uroot -p

use mysql;
update user set host='%' where user='root';
flush privileges;
exit
```

#### 关闭MySQL主机查询dns

{% hint style="success" %}
MySQL会反向解析远程连接地址的dns记录，如果MySQL主机无法连接外网，则dns可能无法解析成功，导致第一次连接MySQL速度很慢，所以在配置中可以关闭该功能。
{% endhint %}

#### 给`/etc/my.cnf`文件，添加配置

```bash
echo "[mysqld] 
skip-name-resolve" >> /etc/my.cnf
```

#### 重启服务

```bash
systemctl restart mysqld
```

#### 创建zabbix数据库，在数据库主机上运行以下内容。

```
mysql -uroot -p
```

```sql
create database zabbix character set utf8 collate utf8_bin;
show databases;
create user zabbix@localhost identified by 'password';
flush privileges;
grant all privileges on zabbix.* to zabbix@localhost;
quit;
```

#### 在 Zabbix 服务端主机上导入初始架构和数据。

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

## 三、启动Zabbix Server进程

{% hint style="info" %}
**zabbix\_server.conf 配置说明**

* **ListenPort 监听端口，默认10051**
* **SourceIP 源ip，默认为空，可以写机器ip地址**

  SourceIP=机器ip
* **LogType    日志类型，system\file\console，默认file**
* **LogFile     日志路径，默认/var/log/zabbix/zabbix\_server.log**

  LogFile=/var/log/zabbix/zabbix\_server.log
* **LogFileSize     日志大小，0-1024MB，0禁用自动日志轮换**

  LogFileSize=0
* **DebugLevel    调试级别，0\~5，默认为3显示waring信息**
* **PidFile    pid文件，默认/var/run/zabbix/zabbix\_server.pid**

  PidFile=/var/run/zabbix/zabbix\_server.pid
* **SockerDir    socker文件夹，默认/var/run/zabbix**

  SocketDir=/var/run/zabbix
* **DBHOst    数据库地址，默认127.0.0.1**
* **DBName    数据库名称，默认 zabbix**

  DBName=zabbix
* **DBSchema    数据库dschema，默认 空**
* **DBUser    数据库用户，默认zabbix**

  DBUser=zabbix
* **DBPassword    数据库密码**

  DBPassword=zabbixmysql
* **DBSocket    DBScoket地址**
* **DBPort    数据库端口，默认为空，**
* **HistoryStorageURL    历史存储的HTTP地址**
* **HistoryStorageTypes    用逗号分隔的类型列表，uint\dbl\str\log\text**
* **HistoryStorageDateIndex    是否历史记录预处理 0 disable，1 enable**
* **ExportDir    导出路径**
* **ExportFileSize    导出文件大小1M\~1G，默认1G**
* **StartPollers    预分叉的轮询器实例数，默认5**
* **StartIPMIPollers    IPMI轮询器数量**
* **StartPreprocessors    启动预处理器数量，默认3**
* **StartPollersUnreachable    无法访问是轮询次数**
* **StartTrappers**
* **StartPingers    ICMP预习处理数**
* **StartDiscoverers    发现者预处理数**
* **StartHTTPPollers    HTTP查询器预处理数**
* **StartTimers    计时器数**
* **JavaGateway    zabbix网关ip地址或主机名，仅在启动java轮询器时需要**

  JavaGateway=机器当前ip
* **JavaGatewayPort    zabbix网关的监听端口，默认10052**
* **StartJavaPollers    java轮询器预处理数**

  StartJavaPollers=5
* **StartVMwareCollectors    虚拟收集器的数量**
* **SNMPTrapperFile    SNMPtrapper文件，从snmp守护进程传递到服务器的临时文件**

  SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
* **StartSNMPTrapper    为1，启动SNMPTrapper**
* **ListenIP    trapper监听的端口列表，用逗号分隔**
* **CacheSize    缓存**
* **Timeout    SNMP服务和外部检查超时时间**

  Timeout=4
* **AlertScriptsPath    预警脚本位置**

  AlertScriptsPath=/usr/lib/zabbix/alertscripts
* **ExternalScripts    外部脚本路径**

  ExternalScripts=/usr/lib/zabbix/externalscripts
* **LogSlowQueries    定义数据库慢查询时长，单位毫秒**

  LogSlowQueries=3000
* **StatsAllowedIP    允许访问的ip列表，用逗号分隔0.0.0.0/0代表所有ipv4地址**

  StatsAllowedIP=0.0.0.0/0
  {% endhint %}

### &#x20;**在zabbix\_server.conf中编辑配置**

```bash
vim /etc/zabbix/zabbix_server.conf
ListenPort=10051
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=password
```

### &#x20;**编辑Zabbix前端的PHP配置**

{% hint style="info" %}
&#x20;**PHP 优化，如有需要可根据相关参数进行优化**

```
vim /etc/php.ini 
```

* `expose_php = Off`                             # 禁止显示php版本的信息&#x20;
* `short_open_tag = On`           # 取消前面的;，修改为On。表示支持php短标签&#x20;
* `cgi.fix_pathinfo=1`            # 将注释去掉，开启PHP的pathinfo伪静态功能。&#x20;
* `post_max_size = 100M`                     # 单提交的最大数据，此项不是限制上传单个文件的大小,而是针对整个表单的提交数据进行限制的，默认8M&#x20;
* `upload_max_filesize = 50M`     #上载文件的最大许可大小 ，默认2M&#x20;
* `max_execution_time = 600`             # 脚本运行的最长时间，默认30秒&#x20;
* `max_input_time = 600`                     # 脚本可以消耗的时间，默认60秒&#x20;
* `memory_limit = 256M`                       # 脚本运行最大消耗的内存，根据你的需求更改数值，默认128M
* `date.timezone = asia/shanghai` #设置时区
  {% endhint %}

```bash
sed -i '$a php_value[date.timezone] = Asia/Shanghai' /etc/php-fpm.d/zabbix.conf
```

### 启动 Zabbix 服务器和代理进程，并设置开机自启动

```
systemctl restart zabbix-server zabbix-agent httpd php-fpm
systemctl enable --now zabbix-server zabbix-agent httpd php-fpm
```

### Zabbix前端可以在浏览器中通过 <http://localhost/zabbix> 进行访问。&#x20;

![](/files/-McbSX-ZtkjB9BSiWFbH)

### 配置 Zabbix 前端

{% hint style="info" %}

1. 输入数据库连接端口，zabbix数据库密码，输入名称&#x20;
2. 默认的用户是Admin，密码为zabbix，该用户是超级用户，输入登录信息后，点击Sign In按钮，进行登录 左下角设置可以切换语言
   {% endhint %}

#### 数据库配置，输入数据库连接端口，zabbix数据库密码

![](/files/-McbSms18BZznhaFOw7N)

#### Zabbix Server 配置，输入名称

![](/files/-McbQlmMM_Swoa-GnhWW)

#### 确认配置信息

![](/files/-McbSK9DnDTszmZH6K4A)

#### 默认的用户是Admin，密码为zabbix

![](/files/-Mc_y7ao9x-y_dFZ5Zq2)

#### **更换web页面显示语言，切换为zh\_CN**

![](/files/-MceALcir7bk96q5Cp69)

### **解决Zabbix 图形中文乱码**

![](/files/-McbUF-h_mNeTPK7fiN_)

#### 字体文件目录:

```
zabbix 4.0：/usr/share/zabbix/fonts/
zabbix 4.2：/usr/share/zabbix/assets/fonts/
zabbix5.0：/usr/share/zabbix/assets/fonts
```

#### php 脚本文件位置:

```
/usr/share/zabbix/include/defines.inc.php
```

{% hint style="info" %}
我这里安装的是zabbix5.0，进入到`/usr/share/zabbix/assets/fonts`目录，可以看到一个`graphfont.ttf`软连接，默认指向`/etc/alternatives/zabbix-web-font`这个字体文件，由于php配置文件已经配置好了graphfont.ttf，所以这个软连接指向哪个字体文件就使用哪个文件&#x20;
{% endhint %}

![](/files/-Mc_z_yUfA1w1eFRBtGN)

#### 下载一个微软雅黑**字体**

```
cd /usr/share/zabbix/assets/fonts
wget https://raw.githubusercontent.com/chenqing/ng-mini/master/font/msyh.ttf
mv -f msyh.ttf /usr/share/fonts/dejavu/DejaVuSans.ttf
systemctl restart zabbix-server 
```

![](/files/-McbUzT7U3myZF0D_MPL)

## 四、安装 **Zabbix** 客户端

### 关闭NFtables和SElinux

```
systemctl disable --now firewalld.service
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
```

### &#x20;安装**系统常用软件包**

```python
dnf install -y sysstat traceroute  net-tools telnet  tree  \
net-snmp-utils  vim lrzsz tcpdump wget git zip tar
```

{% hint style="danger" %}
**注意：**&#x8FD9;里需要下载和Zabbix Server版本一致的Zabbix Agent 软件包和Yum源
{% endhint %}

### Zabbix 官方源

```
rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/8/x86_64/zabbix-release-5.0-1.el8.noarch.rpm
```

### 替换为阿里云Zabbix源

```
sed -i '3c baseurl=https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/8/$basearch/' /etc/yum.repos.d/zabbix.repo
```

### 安装 **Z**abbix 客户端

```bash
dnf -y install  zabbix-agent zabbix-sender
```

### 配置zabbix\_agent.conf客户端

{% hint style="info" %}

#### zabbix\_agent.conf配置说明

* **PidFile    Pid文件**

  PidFile=/var/run/zabbix/zabbix\_agentd.pid
* **LogType    日志类型，system\file\console，默认file**
* **LogFile      日志文件**

  LogFile=/var/log/zabbix/zabbix\_agentd.log
* **LogFileSize     日志大小，0-1024MB，0禁用自动日志轮换**

  LogFileSize=0
* **DebugLevel    调试级别，0\~5，默认为3显示waring信息**
* **SourceIP 源IP，默认为空，可以写机器IP地址**

  SourceIP=机器IP
* **AllowKey    允许执行的项目键**
* **DenyKey**
* **Server    zabbix-server的IP或名称，列出主机接受传入的连接**

  Server=服务端机器IP
* **ListenPort    监听端口，默认10050**
* **ListenIP    监听IP，zabbix-agent的IP**

  ListenIP=机器IP
* **StartAgents    监听的服务，zabbix-server的IP地址**

  ServerActive=服务端机器IP:10051
* **Hostname    主机名zabbix-agent的IP，在zabbix-web上添加hosts时用这个名称**

  Hostname=机器的名称
* **UnsafeUserParameters=1  默认为0，不允许使用以下字符 ' " \` \* ? \[ ] { } \~ $ ! & ; ( ) < > | # @，此外，不允许换行符，修改为1，表示自定义脚本中可以包含特殊字符。**
* **HostMetadataItem     主机元数据,默认是system.uname，当Agent程序向服务端发送自动注册请求时，会发送其主机名，在某些情况下，Zabbix服务器的主机名不足以区分发现的主机，主机元数据可将其他信息从Agent发送到服务端。**
  {% endhint %}

```
vim /etc/zabbix/zabbix_agentd.conf
Server=192.168.186.139           # 服务器IP
ServerActive=192.168.186.139     # 服务器IP
Hostname=hezhiqiang-agent01      # 客户端主机名
UnsafeUserParameters=1           # 默认为0，修改为1，表示自定义脚本中可以包含特殊字符。
HostMetadataItem=system.uname    # 主机元数据
```

### 启动 Zabbix 代理进程，并设置开机自启动

```
systemctl enable --now zabbix-agent.service
```

## 五、Zabbix5.0 监控 Nginx

### **安装 Nginx**

```bash
vim /etc/yum.repos.d/nginx.repo
```

```bash
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
```

```bash
 dnf makecache timer
 dnf info nginx
 dnf install -y nginx
```

![](/files/-MKtOLheBIdiHJurxSr0)

```bash
 rm -rf /etc/nginx/conf.d/default.conf
```

### 查看当前Nginx是否已安装内置运行状态模块

```python
nginx -V
```

![](/files/-McnIwjOQu90hKAkfQ3a)

从命令返回值中出现“`--with-http_stub_status_module`”这一个模块即代表内置运行状态模块已开启

### 开启运行状态模块，编辑Nginx配置文件

{% hint style="warning" %}
**注意：**&#x73;tub\_status模块只能应用在server或者location下
{% endhint %}

```python
vim /etc/nginx/nginx.conf
 
参考以下内容进行修改：
server {
        location /status {              #定义运行状态页面名称，页面为status
        stub_status on;                 #开启模块
        access_log off;                 #不开启访问日志记录
        allow 127.0.0.1;                #运行127.0.0.1地址访问此网页
        allow 192.168.186.0/24;         #只运行192.168.186.0网段的主机访问此网页
        deny all;                       #其余网段主机不允许访问
 }
}
```

![](/files/-McnLQWGOloaHWRzkxJd)

#### 检查配置文件语法是否正确，然后重启nginx服务

```python
nginx -t
systemctl restart nginx
```

#### 浏览器访问运行状态页面

{% hint style="info" %}
<http://IP/status>

页面内容解析：&#x20;

```
Active connections: 2 
server accepts handled requests
 2 2 1 
Reading: 0 Writing: 1 Waiting: 1 
```

* Active connections：当前活动的客户端连接数有多少（包括在等待阶段的）&#x20;
* accepts：接受的客户端连接总数&#x20;
* handled：已处理的连接总数（通常与accepts数量一致，但存在某些资源限制的情况导致数量不一致）&#x20;
* requests：客户端请求总数（包括接受请求或拒绝请求的）&#x20;
* Reading：nginx正在读取请求标头的当前连接数。&#x20;
* Writing：nginx正在将响应写回到客户端的当前连接数。&#x20;
* Waiting：当前等待请求的空闲客户端连接数。

[具体stub\_status模块信息可查看官方文档](https://nginx.org/en/docs/http/ngx_http_stub_status_module.html)
{% endhint %}

![](/files/-McnMKTYfD1B8FwdQVHe)

### 编写监控脚本

```python
mkdir /etc/zabbix/script
vim /etc/zabbix/script/nginx_status.sh
 
#!/bin/bash

#function: monitor nginx1.16 for zabbix5.0
#blog: he.zhiqiang.cloud
#version: 1.0
#date: 2021/6/22

#定义Nginx status页面
ngx_status="http://127.0.0.1/status"

#判断status页面是否存活
ngx_status_code() {
        http_code=`curl -o /dev/null -s -w %{http_code} ${ngx_status}`
        if [ ${http_code} == "200" ];then
                return 1
        else
                echo "Nginx status is not running."
        fi
}

#获取当前活动的客户端连接数
active() {
        ngx_status_code || curl -s ${ngx_status} | grep "Active" | awk '{print $NF}'
}

#获取接收客户端连接的总数量
accepts() {
        ngx_status_code || curl -s ${ngx_status} | awk NR==3 | awk '{print $1}'
}

#获取已处理的连接总数量
handled() {
        ngx_status_code || curl -s ${ngx_status} | awk NR==3 | awk '{print $2}'
}

#获取客户端请求总数量
requests() {
        ngx_status_code || curl -s ${ngx_status} | awk NR==3 | awk '{print $3}'
}

#获取正在读取请求标头的当前连接数量
reading() {
        ngx_status_code || curl -s ${ngx_status} | grep "Reading" | awk '{print $2}'
}

#获取正在将响应写回到客户端的当前连接数量
writing() {
        ngx_status_code || curl -s ${ngx_status} | grep "Writing" | awk '{print $2}'
}

#获取当前正在等待响应的客户端连接数量
waiting() {
        ngx_status_code || curl -s ${ngx_status} | grep "Waiting" | awk '{print $2}'
}

#使用位置变量控制脚本输出
case $1 in
        active)
                active;;
        accepts)
                accepts;;
        handled)
                handled;;
        requests)
                requests;;
        reading)
                reading;;
        writing)
                writing;;
        waiting)
                waiting;;
        *)
                echo "Unknown options"
esac

```

```python
chmod +x /etc/zabbix/script/nginx_status.sh
```

### 创建自定义监控项

{% hint style="success" %}

#### 说明：自定义监控项，格式为：UserParameter=<键值>,<命令>。

{% endhint %}

比如第一个自定义键值为：`nginx.active`，要执行的命令为执行`nginx_status.sh`这个脚本。

```python
vim /etc/zabbix/zabbix_agentd.d/userparameter_nginx.conf

UserParameter=nginx.active,bash /etc/zabbix/script/nginx_status.sh active
UserParameter=nginx.accepts,bash /etc/zabbix/script/nginx_status.sh accepts
UserParameter=nginx.handled,bash /etc/zabbix/script/nginx_status.sh handled
UserParameter=nginx.requests,bash /etc/zabbix/script/nginx_status.sh requests
UserParameter=nginx.reading,bash /etc/zabbix/script/nginx_status.sh reading
UserParameter=nginx.writing,bash /etc/zabbix/script/nginx_status.sh writing
UserParameter=nginx.waiting,bash /etc/zabbix/script/nginx_status.sh waiting
```

{% hint style="info" %}

#### 说明：添加完成以后，重启zabbix\_agentd才会生效。

{% endhint %}

## 六、Zabbix Server Web界面添加被监控主机

### 配置——主机群组——创建主机群组——输入组名&#x20;

要在Zabbix页面创建主机组，请执行以下步骤:

* 进入: 配置 → 主机组
* 单击页面右上角的创建主机群组
* 在表单中输入组的相关参数

![](/files/-McgTZkYlI1ult7_0DnQ)

### **配置——主机——创建主机**

按照以下步骤在Zabbix前端创建一台主机：

* 进入： 配置 → 主机
* 单击页面右上角 创建主机 (或者在主机名上单击以编辑一台已有的主机)
* 在表单中输入主机的相关参数

![](/files/-McgVgzB4jmJ1RUOud--)

### **配置——模板——创建模板**

要创建模板，请执行以下操作：

* 转到配置→模板
* 点击创建模板
* 编辑模板属性

![](/files/-McnW52eHF8SywxxSNvT)

### **主机——监控项——创建监控项**

要在Zabbix管理页面创建一个监控项，请执行以下操作：

* 进入到: 配置 → 主机
* 在主机所在的行单击 监控项
* 点击屏幕右上角的创建监控项
* 输入表单中监控项的参数

![](/files/-McnfPCmqwmrKyKkWkIh)

### **主机——触发器——创建触发器**

配置一个触发器，进行下面步骤：

* 进入：配置 → 主机
* 点击主机一行的 触发器
* 点击右上角的 创建触发器（或者点击触发器名称去修改一个已存在的触发器）
* 在窗口中输入触发器的参数

![](/files/-Mcl1v9q5ypRD_6vAadS)

### **主机——图形——创建图形**

* 前往 配置 → 主机 (或模板) 页；
* 点击所要创建图**形**的主机或模板旁的 图形链接；
* 在跳转的图表页的上，点击创建图表按钮；
* 编辑图表的属性。

![](/files/-Mcl2sA5380oSTHrcYEz)

## **七、在Zabbix Server 中添加告警媒介**

### **添加企业微信机器人告警脚本**

{% hint style="success" %}
**zabbix\_server.conf 文件中定义脚本目录，这里就选择了默认的目录**

#### AlertScriptsPath=/usr/lib/zabbix/alertscripts

{% endhint %}

#### 进入该定义的脚本存放路径下，创建用来推送告警消息的脚本

```python
vim /usr/lib/zabbix/alertscripts/wechat.py

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# zabbix企业微信报警
import requests, json, sys, os, datetime

#微信钩子机器人地址
webhook = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxxxxxxxxxx"

#zabbix传过来的三个变量
user = sys.argv[1]
title = sys.argv[2]
text = sys.argv[3]

#每发送一次报警，就记一次日志
file = r"/var/log/zabbix/send2wechat.log"

#报警的信息
data = {
    "msgtype": "markdown",
    "markdown": {
        "content": title + "\n" + text
    }
}

#请求这个钩子机器人
headers = {'Content-Type': 'application/json'}
x = requests.post(url=webhook, data=json.dumps(data), headers=headers)
if os.path.exists(file):
    f = open(file, "a+")
else:
    f = open(file, "w+")
    f.write(" " + " - -" * 30)
    f.write("\n")

#记录日志
if x.json()["errcode"] == 0:
    f.write(" "+ str(datetime.datetime.now()) + " " + str(user) + " " + "发送成功" + " " + str(title) + "\n")
    f.close()
else:
    f.write(" "+ str(datetime.datetime.now()) + " " + str(user) + " " + "发送失败" + " " + str(title) + "\n")
    f.close()
```

{% embed url="<https://work.weixin.qq.com/api/doc/90000/90136/91770#markdown%E7%B1%BB%E5%9E%8B>" %}

#### 赋予脚本执行权限

```python
chmod +x /usr/lib/zabbix/alertscripts/wechat.py   
```

#### 安装python3.9版本

```python
dnf -y install python39  
```

#### Python3安装requests模块

```python
pip3 install requests
```

#### 测试脚本，告警推送

```python
python3 /usr/lib/zabbix/alertscripts/wechat.py  您好，监控测试
```

![](/files/-McjR5lzVrLn5E0HsRJJ)

### **管理——报警媒介类型——创建媒介类型**

新建一个企业微信的报警，脚本名称就是我们脚本名 `wechat.py`

{% hint style="info" %}
参数：

* {ALERT.SENDTO}
* {ALERT.SUBJECT}
* {ALERT.MESSAGE}
  {% endhint %}

![](/files/-McjTH_TjoavgP9-EMLV)

### **管理——报警媒介类型——**&#x4D;essage templates

{% hint style="info" %}

#### 自定义消息模板， 参考[宏使用](https://www.zabbix.com/documentation/4.0/zh/manual/appendix/macros/supported_by_location?s%5B%5D=alert\&s%5B%5D=sendto) <a href="#zi-ding-yi-xiao-xi-mo-ban" id="zi-ding-yi-xiao-xi-mo-ban"></a>

故障模板：

```python
主题：# 服务故障: <font color="warning">{EVENT.NAME}</font>
消息：
{
> 告警主机: **{HOST.NAME}**
> 主机地址: **{HOST.IP}**
> 监控项目: {ITEM.NAME}
> 当前取值: {ITEM.LASTVALUE}
> 告警等级: {TRIGGER.SEVERITY}
> 告警时间: {EVENT.DATE}-{EVENT.TIME}
> 事件ID: {EVENT.ID}
}
```

{% endhint %}

![](/files/-McnvrmfQl5sOMRTFEgD)

#### 效果：

![](/files/-Mcnv4UY9Rl-5vPQhzmT)

{% hint style="info" %}
恢复故障模板

```python
主题：# 故障恢复: <font color="info">{EVENT.NAME}</font>
消息：
{
> 主机名称: **{HOST.NAME}**
> 主机地址: **{HOST.IP}**
> 告警名称: {EVENT.NAME}
> 持续时长: {EVENT.DURATION}
> 恢复时间: {EVENT.RECOVERY.DATE}-{EVENT.RECOVERY.TIME} 
> 当前状态: {TRIGGER.STATUS}
> 当前取值: {ITEM.LASTVALUE}
> 事件ID: {EVENT.ID}
}
```

{% endhint %}

![](/files/-Mcnvz_bHIj17sIp9z1J)

**效果:**

![](/files/-McnvC0I0njlf9Ab9Y4p)

**管理 --> 报警 --> 媒介类型 --> 企业微信报警 --> Message templates --> 编辑 --> 更新**

![](/files/-MclBNbJPGDgoeyDtLoe)

### **用户设置——报警媒介——添加媒介类型**

![](/files/-McjU4z8zv9YKOEociij)

#### 更新告警媒介

![](/files/-McjUxoJ-t80SWcsBiLG)

### **配置——动作——创建动作——添加触发器**

#### **配置动作**

![](/files/-MckmH3IdW1Q4BzvXIuB)

![](/files/-MclDUY40Q0qIU9pTl-P)

#### **修改操作 --> 步骤 1-0（无穷大）**

![](/files/-MclDEXNb2XKMSTsP1g-)

## 八、测试故障，查看报表是否已经推送成功

```python
systemctl stop nginx
```

### **报表——动作日志**

![](/files/-McoLhNoU687VYOkVbwe)
