启动-停止-守护进程、服务、环境变量和 ansible

启动-停止-守护进程、服务、环境变量和 ansible

所以,我有一个运行 Ansible 的 Java 程序。我想将此程序作为服务运行。我在 /etc/init.d 中编写了一个服务脚本,它使用 start-stop-daemon 来运行/停止 Java 程序。我遇到了 Ansible 失败并出现以下错误的问题:

收集事实**************************************************** **************
致命:[i-0f55b6a4] => 无法创建目录 /$HOME/.ansible/cp:[Errno 13] 权限被拒绝:'/$HOME'

Ansible 正在尝试在下面创建一个临时工作目录,/$HOME但由于某种原因,$HOME它的值不为/home/ubuntu(即使我--user ubuntu --chuid ubuntu在启动服务时使用),所以看起来 Ansible 尝试创建一个具有文字名称的目录/$HOME。然后它失败了,因为它缺乏执行此操作的权限。

这不是一个可配置的选项,所以我做了一些挖掘,然后我思考我准确地找到了 Ansible 试图做到这一点的地方:https://github.com/ansible/ansible/blob/5ce3988d8693357f671f3fbec43b2d3b862db5f6/v1/ansible/runner/connection_plugins/ssh.py#L56

如果链接出现问题,Python 代码片段是:

def __init__(self, runner, host, port, user, password, private_key_file, *args, **kwargs):
  ...
  fcntl.lockf(self.runner.process_lockfile, fcntl.LOCK_EX)
  self.cp_dir = utils.prepare_writeable_dir('$HOME/.ansible/cp',mode=0700)
  fcntl.lockf(self.runner.process_lockfile, fcntl.LOCK_UN)

我已经尝试了一些方法来解决这个问题,但到目前为止没有任何效果。

我尝试过的一些事情包括:

使用/usr/bin/env来设置HOME(因为我的 start-stop-daemon 版本似乎不支持--env):

CMD="/usr/bin/java"
CMD_ARGS=#...not really relevant here
case "$1" in
  start)
    start-stop-daemon --start -b -m --no-close --pidfile $PID_FILE --user ubuntu --chuid ubuntu --exec /usr/bin/env HOME=/home/ubuntu -- $CMD $CMD_ARGS >> $LOG_FILE 2>&1

唉,这没有用。

我尝试生成一个包装脚本来设置变量,然后执行主程序:

case "$1" in
  start)
     sudo cat << PROCESS_RUNNER > /tmp/runMyProcess.sh
#! /bin/bash
HOME=/home/ubuntu
env
$CMD $CMD_ARGS >> $LOG_FILE 2>&1
PROCESS_RUNNER
     sudo chmod a+x /tmp/runMyProcess.sh
     start-stop-daemon --start -b -m --no-close --pidfile $PID_FILE --user ubuntu --chuid ubuntu --exec /tmp/runMyProcess.sh

包装脚本如下所示:

#! /bin/bash
HOME=/home/ubuntu
env
/usr/bin/java -cp /home/ubuntu/arch3/pancancer.jar com.mypackage.MyClass --some --arguments  >> /var/log/myApplication/MyClass.log 2>&1

这也行不通。

当直接从命令行调用Java程序时,一切正常。

Ansible 是从一个 Java 程序调用的,该程序是从服务调用的 start-stop-daemon 调用的。我不知道如何传播一个名为$HOMEansible 的环境变量,我现在有点困惑。

相关内容