> ## Documentation Index
> Fetch the complete documentation index at: https://doc.lwops.cn/llms.txt
> Use this file to discover all available pages before exploring further.

# Zabbix 告警推送乐维事件平台配置教程

> [!TIP]
>
> 本文介绍Zabbix新增触发器告警实时推送至乐维事件平台的完整流程，包含接口准备、脚本部署、媒介配置、告警验证及故障排查
>
> 适用于 Zabbix 7.0.x 与乐维智能体 8.2.x，已在 Zabbix 7.0.32 环境完成真实告警链路验证。

## 一. 方案概览

本方案只负责 Zabbix → 乐维的告警事件同步：

* 不同步 Zabbix 主机、模板等资源到乐维
* 不反向采集 Zabbix 指标
* 不自动补推历史告警

```mermaid theme={null}
flowchart LR
    A[Zabbix 触发器产生告警] --> B[触发器动作匹配]
    B --> C[报警媒介脚本]
    C --> D[组装报文并计算 SHA1 签名]
    D --> E[调用乐维告警接收接口]
    E --> F[乐维事件平台展示告警]

    G[Zabbix 问题恢复] --> H[恢复操作]
    H --> I[复用同一个 EVENT.ID]
    I --> J[调用乐维恢复接口]
    J --> K[乐维对应告警恢复]
```

**接口信息**：

| 用途 | 请求方式 | 接口地址 |
| - | - | - |
| 告警产生 | `POST` | `http://<乐维平台地址>/backend_api/api/v6/aialert/receive` |
| 告警恢复 | `POST` | `http://<乐维平台地址>/backend_api/api/v6/aialert/recovery` |

## 二. 准备乐维侧参数

需要获取 4 个参数：

