哈喽大家好,我是咸鱼
今天我们来看一个关于 Keepalived
检测脚本无法执行的问题
一位粉丝后台私信我,说他部署的 keepalived
集群 vrrp_script
模块中的脚本执行失败了,但是手动执行这个脚本却没有任何问题
这个问题也是咸鱼第一次遇到,为了能让更多的小伙伴以后不会踩这个坑,便有了今天这篇文章
前言
在正式开始之前,我们先来简单复习一下 Keepalived
中的资源检测功能
vrrp_script 模块
在 Keepalived
中,vrrp_script
模块是用于定义和配置虚拟路由冗余协议(VRRP)的自定义脚本检查,这个模块专门用于对集群中的服务资源进行监控
与 vrrp_script
模块搭配使用的是 track_script
模块,这个模块中可以引入监控脚本、命令组合、Shell 语句来实现对服务资源的监控
track_script
通过调用vrrp_script
,可以灵活地定义需要监测的服务或资源,例如网络连接、服务状态、系统资源等当监测到故障时,Keepalived 可以触发状态转移,将主节点切换到备用节点,以确保服务的高可用性
- 通过
killall -l
命令监测
killall
命令会发送一个信号给进程,以信号 0 为例,如果发现进程关闭或者异常,将返回状态码 1,反之进程运行正常,状态码返回0
vrrp_script nginx_check {
script "killall -0 nginx"
interval 2
}
track_script {
nginx_check
}
- 通过端口监测
检测端口的运行状态也是较常见的监控方式
vrrp_script nginx_check {
script "</dev/tcp/127.0.0.1/80"
interval 2
fall 2
rise 1
}
track_script {
nginx_check
}
其中 fall
表示检测到失败的最大次数(如果请求失败两次,就认为该节点发生了故障)
rise
表示如果请求一次成功,就认为该节点恢复正常
- 通过 shell 语句监测
vrrp_script nginx_check {
script "if [ $(pidof nginx | wc -l) -eq 0 ]; then exit 1; else exit 0; fi"
interval 2
fall 2
rise 1
}
track_script {
nginx_check
}
- 通过脚本监测
vrrp_script nginx_check {
script "/etc/keepalived/nginx_check.sh"
interval 2
fall 2
rise 1
}
track_script {
nginx_check
}
问题
在介绍完了 keepalived
的监测功能之后,我们来看下这个问题
我根据他的描述复现了这个场景:keepalived
通过监测上游网络来判断该节点是否正常运行,如果到上游的网络不通,则认为该节点发生了故障
检测脚本如下:
[root@localhost ~]# cat /etc/keepalived/check.sh
#!/bin/bash
# 检查上行链路
check_route="192.168.149.135"
ping -c 3 $check_route >/dev/null 2>&1
result=$?
echo "${date}----checking..... result:${result}" >> /tools/log.log
if [ $? -eq 0 ]; then
exit 0 # 正常
else
exit 1 # 链路异常
fi
一切准备就绪之后启动 keepalived
服务发现报 Keepalived_vrrp[2653]: /etc/keepalived/check.sh exited with status 1
[root@localhost ~]# systemctl status keepalived.service
● keepalived.service - LVS and VRRP High Availability Monitor
Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
Active: active (running) since 三 2023-08-14 23:53:49 CST; 4min 56s ago
...
8月 14 23:53:49 localhost.localdomain Keepalived_vrrp[2653]: /etc/keepalived/check.sh exited with status 1
...
说明脚本没有执行成功,返回状态码 1 了,我尝试着手动执行,发现脚本没有任何问题
[root@localhost ~]# sh /etc/keepalived/check.sh
[root@localhost ~]# echo $?
0
排查
首先看一下 /var/log/messages
(如果 keepalived
没有专门指定日志文件路径,这个便是默认的日志文件路径)
...
Aug 14 23:53:49 localhost Keepalived_vrrp[17889]: SECURITY VIOLATION - scripts are being executed but script_security not enabled
...
Aug 14 23:53:49 localhost Keepalived_vrrp[17889]: /etc/keepalived/check.sh exited with status 1
...
SECURITY VIOLATION - scripts are being executed but script_security not enabled
这条信息引起了我的注意
”安全违规-脚本正在执行,但 script_security 未启用“,看输出应该是 keepalived
进程想要执行该脚本,但是受到了安全限制
既然是跟系统安全相关的,我们就先来看看这个脚本的权限吧
# 查看脚本权限
[root@localhost ~]# ll /etc/keepalived/check.sh
-rwxr-xr-x. 1 root root 281 8月 9 15:52 /etc/keepalived/check.sh
# 查看是 keepalived 进程的属主
[root@localhost ~]# ps -ef | grep keep
root 19163 1 0 01:00 ? 00:00:00 /usr/sbin/keepalived -D
...
由上面的输出我们可以得知 keepalived
进程的属主是 root
,而 root
用户是可以去执行这个脚本的(有 x
权限)
权限没问题,我们再来查看下 /var/log/audit/audit.log
/var/log/audit/audit.log
是一个存储系统审计日志的文件这个文件记录了系统中发生的各种安全事件、用户操作和系统行为,以及与安全相关的