keepalived 踩坑记录

坑之一

在执行脚本的时候返回:-bash: ./nginx_check.sh: /bin/bash^M: 坏 的 解 释 器 : 没 有 那 个 文 件 或 目 录

这个问题是我们在 windows 上编写的 shell 脚本在传输到 linux 上,由于二者空格的编码格式不一致,导致 linux 在执行 shell 脚本的时候就会抛出上去上述错误;

解决方法的话就是通过正则表达式替换对应的空格与回车:

sed -i 's/\r$//' shellNmae

坑之二

在编写 keepalived 的 shell 检测脚本的时候遇到了一个坑,就是明明在外面 ps 执行返回的是 0,但是在 sehll 脚本中返回的却是 2。

场景重现

nginx 停掉后通过 ps 查询对应的进程,在外面执行结果如下:

[root@localhost sbin]# ps -ef | grep -w nginx | grep -v grep | wc -l
0

但是通过 shell 脚本执行的效果如下

#!/bin/bash

A=`ps -ef | grep nginx | grep -v grep | wc -l`
echo a = $A
echo `ps -ef | grep nginx | grep -v grep`
if [ $A -eq 0 ];then
        echo ------------------- enter ---------
        /usr/local/nginx/sbin/nginx
        sleep 2
        if [ `ps -C nginx -no-header |wc -l` -eq 0 ];then
                echo -------------- enter ---------------
                killall keepalived
        fi
fi

输出结果:

[root@localhost src]# ./nginx_check.sh 
a = 2
root 19403 9877 0 03:59 pts/1 00:00:00 /bin/bash ./nginx_check.sh root 19409 19403 0 03:59 pts/1 00:00:00 /bin/bash ./nginx_check.sh

原因的话就是 ps 通过模糊匹配把 nginx_check.sh 这个 shell 的进程也给查询出来了,解决方案的话:

  1. 就是更改 shell 的名称。
  2. 通过在 grep 后面加上 -w 进行精准查找。

我这边选择的是后者,修改如下:

#!/bin/bash

A=`ps -ef | grep -w nginx | grep -v grep | wc -l`
echo a = $A
echo `ps -ef | grep -w nginx | grep -v grep`
if [ $A -eq 0 ];then
        echo ------------------- enter ---------
        /usr/local/nginx/sbin/nginx
        sleep 2
        if [ `ps -C nginx -no-header |wc -l` -eq 0 ];then
                echo -------------- enter ---------------
                killall keepalived
        fi
fi

输出结果:

[root@localhost src]# ./nginx_check.sh 
a = 0

至此,这个 shell 脚本就可以愉快的运行了。

坑之三

keepalived 不能成功执行对应的脚本文件。

keepalived 在启动的时候是正常的,没有报错。但是我把 nginx 关掉后 keepalived 并没有通过脚本去重新启动 nginx,或者是把自己给 kill 掉。

keepalived 启动:

[root@localhost keepalived]# service keepalived start
Starting keepalived (via systemctl):                       [  确定  ]

对应的配置文件

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.3.43
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

# keepalived 的检测脚本
vrrp_script chk_nginx
{
        script "/usr/local/src/nginx_check.sh"
        interval 2
        weight -20
}

vrrp_instance VI_1 {
    state BACKUP        # 备份服务器上将 MASTER 改为 BACKUP
    interface ens33     # 网卡
    virtual_router_id 51        # 主、备机的 virtual_router_id 必须相同
    priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
                # VRRP_H 虚拟地址
        192.168.3.50
    }
}

对应的执行日志

通过 Nginx 的学习篇,可以得知 keepalived 的日志信息是:/var/log/message,然后通过 cat 查看对应的日志信息:

Mar 29 21:41:33 localhost Keepalived_vrrp[9108]: WARNING - script '/usr/local/src/nginx_check.sh' is not executable for uid:gid 0:0 - disabling.

大致的意思就是 nginx_check.sh 这个脚本不能执行。然后我一看脚本的对应执行权限,原来是还没有设置,于是就通过 chmod 进行设置:

-rw-r--r--. 1 root root     191 3月  30 02:48 nginx_check.sh
[root@localhost log]# chmod 777 /usr/local/src/nginx_check.sh
[root@localhost log]# ll /usr/local/src/
-rwxrwxrwx. 1 root root     191 3月  30 02:48 nginx_check.sh

再重新启动 keepalived 查看:

Mar 30 14:57:03 localhost Keepalived_vrrp[28976]: WARNING - default user 'keepalived_script' for script execution does not exist - please create.
Mar 30 14:57:03 localhost Keepalived_vrrp[28976]: Unsafe permissions found for script '/usr/local/src/nginx_check.sh'.

现在的日志信息大致是不能执行对应的安全脚本,后面经查阅资料原来是要对应的检测脚本与 vrrp_instance 进行绑定,也就是要在 vrrp_instance 中添加对应的脚本;

调整后的脚本

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.3.43
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script chk_nginx
{
        script "/usr/local/src/nginx_check.sh"
        interval 2
        weight -20
}

vrrp_instance VI_1 {
    state BACKUP        # 备份服务器上将 MASTER 改为 BACKUP
    interface ens33     # 网卡
    virtual_router_id 51        # 主、备机的 virtual_router_id 必须相同
    priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
                # VRRP_H 虚拟地址
        192.168.3.50
    }
    track_script{
        chk_nginx
    }
}

改动后的脚本就是添加了,下面这个配置信息,将其进行绑定。后面就可以正常的执行对应的脚本了。

track_script{
	chk_nginx
}

总结

踩过的坑需要总结,这样的话下次就有印象了,也能通过总结去复盘去了解一些新的东西。

posted @ 2022-03-30 22:44  李小龙他哥  阅读(540)  评论(0)    收藏  举报