我有一个Ansible剧本,其任务如下:
- name: start the apache server
command: ./server.sh start chdir="/myapp"
和server.sh
:
#!/bin/bash
server_wrapper.py start
server_wrapper.py
中的:
#!/usr/bin/python
import threading
import subprocess
cmd = "$APATCH_HOME/scripts/service.sh restart"
print cmd
ret = subprocess.call(cmd, shell=True)
if ret !=0
logging.critical("error happend, %d" % ret)
随机失败。当我手动ssh到Ansible playbook所针对的远程服务器时,我可以通过运行$APACHE_HOME/scripts/service.sh restart
看到,apache可以成功运行,它会输出一些日志记录到控制台,如Apache started successfully
,看起来像标准输出。
但是当从Ansible playbook运行时,它随机失败,我必须以下列方式更改server.sh
:
#!/bin/bash
nohup server_wrapper.py start &
似乎nohup和&运营商已经解决了这个问题。
所以我想了解为什么&操作员修复我的问题,我理解&将启动一个子shell并在后台运行,它是否与标准i / o相关,这导致了问题?
答案 0 :(得分:0)
只是预感,但我看到
cmd = "$APATCH_HOME/scripts/service.sh restart"
不应该是$APACHE_HOME
。 (嗯可能不是因为它在本地启动时有效。)
但是我的经验告诉我,本地和远程执行之间的差异主要是由于环境的差异造成的。
尝试在set > /tmp/env_$$.out
中添加server.sh
并在本地和Ansible中运行,然后检查2个输出文件中的(相关)差异。