通过源码安装Zabbix进行监控 服务监控篇

昨天已经完成了zabbix的安装过程,今天就尝试使用zabbix agent来把新的服务器给监控起来。

(English version translate by GPT-3.5)

复制Zabbix agent,不,编译Arm版 zabbix agent

首先,回到zabbix server的服务器上,前往zabbix的安装目录

1
/usr/local/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
26
27
28
tree of /usr/local/zabbix
├── bin
│ ├── zabbix_get
│ ├── zabbix_js
│ └── zabbix_sender
├── etc
│ ├── zabbix_agentd.conf
│ ├── zabbix_agentd.conf.d
│ ├── zabbix_server.conf
│ └── zabbix_server.conf.d
├── lib
│ └── modules
├── php-webui (隐藏1460个文件)

├── sbin
│ ├── zabbix_agentd
│ └── zabbix_server
└── share
├── man
│ ├── man1
│ │ ├── zabbix_get.1
│ │ └── zabbix_sender.1
│ └── man8
│ ├── zabbix_agentd.8
│ └── zabbix_server.8
└── zabbix
├── alertscripts
└── externalscripts

由于被监控的机器只需安装 zabbix_agentd 就行,所以这里将 zabbix_agentdetc/zabbix_agentd.conf 给准备好,复制到目标主机,也就是我一开始就想监控的那台Oracle机器上,但是这样子肯定是不行的,因为我那台机器是Arm架构的服务器,这个 zabbix_agentd 是x86架构的,因此直接复制不通,所以还需要在Arm主机上再次编译一个 zabbix_agentd

编译过程省略,详见上一篇,编译耗时: 12秒

只不过编译命令变成了

1
./configure --enable-agent --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2 --with-openssl --prefix=/usr/local/zabbix

如果中途出现configure错误,例如我刚刚就出现最后一步

