第十周作业
1 zabbix 架构原理,及常用组件及用途分析。
1.1zabbix监控原理
Agentd
安装在被监控的主机上,Agentd
负责定期收集客户端本地各项数据,并发送至zabbix server
端,zabbix server
收到数据,将数据存储到数据库中,用户基于zabbix WEB
可以看到数据在前端展现图像。当zabbix
监控某个具体的项目,该项目会设置一个触发器阈值,当被监控的指标超过该触发器设定的阈值,会进行一些必要的动作,动作包括:发送信息(邮件、微信、短信)、发送命令(shell
命令、reboot
、restart
、install
等)
1.2 常用组件及用途
zabbix server
:zabbix服务端守护进程。既是保存所有配置、统计和操作数据的数据库,也是故障报警服务。- 数据库:所有配置信息以及 Zabbix 采集到的数据都被存储在数据库中。可以支持MySQL,PostgreSQL,Oracle 等多种数据库
zabbix agentd
:部署在被监控目标上,用于主动监控本地资源和应用程序,并将收集的数据发送给Zabbix server
。从Zabbix5.0
开始支技Zabbix Agent2
- WEB 界面: WEB 界面是 Zabbix server 的一部分,用于实现展示和配置的界面。通常(但不一定)和 Zabbix server 运行在同一台物理机器上。基于
Apache(Nginx)+PHP
实现,早期只支持LAMP
架构,从Zabbix5.0
开始支持LNMP
- proxy:Zabbix proxy 可以代替 Zabbix server采集性能和可用性数据。Zabbix proxy在Zabbix的部署是可选部分;但是proxy的部署可以很好的分担单个Zabbix server的负载。
- Java gateway:Zabbix 要监控 tomcat 服务器和其它JAVA程序,需要使用
Java gateway
做为代理,才能从JAVA程序中获取数据。它只能主动去获取数据,而不能被动获取数据。它的数据最终会给到server或者proxy。
2 监控LNMP架构,并配置报警升级,0-5分钟不报警执行重启应用,5-30分钟通知运维,30-60分钟短信通过总监。
2.1 搭建LNMP并配置
参照之前搭建在10.0.0.8上的LNMP架构,然后利用zabbix server进行监控
搭建完的LNMP架构,进行以下配置
[15:43:03 root@rocky8 conf.d]$ vi /apps/nginx/conf/nginx.conf
http{
server {
......
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
#添加下面两个location,用于监控nginx和php
location /status {
stub_status;
allow 127.0.0.1;
allow 10.0.0.101;
deny all;
}
location ~ ^/(ping|fpm_status)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}
2.2 配置监控项
2.2.1 配置agent
[16:20:03 root@rocky8 ~]$ sed -i.bak '/^Server=127.0.0.1/c Server=10.0.0.101' /etc/zabbix/zabbix_agent2.conf #指向zabbix server地址
[16:20:46 root@rocky8 ~]$ vi /etc/zabbix/zabbix_agent2.conf
AllowKey=system.run[*] #文件最后加上这一行
[16:21:37 root@rocky8 ~]$ vi /etc/sudoers
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
#添加下面一行
zabbix ALL=(ALL) NOPASSWD: ALL
#检查语法
[16:23:02 root@rocky8 ~]$ visudo -c
/etc/sudoers: parsed OK
[16:23:27 root@rocky8 ~]$ systemctl restart zabbix-agent2.service
2.2.2 自定义监控nginx
[15:54:35 root@rocky8 zabbix_agent2.d]$ cat nginx_status.conf
UserParameter=nginx.status[*],/etc/zabbix/zabbix_agent2.d/nginx_status.sh $1
[15:54:49 root@rocky8 zabbix_agent2.d]$ cat nginx_status.sh
#!/bin/bash
HOST=127.0.0.1
PORT="80"
if [ $# -eq "0" ];then
echo "Usage:$0(active|reading|writing|waiting|accepts|handled|requests|ping)"
fi
function active {
/usr/bin/curl "http://$HOST:$PORT/status" 2>/dev/null| grep 'Active' | awk '{print $NF}'
}
function reading {
/usr/bin/curl "http://$HOST:$PORT/status" 2>/dev/null| grep 'Reading' | awk '{print $2}'
}
function writing {
/usr/bin/curl "http://$HOST:$PORT/status" 2>/dev/null| grep 'Writing' | awk '{print $4}'
}
function waiting {
/usr/bin/curl "http://$HOST:$PORT/status" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
}
function accepts {
/usr/bin/curl "http://$HOST:$PORT/status" 2>/dev/null| awk NR==3 | awk '{print $1}'
}
function handled {
/usr/bin/curl "http://$HOST:$PORT/status" 2>/dev/null| awk NR==3 | awk '{print $2}'
}
function requests {
/usr/bin/curl "http://$HOST:$PORT/status" 2>/dev/null| awk NR==3 | awk '{print $3}'
}
function ping {
/sbin/pidof nginx | wc -l
}
$1
#测试
[16:11:53 root@rocky8 zabbix_agent2.d]$ zabbix_agent2 -t nginx.status[active]
nginx.status[active] [s|1]
[16:13:05 root@rocky8 zabbix_agent2.d]$ zabbix_agent2 -t nginx.status[accepts]
nginx.status[accepts] [s|20]
#zabbix server测试
[15:40:46 root@zabbix-server ~]$ zabbix_get -s 10.0.0.8 -k nginx.status[active]
1
2.2.3 自定义监控MySQL
[16:06:06 root@rocky8 zabbix_agent2.d]$ mysql -e 'create user zabbix@"localhost" identified by "lgq123456";'
[16:08:08 root@rocky8 zabbix_agent2.d]$ cat mysql.conf
UserParameter=mysql_version,mysql -V
UserParameter=mysql_status[*],/etc/zabbix/zabbix_agent2.d/mysql.sh $1 2>/dev/null
UserParameter=mysql_ping,mysqladmin -uzabbix -plgq123456 -P3306 -h127.0.0.1 ping
UserParameter=mysql_repl_status[*],/etc/zabbix/zabbix_agent2.d/mysql_repl_status.sh $1
[16:08:14 root@rocky8 zabbix_agent2.d]$ cat mysql_repl_status.sh
#!/bin/bash
KEY=$1
PASS='lgq123456'
mysql -uroot -p$PASS -e "show slave status\G"|grep "${KEY}"|awk '{print $NF}'
[16:08:27 root@rocky8 zabbix_agent2.d]$ cat mysql.sh
#!/bin/bash
MYSQL_USER='zabbix'
MYSQL_PWD='lgq123456'
MYSQL_HOST='127.0.0.1'
MYSQL_PORT='3306'
MYSQL_CONN="/usr/bin/mysqladmin -u${MYSQL_USER} -p${MYSQL_PWD} -h${MYSQL_HOST} -P${MYSQL_PORT}"
if [ $# -ne "1" ];then
echo "arg error!"
fi
case $1 in
Threads)
result=`${MYSQL_CONN} status |awk '{print $4}'`
;;
Uptime)
result=`${MYSQL_CONN} status|cut -f2 -d":"|cut -f1 -d"T"`
;;
Com_update)
result=`${MYSQL_CONN} extended-status |grep -w "Com_update"|cut -d"|" -f3`
;;
Slow_queries)
result=`${MYSQL_CONN} status |cut -f5 -d":"|cut -f1 -d"O"`
;;
Com_select)
result=`${MYSQL_CONN} extended-status |grep -w "Com_select"|cut -d"|" -f3`
;;
Com_rollback)
result=`${MYSQL_CONN} extended-status |grep -w "Com_rollback"|cut -d"|"-f3`
;;
Questions)
result=`${MYSQL_CONN} status|cut -f4 -d":"|cut -f1 -d"S"`
;;
Com_insert)
result=`${MYSQL_CONN} extended-status |grep -w "Com_insert"|cut -d"|" -f3`
;;
Com_delete)
result=`${MYSQL_CONN} extended-status |grep -w "Com_delete"|cut -d"|" -f3`
;;
Com_commit)
result=`${MYSQL_CONN} extended-status |grep -w "Com_commit"|cut -d"|" -f3`
;;
Bytes_sent)
result=`${MYSQL_CONN} extended-status |grep -w "Bytes_sent" |cut -d"|" -f3`
;;
Bytes_received)
result=`${MYSQL_CONN} extended-status |grep -w "Bytes_received" |cut -d"|" -f3`
;;
Com_begin)
result=`${MYSQL_CONN} extended-status |grep -w "Com_begin"|cut -d"|" -f3`
;;
*)
echo "Usage:$0(Threads|Uptime|Com_update|Slow_queries|Com_select|Com_rollback|Questions|Com_insert|Com_delete|Com_commit|Bytes_sent|Bytes_received|Com_begin)"
;;
esac
echo $result
#测试自定义监控项
[16:14:03 root@rocky8 zabbix_agent2.d]$ zabbix_agent2 -t mysql_version
mysql_version [s|mysql Ver 8.0.30 for Linux on x86_64 (Source distribution)]
[16:14:26 root@rocky8 zabbix_agent2.d]$ zabbix_agent2 -t mysql_ping
mysql_ping [s|mysqladmin: [Warning] Using a password on the command line interface can be insecure.
mysqld is alive]
[16:15:16 root@rocky8 zabbix_agent2.d]$ zabbix_agent2 -t mysql_status[Threads]
mysql_status[Threads] [s|2]
#zabbix server测试
[16:22:17 root@zabbix-server ~]$ zabbix_get -s 10.0.0.8 -k mysql_ping
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
mysqld is alive
[16:23:30 root@zabbix-server ~]$ zabbix_get -s 10.0.0.8 -k mysql_version
mysql Ver 8.0.30 for Linux on x86_64 (Source distribution)
2.2.4 在zabbix server web界面添加监控主机
2.2.5 导入配置好的模板文件
2.2.6 被监控主机关联模板
2.2.7 故障自愈实现
当zabbix服务监控到指定的监控项异常时,可以通过指定的操作使故障自动恢复
配置远程命令的操作类似于发送消息,区别在于一个执行命令,一个发送消息
远程命令可以直接在ZabbixServer
,ZabbixProxy
和ZabbixAgent
上执行。
2.2.8 分级告警
2.2.9 用户配置报警媒介
将报警媒介关联用户
2.3 测试
- 模拟nginx故障
[18:08:03 root@rocky8 ~]$ systemctl stop nginx.service
[18:08:08 root@rocky8 ~]$ ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 127.0.0.1:9000 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 *:10050 *:*
LISTEN 0 70 *:33060 *:*
LISTEN 0 128 *:3306 *:*
LISTEN 0 128 [::]:22 [::]:*
#发现立马实现了自动重启
[18:08:56 root@rocky8 ~]$ ss -ntl |grep 80
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
- 模拟php故障
[18:10:01 root@rocky8 ~]$ systemctl stop php-fpm.service
[18:10:09 root@rocky8 ~]$ ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 *:10050 *:*
LISTEN 0 70 *:33060 *:*
LISTEN 0 128 *:3306 *:*
LISTEN 0 128 [::]:22 [::]:*
#一分钟后重启了
[18:11:19 root@rocky8 ~]$ systemctl status php-fpm.service
● php-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2022-12-08 18:18:02 CST; 1min 27s ago
Main PID: 64860 (php-fpm)
Status: "Processes active: 0, idle: 5, Requests: 1, slow: 0, Traffic: 0req/sec"
Tasks: 6 (limit: 11218)
Memory: 9.7M
CGroup: /system.slice/php-fpm.service
├─64860 php-fpm: master process (/etc/php-fpm.conf)
├─64861 php-fpm: pool www
├─64862 php-fpm: pool www
├─64863 php-fpm: pool www
├─64864 php-fpm: pool www
└─64865 php-fpm: pool www
Dec 08 18:18:02 rocky8.yanlinux.cn systemd[1]: Starting The PHP FastCGI Process Manager...
Dec 08 18:18:02 rocky8.yanlinux.cn systemd[1]: Started The PHP FastCGI Process Manager.
- 模拟MySQL故障
[18:13:11 root@rocky8 ~]$ systemctl stop mysqld.service
[18:13:30 root@rocky8 ~]$ ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 *:10050 *:*
LISTEN 0 128 [::]:22 [::]:*
#随后立即重启了服务
[18:13:47 root@rocky8 ~]$ ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 *:10050 *:*
LISTEN 0 70 *:33060 *:*
LISTEN 0 128 *:3306 *:*
LISTEN 0 128 [::]:22 [::]:*
- 故障持续5-30min验证发邮箱
3 zabbix api批量添加多个主机,要求一些不走代理,一些支持走代理。
3.1 Zabbix API 介绍
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组功能的能力,而又无需直接使用源代码,或理解内部工作机制的细节。
Zabbix API允许你以编程方式检索和修改Zabbix的配置,并提供对历史数据的访问。它广泛用于:
- 创建新的应用程序以使用Zabbix
- 将Zabbix与第三方软件集成
- 自动执行常规任务
Zabbix API是基于Web的API,作为Web前端的一部分提供。它使用JSON-RPC 2.0协议,这意味着两件事:
- 该API包含一组独立的方法
- 客户端和API之间的请求和响应使用JSON格式进行编码
大多数API至少包含四种方法: get
, create
,update
和 delete
,分别是检索,创建,更新和删除数据,但是某些API提供一套完全不同的一组方法。
Zabbix 常用API
user.login #用户登录
host.get(create|delete|update) #主机操作
hostgroup.get(create|delete|update) #主机组操作
item.get(create|delete|update) #监控项目操作
history.get #历史数据查询
event.get #事件查询
trigger.get #触发器查询
3.2 获取 Token
在访问Zabbix内部的任何数据之前,需要登录并获得身份验证令牌。这可以使用user.login
方法来完成。
假设以Zabbix的Admin用户登录。那么JSON请求将是这样的:
[15:46:07 root@zabbix-server ~]$ cat zabbix-api-token.sh
#!/bin/bash
ZABBIX_SERVER=zabbix.yanlinux.org
curl -s -XPOST -H "Content-Type: application/json-rpc" -d '
{
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "Admin",
"password": "zabbix"
},
"id": 1,
"auth": null
}' http://${ZABBIX_SERVER}/api_jsonrpc.php
[15:47:36 root@zabbix-server ~]$ sh zabbix-api-token.sh |jq
{
"jsonrpc": "2.0",
"result": "eeda15e7aaaab59206c03ff9ca6be32e",
"id": 1
}
3.3 脚本实现批量添加主机
[22:00:58 root@zabbix-server ~]$ cat zabbix-api.sh
#!/bin/bash
ZABBIX_SERVER=zabbix.yanlinux.org
TOKEN=$(./zabbix-api-token.sh| awk -F'"' '{print $8}')
IPLIST=(10.0.0.17 10.0.0.27 10.0.0.18 10.0.0.48 10.0.0.58 10.0.0.102)
for ((i=0; i<${#IPLIST[@]}; i++ ));do
addhost_confige='
{
"jsonrpc": "2.0",
"method": "host.create",
"params": {
"host": "'${IPLIST[$i]}'",
"name": "'web-api-${IPLIST[$i]}'",
"interfaces": [
{
"type": 1,
"main": 1,
"useip": 1,
"ip": "'${IPLIST[$i]}'",
"dns": "",
"port": "10050"
}
],
"groups": [
{
"groupid": "2"
}
],
"templates": [
{
"templateid": "10001"
}
]
},
"id": 1,
"auth": "'$TOKEN'"
}'
addproxy_confige='
{
"jsonrpc": "2.0",
"method": "host.create",
"params": {
"host": "'${IPLIST[$i]}'",
"name": "'web-proxy-api-${IPLIST[$i]}'",
"proxy_hostid": "10455",
"interfaces": [
{
"type": 1,
"main": 1,
"useip": 1,
"ip": "'${IPLIST[$i]}'",
"dns": "",
"port": "10050"
}
],
"groups": [
{
"groupid": "2"
}
],
"templates": [
{
"templateid": "10001"
}
]
},
"id": 1,
"auth": "'$TOKEN'"
}'
if [ $i -lt 4 ];then
curl -s -XPOST -H "Content-Type: application/json-rpc" -d "${addhost_confige}" http://${ZABBIX_SERVER}/api_jsonrpc.php | python3 -m json.tool
else
curl -s -XPOST -H "Content-Type: application/json-rpc" -d "${addproxy_confige}" http://${ZABBIX_SERVER}/api_jsonrpc.php | python3 -m json.tool
fi
done
4 总结zabbix自定义监控项,基于自定义监控项监控nginx。
4.1 自定义监控项
监控项键值的格式:https://www.zabbix.com/documentation/5.0/zh/manual/config/items/item/key
客户端可以自定义监控项,在Zabbix Agent 配置文件添加内容,格式如下
#cat /etc/zabbix/zabbix_agentd.conf
#cat /etc/zabbix/zabbix_agent2.conf
UserParameter=<key>,<shell command>
Include=/etc/zabbix/zabbix_agentd.d/*.conf
#或者创建独立的自定义文件
#cat /etc/zabbix/zabbix_agentd.d/*.conf
#cat /etc/zabbix/zabbix_agent2.d/*.conf
UserParameter=<key>,<shell command>
说明:
key 必须整个系统唯一。注意大小写是敏感的, Key名允许的字符如下:
0-9a-zA-Z_-.
key使用 [*] 用于定义该key接受括号内的参数。参数需在配置监控项时给出;参数禁止使用下列字符:\ ’ ” ` * ? [ ] { } ~ $ ! & ; ( ) <>
Command:命令用于生成key对应的值。可以在命令中使用位置引用$1 … $9来引用监控项Key中的相应参数。Zabbix解析监控项Key的[]中包含的参数,并相应地替换$1,…,$9。$0会替换为完整的原始命令(在对$0,…,$9执行替换之前的命令)运行。不管位置参数($0,…,$9)是用双引号( “ )还是单引号( ’ )括起来,都会解析位置引用
测试监控项
- 在Zabbix Agent 上执行测试:
zabbix_agent -t "在客户端定义的key名"
- 在Zabbix Server上可以使用zabbix_get工具获取自定义监控项:
zabbix_get -s 客户端IP -p 10050 -k "在客户端定义的key名"
4.2 自定义监控nginx
4.2.1 安装和配置nginx服务
#在10.0.0.18上安装nginx
[14:56:25 root@rocky8 ~]$ yum -y install nginx
[15:10:39 root@rocky8 ~]$ vi /etc/nginx/nginx.conf
http{
server {
......
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
#添加下面几行
location /basic_status {
stub_status;
allow 126.0.0.1;
allow 10.0.0.101;
deny all;
}
}
}
[15:13:05 root@rocky8 ~]$ systemctl enable --now nginx.service
[15:14:59 root@rocky8 ~]$ curl http://127.0.0.1/basic_status
Active connections: 1
server accepts handled requests
1 1 1
Reading: 0 Writing: 1 Waiting: 0
[18:32:51 root@rocky8 ~]$ vi /etc/zabbix/zabbix_agent2.d/nginx_status.sh
HOST=126.0.0.1
PORT="80"
if [ $# -eq "0" ];then
echo "Usage:$0(active|reading|writing|waiting|accepts|handled|requests|ping)"
fi
# Functions to return nginx stats
function active {
/usr/bin/curl "http://$HOST:$PORT/basic_status" 2>/dev/null| grep 'Active' | awk '{print $NF}'
}
function reading {
/usr/bin/curl "http://$HOST:$PORT/basic_status" 2>/dev/null| grep 'Reading' | awk '{print $2}'
}
function writing {
/usr/bin/curl "http://$HOST:$PORT/basic_status" 2>/dev/null| grep 'Writing' | awk '{print $4}'
}
function waiting {
/usr/bin/curl "http://$HOST:$PORT/basic_status" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
}
function accepts {
/usr/bin/curl "http://$HOST:$PORT/basic_status" 2>/dev/null| awk NR==3 | awk '{print $1}'
}
function handled {
/usr/bin/curl "http://$HOST:$PORT/basic_status" 2>/dev/null| awk NR==3 | awk '{print $2}'
}
function requests {
/usr/bin/curl "http://$HOST:$PORT/basic_status" 2>/dev/null| awk NR==3 | awk '{print $3}'
}
function ping {
/sbin/pidof nginx | wc -l
}
$1
[18:36:28 root@rocky8 ~]$ chmod +x /etc/zabbix/zabbix_agent2.d/nginx_status.sh
[18:38:23 root@rocky8 ~]$ vim /etc/zabbix/zabbix_agent2.d/nginx_status.conf
UserParameter=nginx.status[*],/etc/zabbix/zabbix_agent2.d/nginx_status.sh $1
#重启
[18:42:53 root@rocky8 ~]$ systemctl restart zabbix-agent2.service
#测试
[18:43:18 root@rocky8 ~]$ zabbix_agent2 -t nginx.status[active]
nginx.status[active] [s|1]
[18:43:32 root@rocky8 ~]$ zabbix_agent2 -t nginx.status[writing]
nginx.status[writing] [s|1]
[18:43:48 root@rocky8 ~]$ zabbix_agent2 -t nginx.status[accepts]
nginx.status[accepts] [s|12]
#zabbix server测试
[16:58:01 root@zabbix-server ~]$ zabbix_get -s 10.0.0.18 -k nginx.status[active]
1
[18:44:36 root@zabbix-server ~]$ zabbix_get -s 10.0.0.18 -k nginx.status[writing]
1
[18:44:50 root@zabbix-server ~]$ zabbix_get -s 10.0.0.18 -k nginx.status[accepts]
15
4.2.2自定义模板及监控项并在添加监控的主机上关联模板
关联主机
查看数据
5 基于zabbix实现邮件或微信告警。
5.1 邮箱开启 SMTP 功能
在邮箱上开启SMTP功能,利用此邮箱实现发送报警邮件
5.2 创建报警媒介类型实现发信人功能
报警媒介类型是一种给运维工程师发送消息通知的渠道,即当zabbix的触发器触发一个事件后,怎么才能把这个事件通过某些方式通知给运维工程师呢? 媒介类型就起到此作用,如果想要实现邮件告警功能,那么对应的媒介类型就是配置用来发送告警邮件的发件人邮箱。
管理–>报警媒介类型–>创建报警媒介类型
添加消息模板用于发送信息
测试
5.3 给指定用户添加报警媒介实现收件人功能
媒介类型创建好之后,还需要在每个zabbix账户里面添加相应的收件配置,比如邮件类型的媒介类型要给zabbix账户添加邮箱,如果是微信类型的媒介类型那么就要在zabbix账户设置微信号,短信类型的媒介类型那就得给zabbix账户设置手机号用于接收报警消息内容。
在zabbix用户中添加报警媒介时,需要指定告警信息的收件人的邮件地址
然后点击更新
5.4 创建和配置动作
动作可以实现当触发器被触发后可以执行哪些操作,一般可以是发送告警或执行命令
关于宏,即一些在Zabbix 中可以调用的变量
5.4.1 创建动作
指定动作即条件为事件的严重度为信息时就触发动作
现在暂停被监控主机上的80端口,然后测试是否会发送消息
查看邮箱是否收到邮件
现在恢复被监控主机上的80端口,查看邮件
5.5 分级告警
当出现报警后,一般会根据组织的重要级别,按时间逐级分层向上报警,如下面常见分层报警
初级运维/指定运维组-->高级运维工程师/业务运维-->架构师--->总监/CTO
要实现分级告警,必须确保有多个用户,并分别指定不同的邮箱
5.6 邮件告警方法2
也可以利用脚本方式进行邮件告警
5.6.1 安装邮件相关软件和配置邮件
利用 sendemail 工具实现邮件脚本
[12:36:21 root@zabbix-server ~]$ vi /usr/lib/zabbix/alertscripts/send_mail.sh
#!/bin/bash
email_send='lgq6569@163.com'
email_passwd='授权码'
email_smtp_server='smtp.163.com'
. /etc/os-release
msg_error() {
echo -e "\033[1;31m$1\033[0m"
}
msg_info() {
echo -e "\033[1;32m$1\033[0m"
}
msg_warn() {
echo -e "\033[1;33m$1\033[0m"
}
color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \E[0m"
echo -n "$1" && $MOVE_TO_COL
echo -n "["
if [ $2 = "success" -o $2 = "0" ] ;then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $2 = "failure" -o $2 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}
install_sendemail () {
if [[ $ID =~ rhel|centos|rocky ]];then
rpm -q sendemail &> /dev/null || yum install -y sendemail
elif [ $ID = 'ubuntu' ];then
dpkg -l |grep -q sendemail || { apt update; apt install -y libio-socket-ssl-perl libnet-ssleay-perl sendemail ; }
else
color "不支持此操作系统,退出!" 1
exit
fi
}
send_email () {
local email_receive="$1"
local email_subject="$2"
local email_message="$3"
sendemail -f $email_send -t $email_receive -u $email_subject -m $email_message -s $email_smtp_server -o message-charset=utf-8 -o tls=yes -xu $email_send -xp $email_passwd
[ $? -eq 0 ] && color "邮件发送成功!" 0 || color "邮件发送失败!" 1
}
if [ $# -ne 3 ];then
color "脚本参数不正确!" 1
msg_info "Usage: `basename $0` <mail_address> <subject> <message>"
exit 1
fi
install_sendemail
send_email "$1" "$2" "$3"
[16:02:15 root@zabbix-server ~]$ chmod +x /usr/lib/zabbix/alertscripts/send_mail.sh
#测试发送
[16:03:12 root@zabbix-server alertscripts]$ ./send_mail.sh 1499214186@qq.com test "This is a test mail"
5.6.2 创建邮件报警媒介类型
脚本参数如下:
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
5.6.3 将报警媒介关联用户
5.6.4 创建动作和操作
5.6.5 验证邮件告警
测试故障
[16:33:21 root@centos6 ~]$ systemctl start nginx.service
测试故障恢复
[16:26:38 root@rocky8 ~]$ systemctl start nginx.service
6 总结zabbix自动发现监控
6.1 Zabbix 网络发现
6.1.1 Zabbix 网络发现介绍
之前都是手动一台一台主机的添加到 Zabbix 中进行监控,很是繁琐,可以利用自动发现功能,自动添加被
监控的主机。当众多的服务器都已经安装了agent或者snmp后,利用自动发现功能,Zabbix server 可以自动扫描预先配置好的ip段,自动添加主机,自动关联模板,自动加到主机组里等等。
自动发现虽然能自动完成发现并添加主机,但仍然存在一些问题
- 发现时间长,效率较低
- 扫描过程中容易漏扫
- 当IP地址不固定难以实现
- 无法实现不同类型主机关联不同模板
6.1.2 实现 Zabbix 网络发现
6.1.2.1 创建自动发现指定需要监控的网段
配置– 自动发现– 创建发现规则
6.1.2.2 创建添加主机的自动发现动作
创建新的动作
6.1.2.3 创建删除主机的自动发现动作
6.1.2.4 验证自动发现的结果
一段时间后,可以观察到下面结果,自动添加两台主机并关联相应的模板
测试自动删除
关闭10.0.0.26的agent服务,然后查看已经删除掉
6.2 Zabbix 自动注册
6.2.1 Zabbix 自动注册介绍
利用Zabbix的自动注册功能,实现添加主机的自动化,可以大幅减少运维的工作量,减少Zabbix Server 的资源消耗
此方式和自动发现不同,是由Active agent主动发起请求zabbix server将这些agent加到主机里。
注意: Agent 必须使用主动模式才支持自动注册
自动注册由于比自动发现效率更好,Zabbix Server资源消耗更少,更适合大规模及云环境IP地址不固定的场景使用
在Zabbix agent 端的配置文件修改以下项目:
Server=<Zabbix Server IP>
ServerActive=<Zabbix Server IP> #客户端主动模式是实现自动注册的前提条件
Hostname=<agent IP>
#HostnameItem=system.hostname
HostMetadata==<key> #非必须项,可以做为添加主机的验证标识和分类,或者实现加入主机的验证功能
HostMetadataItem=<监控项Item> #非必须项,监控项的值可以做为添加主机的验证标识和分类
6.2.2 案例: 实现 Linux 主机自动注册
6.2.2.1 修改 Zabbix agent 的配置
范例:
[15:02:56 root@centos6 ~]$ vi /etc/zabbix/zabbix_agent2.conf
Server=10.0.0.101 #zabbix Server地址
ServerActive=10.0.0.101 #zabbix Server地址
Hostname=web-10.0.0.26 ##指定主机名,如果不指定,则服务器将使用agent的系统主机名
[15:05:16 root@centos6 ~]$ systemctl restart zabbix-agent2.service
[15:03:20 root@rocky8 ~]$ vi /etc/zabbix/zabbix_agent2.conf
Server=10.0.0.101
ServerActive=10.0.0.101
Hostname=web-10.0.0.48
[15:06:45 root@rocky8 ~]$ systemctl restart zabbix-agent2.service
6.2.2.2 在 Zabbix Server 配置动作
在配置—动作—选择自动注册动作
6.2.2.3 验证结果
稍过一会儿,再观察可以看到下面显示添加主机成功
另外也可以利用验证信息首先自动注册
#修改zabbix_agent2.conf文件的HostMetadata,实现验证
[15:19:21 root@centos6 ~]$ vi /etc/zabbix/zabbix_agent2.conf
Server=10.0.0.101
ServerActive=10.0.0.101
Hostname=web-10.0.0.26
HostMetadata=123456
[15:21:43 root@centos6 ~]$ systemctl restart zabbix-agent2.service
观察主机10.0.0.26添加成功,10.0.0.48没有添加成功