Bug Report: redis-sentinel-ha.sh 脚本命令被拼接成一行导致认证失败
环境信息
- 项目: pigsty
- 文件:
redis.yml
- 任务:
redis-ha tag
- 组件: Redis Sentinel
问题描述
Pigsty 通过 redis.yml 的 redis-ha task 生成 /tmp/redis-sentinel-ha.sh,
但生成的脚本中三条 redis-cli 命令被拼接成了一行,导致密码参数被截断拼入下一条命令,
最终 Sentinel 认证失败,无法完成 master 注册。
复现步骤
-
配置 Redis Sentinel 集群,运行:
./redis.yml -i pigsty.yml -l redis-sentinel -t redis-ha
-
查看生成的脚本:
cat /tmp/redis-sentinel-ha.sh
-
实际生成内容(错误):
#!/bin/bash
cat /tmp/redis-sentinel.monitor | redis-cli -h sentinel-1 -p 26379 -a PASSWORDcat /tmp/redis-sentinel.monitor | redis-cli -h sentinel-2 -p 26379 -a PASSWORDcat /tmp/redis-sentinel.monitor | redis-cli -h sentinel-3 -p 26379 -a PASSWORD
-
密码被拼接成 PASSWORDcat,导致所有 Sentinel 节点认证失败,master 注册不成功。
期望生成内容
#!/bin/bash
cat /tmp/redis-sentinel.monitor | redis-cli -h sentinel-1 -p 26379 -a 'PASSWORD'
cat /tmp/redis-sentinel.monitor | redis-cli -h sentinel-2 -p 26379 -a 'PASSWORD'
cat /tmp/redis-sentinel.monitor | redis-cli -h sentinel-3 -p 26379 -a 'PASSWORD'
根因分析
redis.yml 模板中生成脚本内容时,换行控制符缺失,导致多条命令被 Jinja2 渲染为一行。
同时 -a 参数的密码未加引号,当密码包含特殊字符时也会引发解析问题。
建议修复
在 redis.yml 模板的脚本生成逻辑中:
- 每条
redis-cli 命令后确保有换行(\n 或空行)
-a 密码参数加单引号,避免特殊字符被 shell 解析
影响范围
所有使用 redis-ha task 配置 Redis Sentinel 且密码非空的用户,
Sentinel 均无法正常注册 master,导致高可用失效。
Bug Report: redis-sentinel-ha.sh 脚本命令被拼接成一行导致认证失败
环境信息
redis.ymlredis-hatag问题描述
Pigsty 通过
redis.yml的redis-hatask 生成/tmp/redis-sentinel-ha.sh,但生成的脚本中三条
redis-cli命令被拼接成了一行,导致密码参数被截断拼入下一条命令,最终 Sentinel 认证失败,无法完成 master 注册。
复现步骤
配置 Redis Sentinel 集群,运行:
查看生成的脚本:
实际生成内容(错误):
密码被拼接成
PASSWORDcat,导致所有 Sentinel 节点认证失败,master 注册不成功。期望生成内容
根因分析
redis.yml模板中生成脚本内容时,换行控制符缺失,导致多条命令被 Jinja2 渲染为一行。同时
-a参数的密码未加引号,当密码包含特殊字符时也会引发解析问题。建议修复
在
redis.yml模板的脚本生成逻辑中:redis-cli命令后确保有换行(\n或空行)-a密码参数加单引号,避免特殊字符被 shell 解析影响范围
所有使用
redis-hatask 配置 Redis Sentinel 且密码非空的用户,Sentinel 均无法正常注册 master,导致高可用失效。