安装zabbix 5.0 监控端
CentOS8监控端安装
# ** 注意centos8 阿里镜像源地址已换, 需要删除原来的镜像重新拉取
# 删除原来的镜像配置
rm -rf /etc/yum/repos.d/*
# 拉取最新的
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
# 生成缓存
dnf makecache
# 拉取zabbix 5.0镜像源
rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/8/x86_64/zabbix-release-5.0-1.el8.noarch.rpm
dnf clean all
# 安装zabbix组件
dnf install -y zabbix-server-mysql zabbix-web-mysql zabbix-nginx-conf zabbix-agent
# 连接已有mysql, 创建数据库
create database zabbix
# 创建zabbix连接用户
grant all privileges on zabbix.* to zabbix@localhost identified by '20220512';
# 导入初始架构和数据,系统将提示您输入新创建的密码
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p'20220512' zabbix
# 编辑配置文件修改zabbix 连库信息
vim /etc/zabbix/zabbix_server.conf
-- DBPassword=20220512
# 打开zabbix 前端nginx配置, 如果已存在nginx, 将配置信息, 复制到原有的nginx.conf即可
# ** 注意 php-fpm 与 nginx 通讯时有user权限校验, 所以需要把nginx.conf的user改为apache
# 或者修改php-fpm user名称
vim /etc/nginx/conf.d/zabbix.conf
# 修改php-fpm配置
vim /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf
-- php_value[date.timezone] = Asia/Shanghai
# 重启这些服务
systemctl restart zabbix-server zabbix-agent php-fpm
# 访问管理页面
主机:端口
被监控端安装
安装zabbix-agent2
# CentOS 安装
dnf install zabbix-agent2 -y
# ubuntu 安装
apt install zabbix-agent2
# 修改配置文件
vim /etc/zabbix/zabbix_agent2.conf
-- Server=172.16.xx.xx #修改为监控端的主机ip
-- ServerActive=172.16.xx.xx #修改为监控端的主机ip
-- Hostname=monitor_handle # 主机名称与监控端[配置-主机-创建主机]中所配置的主机名称保持一致
-- UnsafeUserParameters=1 # 设置为1, 防止获取监控参数是格式化乱码
# 重启服务
service zabbix-agent2 restart
安装zabbix-agent(外网不可访问只能用旧版)
# CentOS 安装
dnf install zabbix-agent -y
# ubuntu 安装
apt install zabbix-agent
# 修改配置文件
vim /etc/zabbix/zabbix_agentd.conf
-- Server=172.16.xx.xx #修改为监控端的主机ip
-- ServerActive=172.16.xx.xx #修改为监控端的主机ip
-- Hostname=monitor_handle # 主机名称与监控端[配置-主机-创建主机]中所配置的主机名称保持一致
-- UnsafeUserParameters=1 # 设置为1, 防止获取监控参数是格式化乱码
# 重启服务
service zabbix-agent restart
用例
添加监控主机(监控页面)
添加监控模板(就是zabbix已经配置好的监控方案)
1. 监控nginx
被监控端配置(nginx.conf)
# 添加代理
location /nginx_status {
stub_status;
}
监控端配置
-
添加个名为[Template App Nginx by Zabbix agent]监控模板
-
配置宏
效果图
2. 监控java服务存活
被监控端配置
# 比如目前有一个[kn-review-handle-0.0.1-SNAPSHOT.jar]服务
cd etc/zabbix/zabbix_agentd.d # 进入到zabbix_agent.d 配置文件中
# UserParameter=监控key, 执行的命令
# ps -ef | grep kn-review-handle-0.0.1-SNAPSHOT.jar | grep -v grep |wc -l 可以获取kn-review-handle-0.0.1-SNAPSHOT.jar这个jar包的服务是否存活(1存活/0挂掉)
# 添加到配置文件中:
UserParameter=kn-review-handle,ps -ef | grep kn-review-handle-0.0.1-SNAPSHOT.jar | grep -v grep |wc -l
监控端管理页面配置
创建触发器
3. 监控mysql
3.1.1 zabbix-agent2 被监控端配置
vim /etc/zabbix/.my.cnf
[mysql]
user=被监控数据库的连接用户名
password=被监控数据库的连接密码
[mysqladmin]
user=被监控数据库的连接用户名
password=被监控数据库的连接密码
# 重启zabbix-agent2 服务
service zabbix-agent2 restart
3.1.2 监控端配置
只需要添加个名为[Template DB MySQL by Zabbix agent2]监控模板即可
3.2.1 zabbix-agent被监控端配置(自定义监控)
由于外网无法访问, zabbix-agent2 安装有障碍
所以改用旧版的zabbix-agent
问题:
1. 监控端zabbix为5.0, 被监控端为旧版zabbix-agent, 使用现成的mysql监控模板时会获取不到监控数据
解决:
1. 编写脚本获取mysql监控数据
2. 配置一个监控变量
3. 用监控端zabbix, 来获取此变量
- 准备python脚本(MysqlGlobalStatus.py), 获取mysql状态信息
import json
import sys
import pymysql
'''
获取mysql状态信息, 并输出为json格式
'''
class MysqlGlobalStatus:
def __init__(self, host, password):
conn = pymysql.connect(host=host, user='root', password=password)
cursor = conn.cursor()
cursor.execute("show global status")
print(json.dumps(dict(cursor.fetchall())))
if __name__ == '__main__':
# mysql主机
host = sys.argv[1]
# mysql密码
password = sys.argv[2]
g = MysqlGlobalStatus(host, password)
-
放入到 /etc/zabbix/zabbix_agentd.conf.d目录下
# 测试一下是否可以获取到 # 可以根据需求修改脚本 执行参数, 当前参数为(连接主机和连接密码) python3 /etc/zabbix/zabbix_agentd.conf.d/MysqlGlobalStatus.py 172.16.xx.xxx 20220125 # 成功, 会输出json格式的 mysql状态信息
-
将mysql默认的模板配置文件复制到 /etc/zabbix/zabbix_agentd.conf.d目录下并配置
cp /usr/share/doc/zabbix-agent/examples/userparameter_mysql.conf /etc/zabbix/zabbix_agentd.conf.d/ vim /etc/zabbix/zabbix_agentd.conf.d/userparameter_mysql.conf # 添加此监控参数 UserParameter=mysql.get_status_variables,python3 /etc/zabbix/zabbix_agentd.conf.d/MysqlGlobalStatus.py 172.16.75.193 konne.cn20220125.
-
重启zabbix-agent
service zabbix-agent restart
3.2.2监控端配置
- 修改原有自带的[ Template DB MySQL by Zabbix agent ] 监控模板(也可以复制出来重新创建一个自定义的)
效果图
4. 监控redis
被监控端条件
1. 被监控端装有redis
2. redis保护模式关闭
总之可被客户端连接
监控端配置
配置zabbix发送告警到钉钉
-
先去钉钉上获取[webhook地址 和 加签secret]
1. 打开一个想要将预警消息推送到的钉钉群 群设置->智能群助手->添加机器人->选择自定义机器人
- 编写发送消息脚本(DingDingWarn.py)
#!/bin/python3
# -*- coding:utf-8 -*-
import base64
import hashlib
import hmac
import json
import sys
import time
import urllib
import requests
"""
zabbix 警告消息通过webhook方式发送到钉钉机器人
"""
class DingDingWarn:
headers = {'Content-Type': 'application/json; charset=utf-8'}
# 从钉钉群机器人配置上获取的webhook地址和加签
url = r'xxx'
secret = 'xxx'
#linux 日志路径(自己定义的)
log_path1 = r'/usr/lib/zabbix/alertscripts/dingdingmsg.log'
#windows 日志路径(自己定义的)
log_path2 = r'D:/project/py/test/dingdingmsg.log'
def __init__(self, alert_subject, alert_message):
'''
初始化发送的钉钉消息
:param alert_subject: 警告消息描述
:param alert_message: 警告消息内容
'''
self.alert_subject = alert_subject
self.alert_message = alert_message
def build_request_url(self):
timestamp = str(round(time.time() * 1000))
secret = self.secret
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
return f'{self.url}×tamp={timestamp}&sign={sign}'
def build_body(self):
'''
构建请求体
:return:
'''
return {
"msgtype": "text",
"text": {
"content": f"告警描述:\n{self.alert_subject}\n\n告警内容:\n{self.alert_message.strip()}"
}
}
def send_msg(self):
'''
发送警告消息
:return:
'''
print(self.build_request_url())
response = requests.post(url=self.build_request_url(), data=json.dumps(self.build_body()), headers=self.headers)
body = response.text
print(body)
if eval(body)['errmsg'] == 'ok':
status = 'send success!'
else:
status = 'send error!'
self.save_log(status)
def save_log(self, status):
'''
保存日志
:param status: 发送状态
:return:
'''
f = open(file=self.log_path1, mode='a')
f.write(f'''
{status.center(25, '-')}
告警描述:
{self.alert_subject}
告警内容:
{self.alert_message}
{'End'.center(30, '-')}
''')
f.close()
if __name__ == '__main__':
# 获取执行参数
alert_subject = sys.argv[1]
alert_message = sys.argv[2].replace('\r\n', '\n')
# 将接受到的消息参数, 输出到日志文件
# a = open("r'/usr/lib/zabbix/alertscripts/dingdingparam.log'", mode='a')
# a.write(alert_subject + '---' + alert_message)
# 发送警告消息
d = DingDingWarn(alert_subject, alert_message)
# print('可执行')
d.send_msg()
-
将脚本文件放到 /usr/lib/zabbix/alertscripts/ 下
-
配置报警媒介
主题:
{HOST.NAME} 告警信息:{TRIGGER.NAME}
消息:
告警主机:{HOST.NAME}
告警地址:{HOST.IP}
监控项目:{ITEM.NAME}
告警信息:{TRIGGER.NAME}
当前状态:{TRIGGER.STATUS}
监控取值:{ITEM.LASTVALUE}
告警时间:{EVENT.DATE} {EVENT.TIME}
恢复时间:{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
持续时间:{EVENT.AGE}
事件ID:{EVENT.ID}
告警等级:{TRIGGER.SEVERITY}
- 设置触发动作
主题:
出现问题!! {HOST.NAME} 监控信息:{TRIGGER.NAME}
消息:
告警主机:{HOST.NAME}
告警地址:{HOST.IP}
监控项目:{ITEM.NAME}
告警信息:{TRIGGER.NAME}
当前状态:{TRIGGER.STATUS}
监控取值:{ITEM.LASTVALUE}
告警时间:{EVENT.DATE} {EVENT.TIME}
恢复时间:{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
持续时间:{EVENT.AGE}
事件ID:{EVENT.ID}
告警等级:{TRIGGER.SEVERITY}