本文目标是Centos 7环境中通过软件包方式安装zabbix5.0版本,并配置使用zabbix基本功能,帮助大家快速了解入门使用zabbix。
一、zabbix介绍
Zabbix 是一个企业级分布式开源监控解决方案,用于监控各种网络设备、服务器和应用程序的性能和可用性。它提供了实时监控、报警、可视化、自动发现等功能,可以帮助管理员有效地监控和管理大型网络环境。
zabbix在进行监控时,zabbix客户端要安装在被监控设备上,负责定期收集数据,并将其发送给zabbix服务端;zabbix服务端要安装在监控设备上,其将zabbix客户端发送的数据存储的数据库中,zabbix web根据数据在前端进行展示和绘图。
zabbix工作模式:
1、主动模式
zabbix客户端主动向zabbix server请求监控项列表,并主动将监控项内需要的数据提交给zabbix server。
2、被动模式
zabbix server向agent请求获取监控项的数据,zabbix agent返回数据。
可以看出,zabbix的主动和被动模式是以zabbix客户端为基准的。
组成架构
1、zabbix-server zabbix服务端
2、zabbix-agent zabbix客户端
3、zabbix-web zabbix网站服务
4、php 处理动态资源请求
5、mysql 存储监控资源信息
6、zabbix-proxy 当需要监控的主机数量过多或者其他情况,通过代理监控主机,再汇总至服务端
二、zabbix安装
1、环境介绍:
安装前先关闭防火墙和selinux
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
#####防火墙未关闭会导致前端无法访问zabbix数据库,导致无法登陆。因为这里是虚拟环境,所以我们直接关闭防火墙,如果是生产环境中,为了安全考虑,可以考虑只放行mysql(TCP3306)、PGSQL(TCP5432)
我这里使用的是centos7.9版本,可以根据各版本的不同至官网下载不同的部署包
官网下载地址:下载Zabbix
[haohao@localhost /]$ hostnamectl
Static hostname: localhost.localdomain
Icon name: computer-vm
Chassis: vm
Machine ID: 3c7fe6dcebd04fbfb8730fe3722807bb
Boot ID: b294d55986a24c398a6008e0585aaca8
Virtualization: vmware
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-1160.el7.x86_64
Architecture: x86-64
这里在官网选择对应的环境以及zabbix版本后,会给你一个部署包的下载地址(因为6.0版本在centos7中只能源码安装,所以我们这里安装5.0的zabbix)
在这里就遇到了第一个问题:
我在下载部署包的时候提示我传输失败,
经过检查虚拟机能ping通宿主机网关,但是ping不通百度,也ping不通公共dns8.8.8.8.一开始我以为是dns解析的问题,于是我在/etc/resolv.conf下面新增加两行dns223.5.5.5和223.6.6.6发现还是不行。最后我使用dhclient -v重新获取地址,获取到新地址之后恢复正常。
zabbix安装
命令给你们复制粘贴出来,以centos7.9安装zabbix5.0版本为例:
# 下载对应版本的zabbix仓库
rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
#清除缓存
yum clean all
#安装Zabbix server,Web前端,agent
yum install zabbix-server-mysql zabbix-agent
#安装红帽软件集合
yum install centos-release-scl
#编辑配置文件 /etc/yum.repos.d/zabbix.repo and enable zabbix-frontend repository.
[zabbix-frontend]
...
enabled=1
...
#安装zabbix前端软件包
yum install zabbix-web-mysql-scl zabbix-apache-conf-scl
数据库安装:
#下载mysql官方yum源
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
#安装官方yum源
rpm -ivh mysql80-community-release-el7-3.noarch.rpm
#更新yum缓存并重建缓存
yum clean all
yum makecache
#安装mysql (nogpgcheck选项是为了跳过校验 )
yum install -y mysql-community-server mysql-community --nogpgcheck
#查看mysql是否安装成功
mysql -V
#启动mysql并设置开机自启动
systemctl start mysqld
systemctl enable mysqld
查看mysql的root账户临时密码
cat /var/log/mysqld.log
####temporary password后面的字段为临时密码
#登陆mysql
mysql -u root -p
##输入刚刚的临时密码
###修改临时密码,因为mysql默认密码策略要求,新密码有复杂度要求,这里可以先设置一个后面再修改
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewP@ssw0rd!';
###设置密码策略等级,不更改临时密码直接修改密码策略等级会报错
SET GLOBAL validate_password.policy = LOW;
###重设新密码为password
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';
创建zabbix相关表
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> create user zabbix@localhost identified by 'password';
mysql> grant all privileges on zabbix.* to zabbix@localhost;
mysql> set global log_bin_trust_function_creators = 1;
mysql> quit;
#导入初始架构
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix
#导入数据库架构后禁用log_bin_trust_function_creators选项
mysql -u root -p
password
mysql> set global log_bin_trust_function_creators = 0;
mysql> quit;
##编辑配置文件 /etc/zabbix/zabbix_server.conf,将DBpassword这一行改为刚刚修改的密码
DBPassword=password
##编辑配置文件 /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf 取消注释并为您设置正确的时区
###将
; php_value[date.timezone] = Europe/Riga
###改为
php_value[date.timezone] = Asia/Hong Kong
###重启服务并设置为开机自启动
systemctl restart zabbix-server zabbix-agent httpd rh-php72-php-fpm
systemctl enable zabbix-server zabbix-agent httpd rh-php72-php-fpm
在这启动服务的时候我遇到了zabbix服务端启动失败,查看/var/log/zabbix/zabbix_server.log提示如下:
128139:20240410:145840.927 using configuration file: /etc/zabbix/zabbix_server.conf
128139:20240410:145840.928 [Z3001] connection to database 'zabbix' failed: [2059] Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory
128139:20240410:145840.928 Cannot connect to the database. Exiting...
看日志是因为zabbix服务端无法连接到数据库,是因为一个caching_sha2_password的插件无法加载,这里我们更改zabbix用户的认证机制即可解决
#登陆到mysql服务器
mysql -u root -p
##输入之前设置的密码登陆到mysql
##这里的zabbix为之前创建的数据库用户名和密码 如果是一直跟我的操作走的那就直接复制我这一行即可
ALTER USER 'zabbix'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
##刷新权限
FLUSH PRIVILEGES;
##退出
exit;
重新启动服务即可,现在可以打开网页登陆了 初始密码 Admin/zabbix
三、遇到的问题
1、在web页面启动时,提示php文件没有设置正确时区
解决办法:在系统查找find / -name php.ini文件
将date.timezone这一行的值改为Asia/Shanghai
2、第二步连接数据库被拒绝,提示没有找到名为zabbix的数据库
后面发现是这一步没有等待文件解压完就退出了 后续重新执行该问题解决
3、在前端页面登陆后提示zabbix服务端未启动,
查看/var/log/zabbix/zabbix-server.log提示
105872:20240412:171615.454 cannot initialize alert manager: Cannot bind socket to "/var/run/zabbix/zabbix_server_alerter.sock": [13] Permission denied.
由日志得出,是权限问题。重新关闭防火墙即selinux即可(如果是生产环境可以针对性做策略,因我这里是测试环境,直接关闭防火墙和selinux)
##关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
##关闭selinux
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
四、添加监控主机
####在监控对象上安装zabbix-agent,首先添加对应版本的zabbix仓库
rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
###下载zabbix-agent
yum install zabbix-agent
###编辑zabbix-agent配置文件,/etc/zabbix/zabbix_agentd.conf
将
server= #这一行改为你zabbix server的IP地址
将
serverActive= #这一行改为你zabbix server的IP地址
将
Hostname= #这一行改为唯一的主机名,zabbix服务端使用这个主机名识别它
#设置服务开机自启动
systemctl enable zabbix-agent
#启动服务
systemctl start zabbix-agent
1、创建主机
在监控对象安装了agent之后,我们回到zabbix服务端web页面进行操作,首先在“配置”--“主机”,右上角“创建主机”。这里填写主机的名称,注意名称必须唯一,且带星号 * 都为必填项,根据实际情况填写即可。
2、创建监控项
点击刚刚创建的主机,右上角“创建监控项”,
还是一样,带星号 * 都为必填项,这里名称可以自定义。以本次举例,我想监控同网段192.168.8.156这台机器上的python3.8 app.py这个进程。
这里最重要的就是这个“键值”,键值有包含zabbix的内置键值,也可以用shell、python等脚本来检查。我们这里使用内置键值system.run[command,<mode>],该键值可以发送命令到监控对象执行。但是在新版zabbix中,EnableRemoteCommands=1 选项已经被启用,我们需要在监控对象的zabbix-agent.conf配置文件中修改
##编辑zabbix-agent.conf文件
vi /etc/zabbix/zabbix-agent.conf
##找到这一段
### Option: EnableRemoteCommands - Deprecated, use AllowKey=system.run[*] or DenyKey=system.run[*] instead
# Internal alias for AllowKey/DenyKey parameters depending on value:
# 0 - DenyKey=system.run[*]
# 1 - AllowKey=system.run[*]
#
# Mandatory: no
##把Allowkey这一行前面的多余空格及字符删除
### Option: EnableRemoteCommands - Deprecated, use AllowKey=system.run[*] or DenyKey=system.run[*] instead
# Internal alias for AllowKey/DenyKey parameters depending on value:
# 0 - DenyKey=system.run[*]
AllowKey=system.run[*]
#
# Mandatory: no
####修改完毕,重新启动zabbix-agent服务
systemctl restart zabbix-agent.service
我们使用ps -ef|grep app.py来检查监控对象上的进程是否运行,主机接口填写主机的IP地址和端口,更新时间可以根据自己选择灵活调整,填写完毕后可以“测试”
可以看到能正常拿到我们需要的内容
3、创建触发器
触发器是用来“评估”监控项采集到的数据是不是“可接收”的范围。下面我们新建一个触发器
点击“配置”--“主机”--选择对应主机--“触发器”---“创建触发器”
好,那么我们现在测试一下,在监控对象上手动kill掉app.py这个进程
可以看到zabbix仪表板上已经显现出该问题,成功完成对该进程的监控。但是我们日常工作中不可能时刻盯着仪表板,这个时候我们需要设置报警媒介,来实现出现问题后将告警通过企业微信、钉钉、邮件、短信等方式发送到运维人员的手机上。
4、设置报警媒介
这里我们以企业微信接收告警为例说明,前往企业微信官网注册一个企业(个人也可以注册,只是功能会受限,但是不影响我们接收告警)随后创建一个群聊,这个群聊里可以添加你们企业对应的运维人员。
添加一个机器人,随后记住这个机器人的webhook地址,等下会用到
在默认目录/usr/lib/zabbix/alertscripts/目录下新建一个文件,vi weixin.py
把以下代码复制进去
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests
import sys
# 替换为你的企业微信机器人的实际Webhook URL
api_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your_valid_key"
def send_message(sender, recipient, message):
# 构建要发送的消息内容
text = "告警信息 - 发送者: %s, 接收者: %s, 消息: %s" % (sender, recipient, message)
# 准备发送的消息结构
data = {
"msgtype": "text",
"text": {
"content": text
}
}
# 发送请求
response = requests.post(api_url, json=data)
# 打印响应内容
print(response.content)
# 根据响应状态码判断是否发送成功
if response.status_code == 200:
print("告警消息发送成功")
else:
print("告警消息发送失败")
if __name__ == '__main__':
# 检查是否提供了正确的参数数量
if len(sys.argv) != 4:
print("使用方法: python weixin.py <发送者> <接收者> <消息>")
sys.exit(1)
# 从命令行参数中获取发送者、接收者和消息
sender, recipient, message = sys.argv[1], sys.argv[2], sys.argv[3]
# 发送消息
send_message(sender, recipient, message)
然后chmod +x weixin.py 给权限 chwon zabbix:zabbix weixin.py 把文件所属者改成zabbix
随后进入zabbix的web端创建媒介类型
脚本参数:{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
填完之后我们找到刚刚创建的媒介类型,点击测试(5.0以上的版本才有此功能),测试成功的话代表没问题
可以看到测试发送消息是没问题的,我们进行下一步。
把刚刚创建的报警媒介类型绑定到用户上去
然后转到动作 创建动作 名称可以自定义,点击“操作
可以按照我这样填写
主题模板如下:
故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生:{TRIGGER.NAME}故障! 故障通知!!
消息模板如下:
告警主机:{HOSTNAME1}
IP地址:{HOST.CONN}
告警时间:{EVENT.DATE} {EVENT.TIME}(UTC)
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
刚刚只是添加了故障时的操作,现在还需要添加故障恢复的操作
主题模板如下:
恢复{TRIGGER.STATUS},服务器:{HOSTNAME1}:{TRIGGER.NAME}已恢复!!
消息模板如下:
告警主机:{HOSTNAME1}
IP地址:{HOST.CONN}
告警时间:{EVENT.DATE} {EVENT.TIME}(UTC)
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
5、告警测试
至此设置已全部完成,接下来我们模拟监控对象上某个进程掉线看是否能发送告警消息至运维人员手机。
手动kill掉对应进程,可以看到zabbix仪表板已显示对应告警
随后企业微信也收到对应告警信息,至此完成。
最后,我要感谢读者和观众,是你们的关注和支持让我的努力有了意义。我希望这篇文章能够对你们有所帮助,也希望能够与你们共同学习、共同进步。
感谢你们的陪伴和支持!