| 参数 | 说明 | 获取方式 |
| - | - | - |
| LwReqUrl | 接口基础地址 | [http://乐维平台地址/backend\_api](http://乐维平台地址/backend_api) |
| apikey | API 签名密钥 | 乐维服务器 .env 文件中的 API\_SECRET\_KEY |
| appid | 应用 ID | 乐维集成应用生成 |
| token | 应用密钥 | 乐维集成应用生成 |

**（1）LwReqUrl**

一般为：

```text theme={null}
http://乐维平台地址/backend_api
```

**（2）apikey**

在乐维服务器执行：

```bash theme={null}
grep API_SECRET_KEY /itops/nginx/html/lwjk_app/.env
```

输出类似：

```shell theme={null}
API_SECRET_KEY=YOUR_API_KEY
```

![Zabbixduijieshijianpingt1104](https://mintcdn.com/lerwee/eGViYg2BSv5NCGmP/images/zabbixduijieshijianpingt1104.png?fit=max\&auto=format\&n=eGViYg2BSv5NCGmP\&q=85\&s=b2deaa52cacddc2ac82467fe6d3d7277)

将 `YOUR_API_KEY` 对应的实际值保存好，仅写入服务器本地配置文件，不要在文档、截图或群聊中扩散。

**（3）appid 和 token**

在乐维 Web 端进入：

```text theme={null}
系统管理 → 集成系统 → 新增应用
```

推荐配置：

| 配置项 | 值 |
| - | - |
| 应用名称 | Zabbix告警接入 |
| 应用场景 | 事件平台 |
| 接入平台类型 | 通过第三方推送 |

![Zbxsjpt0011104](https://mintcdn.com/lerwee/tS5TdvL35_Xj6yul/images/zbxsjpt0011104.png?fit=max\&auto=format\&n=tS5TdvL35_Xj6yul\&q=85\&s=33887f585a9d5e96465445fd2268bb9c)

保存后生成 `appid` 和 `token`。

> [!WARNING]
>
> `apikey`、`appid`、`token` 均属于敏感信息，只应写入 Zabbix Server 本地配置文件，不要在文档、截图、群聊或社区帖子中明文展示。

## 三. 部署 Zabbix Server 转发脚本

以下操作在 Zabbix Server 所在 Linux 服务器执行。

### **1. 确认脚本目录**

```bash theme={null}
grep AlertScriptsPath /etc/zabbix/zabbix_server.conf
```

本文以 /usr/lib/zabbix/alertscripts 为例。如实际路径不同，请替换命令。

### **2. 创建配置文件**

```bash theme={null}
vi /etc/zabbix/lerwee_event.json
```

写入以下内容，并替换为实际获取到的 4 个参数值：

```json theme={null}
{
  "url": "http://乐维平台地址/backend_api",
  "apikey": "<API_SECRET_KEY>",
  "appid": "<appid>",
  "token": "<token>"
}
```

![Zabbixduijielwsj021104](https://mintcdn.com/lerwee/eGViYg2BSv5NCGmP/images/zabbixduijielwsj021104.png?fit=max\&auto=format\&n=eGViYg2BSv5NCGmP\&q=85\&s=89d3adb51f9ac91d4a6383657987b0d3)

设置配置文件权限：

```bash theme={null}
chown root:zabbix /etc/zabbix/lerwee_event.json
chmod 640 /etc/zabbix/lerwee_event.json
```

### **3. 网络连通性验证**

```bash theme={null}
curl http://乐维平台地址/backend_api/
```

返回 `code=0` 表示入口可达。

```bash theme={null}
curl http://乐维平台地址/backend_api/api/v6/aialert/receive
```

返回 `405 Method Not Allowed` 属于正常现象，因为该接口只允许 `POST` 请求。

![Zabbixdjsjpt041104](https://mintcdn.com/lerwee/eGViYg2BSv5NCGmP/images/zabbixdjsjpt041104.png?fit=max\&auto=format\&n=eGViYg2BSv5NCGmP\&q=85\&s=38fa1199d8941afd1d8d78862b9bab93)

### **4. 检查运行依赖**

先确认以下命令都存在，本文脚本才能直接使用：

```bash theme={null}
command -v bash
command -v curl
command -v awk
command -v sed
command -v sha1sum || command -v shasum || command -v openssl
```

| 依赖 | 用途 |
| - | - |
| `bash` | 执行转发脚本 |
| `curl` | 调用乐维 HTTP 接口 |
| `awk` | JSON 转义与结果处理 |
| `sed` | 解析配置和响应 |
| `sha1sum` / `shasum` / `openssl` | 任选其一，用于计算 SHA1 签名 |

> [!TIP]
>
> 本方案不依赖 Python、Python3 或 jq，适合无法额外安装组件的 Zabbix Server 环境。

### **5. 创建转发脚本**

创建脚本。如果你的脚本目录不是 `/usr/lib/zabbix/alertscripts`，请替换为实际的 `AlertScriptsPath`：

```bash theme={null}
vi /usr/lib/zabbix/alertscripts/lerwee_event.sh
```

写入以下完整内容：

```bash theme={null}
#!/bin/bash
set -u

die() {
    echo "ERROR: $*" >&2
    exit 2
}

need_value() {
    [ "$#" -gt 0 ] || die "missing argument value"
}

CONFIG=""
MODE=""
EVENT_ID=""
LEVEL=""
TITLE=""
OBJECT=""
IP=""
DESCRIPTION=""
OBJECT_TYPE=""
OBJECT_GROUP=""

while [ "$#" -gt 0 ]; do
    key="$1"
    shift
    case "$key" in
        --config) need_value "$@"; CONFIG="$1"; shift ;;
        --mode) need_value "$@"; MODE="$1"; shift ;;
        --event-id) need_value "$@"; EVENT_ID="$1"; shift ;;
        --level) need_value "$@"; LEVEL="$1"; shift ;;
        --title) need_value "$@"; TITLE="$1"; shift ;;
        --object) need_value "$@"; OBJECT="$1"; shift ;;
        --ip) need_value "$@"; IP="$1"; shift ;;
        --description) need_value "$@"; DESCRIPTION="$1"; shift ;;
        --object-type) need_value "$@"; OBJECT_TYPE="$1"; shift ;;
        --object-group) need_value "$@"; OBJECT_GROUP="$1"; shift ;;
        *) die "unknown argument: $key" ;;
    esac
done

[ -n "$CONFIG" ] || die "--config is required"
[ -r "$CONFIG" ] || die "config file not readable: $CONFIG"
[ "$MODE" = "problem" ] || [ "$MODE" = "recovery" ] || die "--mode must be problem or recovery"
[ -n "$EVENT_ID" ] || die "--event-id is required"

cfg() {
    tr -d '\r' < "$CONFIG" | sed -n "s/.*\"$1\"[[:space:]]*:[[:space:]]*\\([^\"]*\\)\".*/\\1/p" | head -n 1
}

URL="$(cfg url)"
APIKEY="$(cfg apikey)"
APPID="$(cfg appid)"
TOKEN="$(cfg token)"

[ -n "$URL" ] || die "config missing required fields: url"
[ -n "$APIKEY" ] || die "config missing required fields: apikey"
[ -n "$APPID" ] || die "config missing required fields: appid"
[ -n "$TOKEN" ] || die "config missing required fields: token"

URL="${URL%/}"
TIMESTAMP="$(date +%s)"

json_escape() {
    awk 'BEGIN { RS=sprintf("%c",1); cr=sprintf("%c",13); lf=sprintf("%c",10); tab=sprintf("%c",9) } { gsub(/\\/, "\\\\"); gsub(/"/, "\\\""); gsub(cr, "\\r"); gsub(lf, "\\n"); gsub(tab, "\\t"); printf "%s", $0 }'
}

if [ "$MODE" = "problem" ]; then
    [ -n "$LEVEL" ] || die "--level is required in problem mode"
    [ -n "$TITLE" ] || die "--title is required in problem mode"
    [ -n "$OBJECT" ] || die "--object is required in problem mode"

    case "$LEVEL" in
        0|1) LEVEL=1 ;;
        2) LEVEL=2 ;;
        3) LEVEL=3 ;;
        4) LEVEL=4 ;;
        5) LEVEL=5 ;;
        *) die "invalid level: $LEVEL, expected 0-5" ;;
    esac

    DATA='{'
    DATA="${DATA}\"appid\":\"$(printf '%s' "$APPID" | json_escape)\""
    DATA="${DATA},\"token\":\"$(printf '%s' "$TOKEN" | json_escape)\""
    DATA="${DATA},\"event_id\":\"$(printf '%s' "$EVENT_ID" | json_escape)\""
    DATA="${DATA},\"event_time\":$TIMESTAMP"
    DATA="${DATA},\"level\":$LEVEL"
    DATA="${DATA},\"title\":\"$(printf '%s' "$TITLE" | json_escape)\""
    DATA="${DATA},\"object\":\"$(printf '%s' "$OBJECT" | json_escape)\""
    [ -n "$IP" ] && DATA="${DATA},\"ip\":\"$(printf '%s' "$IP" | json_escape)\""
    [ -n "$DESCRIPTION" ] && DATA="${DATA},\"description\":\"$(printf '%s' "$DESCRIPTION" | json_escape)\""
    [ -n "$OBJECT_TYPE" ] && DATA="${DATA},\"object_type\":\"$(printf '%s' "$OBJECT_TYPE" | json_escape)\""
    [ -n "$OBJECT_GROUP" ] && DATA="${DATA},\"object_group\":\"$(printf '%s' "$OBJECT_GROUP" | json_escape)\""
    DATA="${DATA}}"
    ENDPOINT="${URL}/api/v6/aialert/receive"
else
    DATA='{'
    DATA="${DATA}\"appid\":\"$(printf '%s' "$APPID" | json_escape)\""
    DATA="${DATA},\"token\":\"$(printf '%s' "$TOKEN" | json_escape)\""
    DATA="${DATA},\"event_id\":\"$(printf '%s' "$EVENT_ID" | json_escape)\""
    DATA="${DATA},\"recovery_time\":$TIMESTAMP"
    DATA="${DATA}}"
    ENDPOINT="${URL}/api/v6/aialert/recovery"
fi

SIGN_INPUT="${APIKEY}data${DATA}timestamp${TIMESTAMP}"

if command -v sha1sum >/dev/null 2>&1; then
    SIGN="$(printf '%s' "$SIGN_INPUT" | sha1sum | awk '{print $1}')"
elif command -v shasum >/dev/null 2>&1; then
    SIGN="$(printf '%s' "$SIGN_INPUT" | shasum -a 1 | awk '{print $1}')"
elif command -v openssl >/dev/null 2>&1; then
    SIGN="$(printf '%s' "$SIGN_INPUT" | openssl dgst -sha1 | awk '{print $NF}')"
else
    die "sha1sum, shasum or openssl is required"
fi

PAYLOAD='{'
PAYLOAD="${PAYLOAD}\"data\":\"$(printf '%s' "$DATA" | json_escape)\""
PAYLOAD="${PAYLOAD},\"timestamp\":$TIMESTAMP"
PAYLOAD="${PAYLOAD},\"sign\":\"$SIGN\"}"

TMP_FILE="$(mktemp /tmp/lerwee_event.XXXXXX)" || die "mktemp failed"
trap 'rm -f "$TMP_FILE"' EXIT

HTTP_CODE="$(curl -sS --connect-timeout 5 --max-time 20 -o "$TMP_FILE" -w '%{http_code}' -H 'Content-Type: application/json' --data-binary "$PAYLOAD" "$ENDPOINT")" || die "curl request failed"
RESPONSE="$(cat "$TMP_FILE")"
RESPONSE_CODE="$(sed -n 's/.*\"code\"[[:space:]]*:[[:space:]]*\\([0-9][0-9]*\\).*/\\1/p' "$TMP_FILE" | head -n 1)"

if [ "$HTTP_CODE" = "200" ] && [ "$RESPONSE_CODE" = "0" ]; then
    echo "SUCCESS mode=$MODE http=$HTTP_CODE code=$RESPONSE_CODE"
    echo "RESPONSE=$RESPONSE"
    exit 0
fi

echo "FAILED mode=$MODE http=$HTTP_CODE code=$RESPONSE_CODE"
echo "RESPONSE=$RESPONSE"
exit 1
```

设置属组、执行权限，并处理 Windows 换行符：

```bash theme={null}
chown root:zabbix /usr/lib/zabbix/alertscripts/lerwee_event.sh
chmod 750 /usr/lib/zabbix/alertscripts/lerwee_event.sh
sed -i 's/\r$//' /usr/lib/zabbix/alertscripts/lerwee_event.sh
```

### 6.手动测试脚本

**（1） 测试告警产生**

`event-id` 不需要提前创建，它是由调用方传入乐维的事件唯一标识。手工测试时自行编写一个唯一值即可；如果还要测试恢复，必须复用同一个值。

```bash theme={null}
sudo -u zabbix /usr/lib/zabbix/alertscripts/lerwee_event.sh \
  --config /etc/zabbix/lerwee_event.json \
  --mode problem \
  --event-id zbx-test-001 \
  --level 4 \
  --title "Zabbix到乐维事件平台测试告警" \
  --object "Zabbix测试主机" \
  --ip 192.168.1.100 \
  --description "接口连通性与签名测试" \
  --object-type Zabbix \
  --object-group test
```

![Zabbixdjsjpt031104](https://mintcdn.com/lerwee/eGViYg2BSv5NCGmP/images/zabbixdjsjpt031104.png?fit=max\&auto=format\&n=eGViYg2BSv5NCGmP\&q=85\&s=fa88a027569afa2d767aa41aeae049ad)

成功标准：

* 命令输出包含 `SUCCESS mode=problem`
* 响应中 `code=0`
* `data.result` 为操作成功

若输出 `FAILED`：

* HTTP 状态非 `200`：优先检查网络、代理或接口地址
* HTTP 状态为 `200` 但业务 `code` 非 `0`：优先检查签名、时间同步、`appid/token` 或乐维返回的 `message`

在乐维进入：

```text theme={null}
事件平台 → 告警管理 → 全部告警
```

确认测试告警已经进入乐维。

![Zabbixsjpt051104](https://mintcdn.com/lerwee/eGViYg2BSv5NCGmP/images/zabbixsjpt051104.png?fit=max\&auto=format\&n=eGViYg2BSv5NCGmP\&q=85\&s=cd455a44cceb505794076d22f17070fe)

**（2）测试告警恢复**

恢复测试必须复用告警产生阶段的同一个 `event-id`：

```bash theme={null}
sudo -u zabbix /usr/lib/zabbix/alertscripts/lerwee_event.sh --config /etc/zabbix/lerwee_event.json --mode recovery --event-id zbx-test-001
```

![Zabbixsjpt061104](https://mintcdn.com/lerwee/eGViYg2BSv5NCGmP/images/zabbixsjpt061104.png?fit=max\&auto=format\&n=eGViYg2BSv5NCGmP\&q=85\&s=9b8891a8d75dbb47d13c21f6b2f9a800)

成功后确认乐维中对应告警已恢复。

## 四. Zabbix web端配置

### 1. 配置 Zabbix 报警媒介

进入“告警 → 媒介”

**（1） 创建“乐维-告警产生”**

| 配置项 | 值 |
| - | - |
| 名称 | `乐维-告警产生` |
| 类型 | `脚本` |
| 脚本名称 | `lerwee_event.sh` |
| 已启用 | 勾选 |

脚本参数必须一行参数名、一行参数值：

```text theme={null}
--config
/etc/zabbix/lerwee_event.json
--mode
problem
--event-id
{EVENT.ID}
--level
{TRIGGER.NSEVERITY}
--title
{TRIGGER.NAME}
--object
{HOST.NAME}
--ip
{HOST.IP}
--description
{ITEM.NAME}: {ITEM.LASTVALUE}
--object-type
Zabbix
--object-group
{TRIGGER.HOSTGROUP.NAME}
```

![Zabbixsjpt071104](https://mintcdn.com/lerwee/eGViYg2BSv5NCGmP/images/zabbixsjpt071104.png?fit=max\&auto=format\&n=eGViYg2BSv5NCGmP\&q=85\&s=220c2d9b335480eeffd8edeed2e3d99c)

> [!WARNING]
>
> 以下三点非常关键：
>
> 1. 脚本名称不要写绝对路径
> 2. 级别必须使用数字宏 `{TRIGGER.NSEVERITY}`
> 3. 当前脚本不支持 `--config=xxx` 这类等号写法

**（2） 创建“乐维-告警恢复”**

| 配置项 | 值 |
| - | - |
| 名称 | `乐维-告警恢复` |
| 类型 | `脚本` |
| 脚本名称 | `lerwee_event.sh` |
| 已启用 | 勾选 |

脚本参数必须同样使用一行参数名、一行参数值：

```text theme={null}
--config
/etc/zabbix/lerwee_event.json
--mode
recovery
--event-id
{EVENT.ID}
```

![Zabbixsjpt081104](https://mintcdn.com/lerwee/eGViYg2BSv5NCGmP/images/zabbixsjpt081104.png?fit=max\&auto=format\&n=eGViYg2BSv5NCGmP\&q=85\&s=2a939cc53f32b27ed4af621cdc5a12ef)

告警产生和告警恢复必须使用同一个 `{EVENT.ID}`，乐维通过该 ID 关联并恢复原始告警。

**（3） 配置消息模板**

> [!WARNING]
>
> Zabbix 7 的真实触发器通知在调用媒介前，会先校验媒介类型是否定义了对应消息模板。即使脚本参数已经单独配置，也必须给两个媒介补充消息模板；否则真实告警会失败，动作日志报错：
>
> ```text theme={null}
> No message defined for media type.
> ```

**乐维-告警产生**

进入：

```text theme={null}
告警 → 媒介 → 乐维-告警产生 → 消息模板 → 添加
```

| 配置项 | 值 |
| - | - |
| 消息类型 | `问题` |
| 主题 | `Problem: {EVENT.NAME}` |
| 消息 | `{EVENT.NAME}` |

![Zabbixsjpt091104](https://mintcdn.com/lerwee/eGViYg2BSv5NCGmP/images/zabbixsjpt091104.png?fit=max\&auto=format\&n=eGViYg2BSv5NCGmP\&q=85\&s=67f5ca5fa86099c57e118ef4618100b3)

**乐维-告警恢复**

进入：

```text theme={null}
告警 → 媒介 → 乐维-告警恢复 → 消息模板 → 添加
```

| 配置项 | 值 |
| - | - |
| 消息类型 | `问题恢复` |
| 主题 | `Resolved: {EVENT.NAME}` |
| 消息 | `{EVENT.NAME}` |

![Zabbixsjpt101104](https://mintcdn.com/lerwee/eGViYg2BSv5NCGmP/images/zabbixsjpt101104.png?fit=max\&auto=format\&n=eGViYg2BSv5NCGmP\&q=85\&s=887f86faabca65e6ce195ddde9777a2d)

消息模板用于满足 Zabbix 通知校验并保留动作日志信息；真正传给脚本的参数仍来自“脚本参数”中的 `{EVENT.ID}`、`{TRIGGER.NAME}` 等宏。

**（4）测试媒介**

媒介测试只能验证媒介和脚本调用，不能替代真实触发器动作验证。

媒介测试中的 `event-id` 可以自己编写唯一测试值；真实触发器告警由 Zabbix 自动传入 `{EVENT.ID}`，两者互不影响。

在“乐维-告警产生”的测试弹窗中使用固定值：

```text theme={null}
--config
/etc/zabbix/lerwee_event.json
--mode
problem
--event-id
web-test-001
--level
4
--title
zabbix-web-test
--object
zabbix-web-test-host
--ip
192.168.1.100
--description
zabbix-web-media-test
--object-type
Zabbix
--object-group
test
```

再测试“乐维-告警恢复”：

```text theme={null}
--config
/etc/zabbix/lerwee_event.json
--mode
recovery
--event-id
web-test-001
```

两组测试均成功，且乐维中能产生并恢复测试告警，说明媒介调用链路正常。

![Zabbixsjpt111104](https://mintcdn.com/lerwee/eGViYg2BSv5NCGmP/images/zabbixsjpt111104.png?fit=max\&auto=format\&n=eGViYg2BSv5NCGmP\&q=85\&s=29ec62fc775fc5fa34de2eafe05393c3)

![Zabbixsjpt121104](https://mintcdn.com/lerwee/eGViYg2BSv5NCGmP/images/zabbixsjpt121104.png?fit=max\&auto=format\&n=eGViYg2BSv5NCGmP\&q=85\&s=45063d1714476611bf9171b23032f92d)

### 2. 创建 Zabbix 用户组和用户

**（1） 创建用户组**

进入“用户 → 用户群组”，创建“乐维事件平台对接”。在“主机权限”页签中，为需要推送告警的主机组授予“读”权限。

![Zbxsjpt1111104](https://mintcdn.com/lerwee/tS5TdvL35_Xj6yul/images/zbxsjpt1111104.png?fit=max\&auto=format\&n=tS5TdvL35_Xj6yul\&q=85\&s=01079e0613a762de79f619350ccf8819)

![Zbxsjpt110401](https://mintcdn.com/lerwee/eGViYg2BSv5NCGmP/images/zbxsjpt110401.png?fit=max\&auto=format\&n=eGViYg2BSv5NCGmP\&q=85\&s=e5475303f9332859197453f5c24e610e)

> [!NOTE]
>
> 原则：触发器动作条件中包含哪些主机组，用户组就必须对这些主机组有读权限。

**（2）创建用户**

| 配置项 | 值 |
| - | - |
| 用户名 | `lerwee-integration` |
| 用户群组 | `乐维事件平台对接` |
| 密码 | 强密码 |
| 状态 | `已启用` |

![Zabbixsjpt151104](https://mintcdn.com/lerwee/eGViYg2BSv5NCGmP/images/zabbixsjpt151104.png?fit=max\&auto=format\&n=eGViYg2BSv5NCGmP\&q=85\&s=d7e5325e83bb851c5daec5193b3c834e)

**（3） 配置用户报警媒介**

添加两个媒介：

| 配置项 | 媒介一 | 媒介二 |
| - | - | - |
| 类型 | `乐维-告警产生` | `乐维-告警恢复` |
| 收件人 | `lerwee` | `lerwee` |
| 启用时间 | `1-7,00:00-24:00` | `1-7,00:00-24:00` |
| 按严重性使用 | 全部勾选 | 全部勾选 |
| 状态 | `已启用` | `已启用` |

![Zbxsjpt110403](https://mintcdn.com/lerwee/eGViYg2BSv5NCGmP/images/zbxsjpt110403.png?fit=max\&auto=format\&n=eGViYg2BSv5NCGmP\&q=85\&s=9b20bd9122814e92b257ff25bb1e081c)

![Zbxsjpt110404](https://mintcdn.com/lerwee/eGViYg2BSv5NCGmP/images/zbxsjpt110404.png?fit=max\&auto=format\&n=eGViYg2BSv5NCGmP\&q=85\&s=326925bc4f78c4b220ace4ba814031be)

> [!WARNING]
>
> 如果某个严重性未勾选，对应级别的真实告警不会推送。

### 3. 创建触发器动作

进入“告警 → 动作 → 触发器动作”，创建动作“推送告警到乐维事件平台”。

在“操作”页签中，需要同时添加：

1. 操作：绑定“乐维-告警产生”，用于问题产生通知。
2. 恢复操作：绑定“乐维-告警恢复”，用于问题恢复通知。
3. 更新操作可暂不配置，不影响告警产生和恢复推送。

**动作条件**

建议先限定测试主机组，验证通过后逐个添加业务主机组。

可选条件：

```text theme={null}
触发器示警度 大于等于 警告
```

该条件可减少信息类和未分类告警进入乐维。

![Zbxsjpt110405](https://mintcdn.com/lerwee/eGViYg2BSv5NCGmP/images/zbxsjpt110405.png?fit=max\&auto=format\&n=eGViYg2BSv5NCGmP\&q=85\&s=41771547ee507b660bb179ef3369db27)

**操作**

| 配置项 | 值 |
| - | - |
| 操作类型 | `发送消息` |
| 发送到用户 | `lerwee-integration` |
| 仅发送到 | `乐维-告警产生` |
| 步骤 | `1 - 1` |
| 开始于 | `立即` |

![Zbxsjpt110406](https://mintcdn.com/lerwee/eGViYg2BSv5NCGmP/images/zbxsjpt110406.png?fit=max\&auto=format\&n=eGViYg2BSv5NCGmP\&q=85\&s=932b65001d7111b4c9b0c34af13a743e)

**（3）恢复操作**

| 配置项 | 值 |
| - | - |
| 操作类型 | `发送消息` |
| 发送到用户 | `lerwee-integration` |
| 仅发送到 | `乐维-告警恢复` |

![Zbxsjpt110407](https://mintcdn.com/lerwee/eGViYg2BSv5NCGmP/images/zbxsjpt110407.png?fit=max\&auto=format\&n=eGViYg2BSv5NCGmP\&q=85\&s=1f2305362f5009419ad2302d96319404)

**（4）启用动作**

确认动作状态为“已启用”。

### 4. 处理内部动作

进入“告警 → 动作 → 内部动作”。

常见内部动作：

```text theme={null}
Report not supported items
Report not supported low level discovery rules
Report unknown triggers
```

这些动作对应监控项不支持、LLD 规则异常、未知触发器等 Zabbix 内部事件，不是设备真实触发器告警。

> [!NOTE]
>
> 1. 如果内部动作原本处于停用状态，可以不修改原配置
> 2. 如果后续启用内部动作，应将其“仅发送到”设置为邮件、企业微信等原有媒介，避免推送到乐维
> 3. 乐维的两个媒介只建议被“推送告警到乐维事件平台”这个触发器动作引用

## 五. 真实告警验收

### 1. Zabbix 侧

进入“监测 → 问题”，确认告警存在。

再进入“告警 → 动作”或“报表 → 动作日志”，确认以下内容：

```text theme={null}
状态：已发送
错误：空
用户：lerwee-integration
媒介：乐维-告警产生
```

| 检查项 | 要求 |
| - | - |
| 状态 | `已发送` |
| 错误 | 为空 |
| 用户 | `lerwee-integration` |
| 媒介 | `乐维-告警产生` |

> [!TIP]
>
> 如果动作日志中已经显示“已发送”，但乐维原始告警中看不到事件，优先检查 Zabbix Server 到乐维 `/backend_api` 的网络连通性，再查看脚本返回的业务 `code`。

### 2. 乐维侧确认产生

进入：

```text theme={null}
事件平台 → 告警管理 → 全部告警
```

按 Zabbix 主机名、IP 或触发器名称搜索，确认告警进入乐维。

### 3. 乐维侧确认恢复

等待 Zabbix 问题恢复后确认：

1. Zabbix 动作日志中恢复操作已发送
2. 恢复操作使用的媒介为 `乐维-告警恢复`
3. 乐维中对应告警已恢复

告警产生和恢复均验证通过后，接入才算完成

## 六. 上线检查清单

| 检查项 | 要求 |
| - | - |
| lerwee\_event.json | url、apikey、appid、token 完整 |
| lerwee\_event.sh | 位于 AlertScriptsPath，可执行 |
| 运行依赖 | bash、curl、awk、sed、sha1sum/shasum/openssl 可用 |
| 文件权限 | 配置文件 root:zabbix 640；脚本 root:zabbix 750 |
| 手动 problem 测试 | code=0 |
| 手动 recovery 测试 | 乐维对应告警恢复 |
| 乐维-告警产生 | 已启用，参数格式正确 |
| 乐维-告警恢复 | 已启用，使用同一个 EVENT.ID |
| 两个媒介的消息模板 | 问题/问题恢复模板已配置 |
| 用户组 | 对目标主机组有读权限 |
| lerwee-integration 用户 | 已绑定两个媒介 |
| 用户媒介严重性 | 全部勾选 |
| 触发器动作 | 已启用 |
| 操作 | 仅发送到乐维-告警产生 |
| 恢复操作 | 仅发送到乐维-告警恢复 |
| 内部动作 | 停用或不引用乐维媒介 |
| 真实告警 | Zabbix 动作日志已发送 |
| 乐维展示 | 告警产生和恢复正常 |

## 下一步：让告警真正用起来🎯

告警进入乐维事件平台只是第一步。

您还可以配置告警分派、抑制、收敛和通知规则，让告警找对人、少重复、不漏处理，并在“我的告警”和“全部告警”中持续跟踪处理进度。📋

更多用法可以查看 [乐维事件平台操作手册](https://doc.lwops.cn/event-platform-sop)🔗


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.