1
2
3
4
5
6
7
config.status: error: Something went wrong bootstrapping makefile fragments
for automatic dependency tracking. If GNU make was not used, consider
re-running the configure script with MAKE="gmake" (or whatever is
necessary). You can also try re-running configure with the
'--disable-dependency-tracking' option to at least be able to build
the package (albeit without support for automatic dependency tracking).
See `config.log' for more details

要注意查看 config.log里面的内容,查看内容后得到是make没有安装导致失败。

zabbix Server中新建一条

在打开的zabbix web中,左侧 监测 - 主机 里面,右上角点击添加主机
添加主机
我这里添加了一个主机名为 Oracle ARM 的主机

添加一条主机记录

然后切换到 加密 的选项卡中,这里就选择 连接主机,选择 共享密钥(PSK),然后从主机连接,去掉全部的勾然后勾选 共享密钥(PSK)

这里要注意,根据2 使用共享密钥 - zabbix.com 介绍描述如下

不要将敏感信息放在PSK identity(共享密钥一致性)字符串中 - 它通过网络未加密传输。

我就理解成 共享密钥一致性 是名字,谁都能打听到,而 共享密钥(PSK) 是密码,只有自己知道。

共享密钥PSK设置

里面的psk密钥可以使用 OpenSSL 生成,很简单这样就行了,当然 文档 中还给出了 使用GnuTLS 的方式进行生成,我这里使用OpenSSL生成。

1
openssl rand -hex 32

返回

1
c59a90b393b24f640055682882f67c8e1479dbf598e66f544fd5afa692cd820e

将上面这个值填入psk中,保存,建立好后这样子的

建立好列表

配置Zabbix_agentd 主动模式

服务端都已经配置好了,接下来配置客户端,跑到要监控的服务器去,也就是Arm服务器去

写入zabbix_agentd.psk

我在 /usr/local/zabbix/etc/zabbix_agentd.psk 下写入这个文件

1
echo 'c59a90b393b24f640055682882f67c8e1479dbf598e66f544fd5afa692cd820e' > /usr/local/zabbix/etc/zabbix_agentd.psk

配置conf

首先设置配置

1
2
3
4
5
6
7
8
9
10
# 将server设置成0,即关闭本机的10050端口检测,这样的话就是被动接收模式,如果这里配置了就是由server进行主动推送
Server=0
# 将这个值设置成0,将会禁用agent被动检查(对于server端主动,则agent端是被动,对于server端被动收到消息,那么agent端就是主动)
StartAgents=0
# 这里的serverActive填写是zabbix server的ip地址,默认访问zabbix server的10051端口
ServerActive=121.41.65.201
Hostname=Oracle ARM
# 如果希望用root运行,就将这个设置为1,默认是0,默认使用zabbix用户运行。
# 我这里为了测试,设置成1允许root运行
AllowRoot=1

然后配置加密部分,这里跟着文档做就行了

1
2
3
4
TLSConnect=psk
TLSAccept=psk
TLSPSKFile=/usr/local/zabbix/etc/zabbix_agentd.psk
TLSPSKIdentity=oracle key

启动zabbix_agentd

最后一步,启动服务

1
sbin/zabbix_agentd

可以看到/tmp下生成了zabbix_agentd.log 的日志,由于境外服务器网络可能不太好,有概率会失败,但是看到Active check configuration update from [xxx.xxx.xxx.xxx] is working again就表示数据传上去了。

1
2
3
4
5
6
7
8
9
92311:20220520:135116.883 Starting Zabbix Agent [Oracle ARM]. Zabbix 6.0.4 (revision 3d787ff402e).
92311:20220520:135116.883 **** Enabled features ****
92311:20220520:135116.883 IPv6 support: YES
92311:20220520:135116.883 TLS support: YES
92311:20220520:135116.883 **************************
.......
92316:20220520:135119.887 Unable to connect to [xxx.xxx.xxx.xxx]:10051 [TCP successful, cannot establish TLS to [[121.41.65.201]:10051]: SSL_connect() timed out]
92316:20220520:135119.887 Active check configuration update started to fail
92316:20220520:135220.618 Active check configuration update from [xxx.xxx.xxx.xxx] is working again

如果里面报了下面的,表示zabbix server端口不通,检查防火墙或者检查zabbix server是否监听了127.0.0.1(一般大概率原因在前面,因为我就是防火墙忘了开)

1
2
3
89976:20220520:073726.816 agent #5 started [active checks #1]
89976:20220520:073729.818 Unable to connect to [xxx.xxx.xxx.xxx]:10051 [cannot connect to [[xxx.xxx.xxx.xxx]:10051]: [4] Interrupted system call]
89976:20220520:073729.818 Active check configuration update started to fail

如果出现下面的错误,就得检查下网页上配置的psk密钥和/usr/local/zabbix/etc/zabbix_agentd.psk里面的的内容是否一致。

1
92248:20220520:134652.850 Unable to connect to [xxx.xxx.xxx.xxx]:10051 [TCP successful, cannot establish TLS to [[xxx.xxx.xxx.xxx]:10051]: SSL_connect() set result code to SSL_ERROR_SSL: file ../ssl/record/rec_layer_s3.c line 1543: error:14094417:SSL routines:ssl3_read_bytes:sslv3 alert illegal parameter: SSL alert number 47: TLS read fatal alert "illegal parameter"]

最后效果如下

监控数据有了

附:配置Zabbix_agentd 被动模式

接下来,我为另一台AMD服务器配置Agent被动模式(即由zabbix Server主动来获取数据)

首先,配置一台新的主机

这里就不重复描述了,上面一样的配置就行,这里模板我选择的是Linux by Zabbix agent,这里的模板相当于zabbix给你准备好的几个默认监控项,自定义监控项我后面折腾下

配置新的主机信息

配置密钥部分

配置好后,列表就会增加一套记录,新添加的这一条有 ZBX标记

ZBX标记

下面内容摘抄文档 2 新建主机 - zabbix.com 中的内容


  • ZBX 表示主机状态尚未建立,尚未发生监控指标检查
  • ZBX 表示主机可用,监控指标检查已成功
  • ZBX 表示主机不可用,监控指标检查失败(将鼠标光标移动到图标上以查看错误消息)。可能是由于接口凭证不正确造成了通信问题。检查zabbix server是否正在运行,并稍后尝试刷新页面。

然后将zabbix server端的 sbin/zabbix_agentd,以及 etc/zabbix_agentd.conf复制到被监控的服务器(因为第一台是arm服务器,架构不一样,所以需要自行编译,而amd的服务器也属于x86,架构一致就不编译了。),先构建出2个目录

1
2
mkdir -p /usr/local/zabbix-agent/sbin
mkdir -p /usr/local/zabbix-agent/etc

然后将 sbin/zabbix_agentd 复制到 /usr/local/zabbix-agent/sbin 下,将 etc/zabbix_agentd.conf 复制到 /usr/local/zabbix-agent/etc,弄好后目录如下,开始之前别忘了备份下zabbix_agentd.conf

1
2
3
4
5
/usr/local/zabbix-agent
├── etc
│ ├── zabbix_agentd.conf
└── sbin
└── zabbix_agentd

配置 zabbix_agentd.conf

1
2
3
4
5
6
7
8
9
10
# 1. 这里填上zabbix 服务器的ip,这里表示只允许这个ip访问
Server=your.zabbix.server.ip.address
# 2. 默认的zabbix_agentd监听端口是10050,所以如果端口不是10050或者有nat,这里调成可用端口
ListenPort=10050

# 3. 这里注释掉,注释掉后会禁用agentd主动推送模式
#ServerActive=127.0.0.1

# 4. 这里配上在zabbix web上写的主机名
Hostname=Oracle AMD

然后配置psk密钥

先在 /usr/local/zabbix-agent/etc/zabbix_agentd.psk 写入刚刚的填写在web页面的密钥,然后按如下配置

1
2
3
4
TLSConnect=psk
TLSAccept=psk
TLSPSKFile=/usr/local/zabbix-agent/etc/zabbix_agentd.psk
TLSPSKIdentity=oracle key2

启动zabbix-agent

这次得换一次命令,因为这个文件是从 zabbix-server 中取来的,而zabbix-server编译时使用了 –prefix=/usr/local/zabbix,所以zabbix_agentd里面的默认配置文件是在 /usr/local/zabbix/etc/zabbix_agentd.conf,而不是现在新的zabbix-agent文件夹,所以这里必须指定配置文件

1
sbin/zabbix_agentd -c etc/zabbix_agentd.conf

然后使用netstat -anp | grep 10050 看到端口在监听了

1
2
tcp        0      0 0.0.0.0:10050           0.0.0.0:*               LISTEN      73453/sbin/zabbix_a 
tcp6 0 0 :::10050 :::* LISTEN 73453/sbin/zabbix_a

稍微等一会,就看到数据有了

数据收到了

数据就有了

最后,zabbix_agentd服务化运行

现在无论是zabbix-server,还是两台zabbix-agent都是以临时的后台运行,一旦重启啥都没了,因此需要将其添加到服务。但是这里需要更进一步更改下配置,先在 zabbix-agent目录下创建一个logs目录

1
mkdir /usr/local/zabbix-agent/logs

然后修改下面的配置

1
2
3
4
5
6
# 1. 修改Pid的文件,因为linux中 /tmp目录会被定时清除,所以要将pid生成到一个不会被清除的目录
PidFile=/usr/local/zabbix-agent/logs/zabbix_agentd.pid
# 这个其实还是在/tmp下没关系,但是既然创了logs,就放一起把
LogFile=/usr/local/zabbix-agent/logs/zabbix_agentd.log
# 然后将允许Root关闭掉,为了安全(关闭后默认以zabbix执行,所以稍后要创建一个zabbix用户)
AllowRoot=0

然后创建zabbix用户,这里 -M 表示禁止创建家文件

1
2
groupadd zabbix
useradd -g zabbix -M -s /sbin/nologin zabbix

将logs更改用户所属

1
chown -R zabbix:zabbix /usr/local/zabbix-agent/logs

然后将下面的内容写入 /etc/systemd/system/zabbix-agent.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]
Description=Zabbix agent server
After=syslog.target network.target

[Service]
Type=simple
User=zabbix
Group=zabbix
PIDFile=/usr/local/zabbix-agent/logs/zabbix_agentd.pid
ExecStart=/usr/local/zabbix-agent/sbin/zabbix_agentd -c /usr/local/zabbix-agent/etc/zabbix_agentd.conf -f
PrivateTmp=true
RestartSec=5s

[Install]
WantedBy=multi-user.target

最后,启动服务

1
systemctl start zabbix-agent

设置开机启动

1
systemctl enable zabbix-agent

好了,结束。