如何解决Chef关机Recipe在Rundeck中因非零退出码判定失败的问题?
解决方案建议
核心问题原因
你设置的returns参数只作用于Chef的execute资源本身,但shutdown -h now执行后系统会立即启动关机流程,Chef客户端进程可能还没完成资源状态判断就被系统终止,导致整个Chef run的退出码还是非零——这才是Rundeck判定失败的根本原因。
具体解决方法
方法1:让Chef先正常退出,关机命令后台执行
修改Chef Recipe里的命令,用nohup把shutdown放到后台执行,这样Chef能正常完成执行流程并返回0退出码:
execute 'shutdown_server' do command 'nohup shutdown -h now > /dev/null 2>&1 &' action :run end
这里> /dev/null 2>&1是用来屏蔽nohup的输出,避免产生多余日志。
方法2:直接在Rundeck里调整预期退出码
在Rundeck的作业步骤配置中,找到“预期退出码”(Exit Code Handling)的设置,把0、1、-1都添加进去。这样不管Chef返回这三个码中的哪一个,Rundeck都会判定该步骤执行成功。
方法3:用自定义脚本强制返回0
写一个简单的shell脚本,执行关机命令后立刻主动退出0,让Chef执行这个脚本时能拿到正常的退出码:
- 创建脚本
/opt/shutdown_script.sh,内容如下:
#!/bin/bash # 后台执行关机命令 shutdown -h now & # 强制返回0退出码 exit 0
- 给脚本添加执行权限:
chmod +x /opt/shutdown_script.sh - 修改Chef Recipe调用这个脚本:
execute 'shutdown_server' do command '/opt/shutdown_script.sh' action :run end
内容的提问来源于stack exchange,提问作者Emma
相关产品推荐
相关产品推荐

