Ansible操作SunOS主机raw模块报错、shell模块执行脚本不生效求助
Ansible管控SunOS操作系统服务启动异常解决方案
问题根因
- 所谓
Shared connection to myhost1 closed不是执行错误:该内容是SSH开启debug日志后会话正常关闭的提示输出,从返回码rc=0可确认命令已执行完成,无需针对该提示做额外处理。 - 进程启动后消失的核心原因:Ansible执行任务时会为每个任务创建独立的非交互式SSH会话,会话结束时会向会话内启动的所有子进程发送
SIGHUP信号,未脱离会话的进程会被该信号强制终止。手动执行命令属于交互式登录会话,退出逻辑和信号处理逻辑与Ansible非交互式会话不同,所以手动执行可以成功。 - 此前disown配置无效:非交互式shell默认关闭作业控制功能,不存在作业号的概念,
disown %%无法匹配到后台进程,无法完成进程脱离操作。 - 潜在命令兼容性问题:SunOS默认的
/bin/sh不支持source内置命令,source是bash专属语法,在/bin/sh下需要用.代替source加载环境变量配置。
可行解决方案
使用修正后的raw模块任务配置即可解决问题:
- name: "START ADP SERVICES" raw: ". ~/.profile; nohup sh /web/external_products/springboot/{{ vars[ environ + '_folder'] }}/veladpservice/bin/start.sh veladpservice.jar {{ vars[ environ + '_folder'] }} {{ allpass }} > /var/tmp/veladpservice_start.log 2>&1 &"
配置修改说明
- 将
source ~/.profile替换为. ~/.profile,兼容SunOS默认/bin/sh的语法,确保环境变量正常加载 - 新增
nohup前缀,让进程忽略SIGHUP信号,避免SSH会话关闭时被强制终止 - 新增输出重定向
> /var/tmp/veladpservice_start.log 2>&1,将启动日志写入指定文件,也可改为> /dev/null 2>&1丢弃输出,避免nohup默认输出阻塞命令执行 - 末尾新增
&让进程后台运行
可选:添加服务启动校验任务
可在启动任务后添加校验任务,确认服务正常运行:
- name: "Verify ADP service is running" raw: "ps -ef | grep veladpservice.jar | grep -v grep" register: service_status retries: 3 delay: 2 until: service_status.rc == 0
注意事项
- 若
start.sh脚本内部已实现后台运行逻辑,可删除配置末尾的&,保留nohup即可 - 若目标主机已安装bash,也可指定raw模块使用bash执行,此时可保留
source语法:- name: "START ADP SERVICES" raw: "source ~/.profile; nohup sh /web/external_products/springboot/{{ vars[ environ + '_folder'] }}/veladpservice/bin/start.sh veladpservice.jar {{ vars[ environ + '_folder'] }} {{ allpass }} > /var/tmp/veladpservice_start.log 2>&1 &" args: executable: /bin/bash
内容的提问来源于stack exchange,提问作者Ashar
相关产品推荐
相关产品推荐

