> For AI agents: the complete documentation index is available at https://www.tteam.icu/llms.txt, the full documentation bundle is available at https://www.tteam.icu/llms-full.txt.

# zabbix

[官网](https://www.zabbix.com/)

## zabbix-server

使用 Docker 搭建。

### zabbix-web

```sh file="./zabbix/zabbix-web.sh" title="zabbix-web.sh"
#!/bin/bash

version="centos-5.0.2"
docker_name="zabbix-web-nginx-pgsql"

docker stop ${docker_name}
docker rm ${docker_name}
docker run -d --name ${docker_name} \
--restart=always \
--link zabbix-server:zabbix-server \
--link zabbix-postgres:zabbix-postgres \
-e DB_SERVER_HOST="zabbix-postgres" \
-e POSTGRES_USER="postgres" \
-e POSTGRES_PASSWORD="password" \
-e ZBX_SERVER_HOST="zabbix-server" \
-e PHP_TZ="Asia/Shanghai" \
-p 8800:8080 \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
zabbix/zabbix-web-nginx-pgsql:${version}
```

#### 解决中文乱码

在 `C:\Windows\Fonts\` 中找到 `simkai` 或者 `楷体 常规` 并上传到服务器:

```bash
docker cp simkai.ttf zabbix-web-nginx-pgsql:/usr/share/zabbix/assets/fonts/DejaVuSans.ttf
```

### zabbix-server

```sh file="./zabbix/zabbix-server.sh" title="zabbix-server.sh"
#!/bin/bash
version="centos-5.0.2"

docker_name=zabbix-server

docker kill zabbix-server
docker rm zabbix-server
docker run -d --name zabbix-server \
--restart=always \
--hostname $(hostname) \
--add-host $(hostname):10.0.18.2 \
--link zabbix-postgres:zabbix-postgres \
-p 10051:10051 \
-e DB_SERVER_HOST="zabbix-postgres" \
-e POSTGRES_USER="postgres" \
-e POSTGRES_PASSWORD="password" \
-e ZBX_CACHESIZE=16M \
-e ZBX_VALUECACHESIZE=64M \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
zabbix/zabbix-server-pgsql:${version}
```

### zabbix-postgres

```sh file="./zabbix/zabbix-postgres.sh" title="zabbix-postgres.sh"
#!/bin/sh
echo 'Asia/Shanghai' > /etc/timezone

docker_name=zabbix-postgres

chown -R polkitd.root data-${docker_name}/

docker stop ${docker_name}
docker rm ${docker_name}
docker run -d --name ${docker_name} \
--restart=always \
-e POSTGRES_PASSWORD=password \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
-v $(pwd)/data-${docker_name}:/var/lib/postgresql/data \
postgres:9.6
```

## zabbix-agent

### 安装 zabbix-agent

由于使用 Docker 安装不一定能获取到所有数据或正确数据，故使用宿主机安装。


**debian**

```bash
wget
https://repo.zabbix.com/zabbix/7.0/debian/pool/main/z/zabbix-release/zabbix-release_latest_7.0+debian12_all.deb

dpkg -i zabbix-release_latest_7.0+debian12_all.deb

apt update

apt install zabbix-agent

# 修改完配置文件后启动
systemctl enable zabbix-agent --now
```


**centos**

```bash
rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm

# 如果是国内就换源
sed -i 's#http://repo.zabbix.com#https://mirrors.aliyun.com/zabbix#g' /etc/yum.repos.d/zabbix.repo

yum install zabbix-agent -y

# 修改完配置文件后启动
systemctl enable zabbix-agent --now
```
:::tip
7.0 版本: `rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rhel/7/x86_64/zabbix-release-7.0-1.el7.noarch.rpm`
:::


### 配置文件说明

#### /etc/zabbix/zabbix\_agentd.conf

##### 被动模式(Server 主动去 Agent 拉)

```bash
PidFile=/var/run/zabbix/zabbix_agentd.pid   //13行

LogFile=/var/log/zabbix/zabbix_agentd.log   //32行

LogFileSize=0                               //43行

Include=/etc/zabbix/zabbix_agentd.d/*.conf  //309行

//上面的是核对项，下面的是修改项//

Server=本机IP,服务器IP     //如图172.29.230.4为本机IP，172.31.254.13为服务器IP

ServerActive=服务器IP

Hostname=testhost                     //158行，指定名称

#Hostname填写要监控的主机名，Server才能根据名字找到它(此处hostname要与zabbix监控当中添加主机的主机名一致)
```

:::tip
如果要实现自动添加，需要在配置文件中加上 `HostMetadata`，然后在服务端的`动作`中的`自动发现动作`添加，判断`主机元数据`。
:::

##### 在 zabbix-server 中添加

在`配置->主机`界面点击创建主机按钮，填写好必填项，然后在模板界面选择 `Template OS Linux by Zabbix agent`。

等一会后就显示连接成功。

#### 主动模式(Agent 主动推给 Server)

```bash
# Server=本机IP,服务器IP     //禁用

ServerActive=服务器IP

Hostname=testhost                     //158行，指定名称

StartAgents=0 //启用主动模式

#Hostname填写要监控的主机名，Server才能根据名字找到它(此处hostname要与zabbix监控当中添加主机的主机名一致)
```

##### 在 zabbix-server 中添加

在`配置->主机`界面点击创建主机按钮，填写好必填项，然后在模板界面选择 `Template OS Linux by Zabbix agent active`。

等一会后就显示连接成功。

## zabbix-proxy

### 安装


**旧版本(5.0)**

```sh file="./zabbix/zabbix-proxy-5.0.sh"
#!/bin/bash

docker_name=zabbix-proxy-sqlite3

mkdir -p data/
chown -R 1997:1997 data/

echo "Asia/Shanghai" > /etc/timezone

docker stop ${docker_name}
docker rm ${docker_name}
docker run -d --name zabbix-proxy-sqlite3 \
--restart=always \
--net host \
--hostname xxx \
--add-host=zabbix-server:172.31.254.13 \       # zabbix-server的公网ip
-e ZBX_HOSTNAME=$(hostname) \
-e ZBX_SERVER_HOST=zabbix-server \
-e ZBX_PROXYMODE=0 \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
-v $(pwd)/data/:/var/lib/zabbix/ \
zabbix/zabbix-proxy-sqlite3:centos-5.0.2


# ZBX_PROXYMODE=0 # 主动模式
# ZBX_PROXYMODE=1 # 被动模式
```


**新版本(7.0)**

```sh file="./zabbix/zabbix-proxy-7.0.sh"
#!/bin/bash

docker_name=zabbix-proxy-sqlite3

echo "Asia/Shanghai" > /etc/timezone

if [ ! -d ./data ];then
mkdir -p data/
chown -R 1997:1997 data/
chmod 755 data/
        docker rm -f copyresources &&
        docker run -d --hostname $(hostname) \
        --name copyresources \
        -e ZBX_HOSTNAME=$(hostname) \
        zabbix/zabbix-proxy-sqlite3:centos-7.0.0 && sleep 60 && docker cp copyresources:/var/lib/zabbix/ ./data/
docker rm -f copyresources
fi

chown -R 1997.1997 data2/
chmod 755 data2/

docker stop ${docker_name}
docker rm ${docker_name}
docker run -d --name zabbix-proxy-sqlite3 \
--restart=always \
--net host \
--init -d \
--hostname $(hostname) \
--add-host=zabbix-server:xx.xx.xx.xx \
-e ZBX_HOSTNAME=$(hostname) \
-e ZBX_SERVER_HOST=zabbix-server \
-e ZBX_PROXYMODE=0 \
-e ZBX_CACHESIZE=16M \
-e ZBX_VALUECACHESIZE=64M \
-e ZBX_STARTVMWARECOLLECTORS=5 \
-e ZBX_VMWAREFREQUENCY=30 \
-e ZBX_VMWAREPERFFREQUENCY=30 \
-e ZBX_VMWARECACHESIZE=50M \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
-v $(pwd)/data/zabbix/:/var/lib/zabbix/ \
zabbix/zabbix-proxy-sqlite3:centos-7.0.0


# ZBX_PROXYMODE=0 # 主动模式
# ZBX_PROXYMODE=1 # 被动模式
```


安装完成后，在 `zabbix-server` 的`管理`中的`agent代理程序`来配置，其中`主动式`是 proxy 主动推。

## 推送

### 钉钉

#### 1、配置推送媒介，类型选择 `webhook`，配置参数 `ParseMode` 为空，`Token` 为钉钉的 webhook 的 token，脚本:

```js file="./zabbix/_ding_push.js" title="_ding_push.js"
var Dingtalk = {
    token: null,
    http_proxy: null,
    timeout: 5000,

    sendMessage: function(message) {
        var params = JSON.stringify(message);
        var request = new HttpRequest();
        request.addHeader('Content-Type: application/json');

        var url = 'https://oapi.dingtalk.com/robot/send?access_token=' + this.token;

        if (this.http_proxy) {
            request.setProxy(this.http_proxy);
        }

        request.setTimeout(this.timeout);

        try {
            var response = request.post(url, params);
            Zabbix.Log(4, '[Dingtalk Webhook] response: ' + response);
            return 'OK';
        } catch (error) {
            Zabbix.Log(4, '[Dingtalk Webhook] notification failed: ' + error);
            throw 'Failed to send notification: ' + error;
        }
    }
};

try {
    var params = JSON.parse(value);
    Dingtalk.token = params.token;

    if (params.http_proxy) {
        Dingtalk.http_proxy = params.http_proxy;
    }

    var message = {
        msgtype: 'text',
        text: {
            content: params.message
        }
    };

    return Dingtalk.sendMessage(message);
} catch (error) {
    Zabbix.Log(4, '[Dingtalk Webhook] notification failed: ' + error);
    throw 'Failed to send notification: ' + error;
}
```

#### 2、配置`Message template`

问题

```
Problem: {EVENT.NAME}

当前状态: {TRIGGER.STATUS}
告警主机: {HOSTNAME1}
告警别名: {HOST.NAME}
告警地址: {HOST.IP}
告警时间: {EVENT.DATE} {EVENT.TIME}
告警等级: {TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目: {TRIGGER.KEY1}
问题详情: {ITEM.NAME}: {ITEM.VALUE}
当前状态: {TRIGGER.STATUS}: {ITEM.VALUE1}
事件ID: {EVENT.ID}
```

Problem recovery

```
Resolved in {EVENT.DURATION}: {EVENT.NAME}

当前状态: {TRIGGER.STATUS}
恢复主机: {HOSTNAME1}
恢复别名: {HOST.NAME}
恢复地址: {HOST.IP}
恢复时间: {EVENT.DATE} {EVENT.TIME}
恢复等级: {TRIGGER.SEVERITY}
恢复信息: {TRIGGER.NAME}
恢复项目: {TRIGGER.KEY1}
恢复详情: {ITEM.NAME}: {ITEM.VALUE}
当前状态: {TRIGGER.STATUS}: {ITEM.VALUE1}
事件ID: {EVENT.ID}
```

#### 3、在用户中配置报警媒介

#### 4、在动作中配置媒介

## 对接grafana

### grafana安装zabbix插件

```bash
grafana-cli plugins install alexanderzobnin-zabbix-app
```

安装完插件后需重启

### 在grafana启用zabbix

### 添加zabbix数据源

```bash
http://10.0.18.2:8800/api_jsonrpc.php
```

### 导入模板

[https://grafana.com/grafana/dashboards/5363-zabbix-full-server-status/](https://grafana.com/grafana/dashboards/5363-zabbix-full-server-status/)
