所以,我有一个运行 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 调用的。我不知道如何传播一个名为$HOME
ansible 的环境变量,我现在有点困惑。