Ansible调用Python脚本执行runuser在SLES15.4中挂起问题排查
可能的原因及排查方案
runuser的stdin/stdout重定向问题
SUSE 15.x对runuser的默认行为做了调整,在非交互式环境(比如Ansible远程执行)中,若未明确重定向标准输入/输出/错误流,进程会因等待stdin输入而挂起——直接在OS执行时是交互式环境,stdin关联终端,因此无此问题。
检查脚本中runuser的调用方式,例如将原命令runuser -u sidadm /path/to/hana_check.sh改为:runuser -u sidadm -- /path/to/hana_check.sh < /dev/null > /tmp/hana_check.log 2>&1强制断开stdin并重定向日志输出。
SUSE 15.x的PAM配置差异
SUSE 12到15升级后,PAM(可插拔认证模块)的默认配置有所变化,尤其是runuser的session模块规则。查看/etc/pam.d/runuser文件:- SUSE 12中可能允许无终端的session,而SUSE 15默认要求关联终端(比如包含
session required pam_loginuid.so或session required pam_console.so规则)。
可临时注释相关PAM规则测试,若恢复正常,可修改PAM配置,添加针对sidadm用户的例外,或调整runuser调用时的PAM环境变量。
- SUSE 12中可能允许无终端的session,而SUSE 15默认要求关联终端(比如包含
Ansible执行环境变量差异
Ansible远程执行的环境变量与直接登录OS的环境变量不同,SUSE 15.x对环境变量的依赖更严格。比如sidadm用户的.profile或.bashrc中若存在需要终端交互的命令(如read、tput),在非交互式环境下会卡住。
可在runuser调用时指定非交互式shell模式:runuser -u sidadm -s /bin/bash -c "set +o interactive; /path/to/hana_check.sh"或修改sidadm的shell配置文件,跳过仅在交互式环境下执行的命令。
AppArmor权限限制
SUSE 15.x默认启用AppArmor,可能限制了runuser在Ansible执行环境中的操作权限。检查AppArmor日志(/var/log/audit/audit.log或/var/log/messages),查看是否有针对runuser或sidadm的权限拒绝记录。若存在,调整AppArmor规则,允许相关进程的操作。runuser命令参数解析变化
SUSE 15使用的util-linux版本更高,runuser的参数解析逻辑有调整。若原命令未用--分隔符,可能导致后续参数被错误解析。确保runuser调用格式正确:runuser -u <user> -- <command> <args>避免参数混淆引发的异常。
内容的提问来源于stack exchange,提问作者etorrab

