開始 - 停止デーモン、サービス、環境変数、およびansible

開始 - 停止デーモン、サービス、環境変数、およびansible

だから私はAnsibleを実行するJavaプログラムを持っています。このプログラムをサービスとして実行したいと思います。 Javaプログラムを実行/停止するためにstart-stop-daemonを使用するサービススクリプトを/etc/init.dに作成しました。次のエラーによってAnsibleが失敗する問題があります。

事実を集める*************************************************** ** ******* **** ******************
致命的: [i-0f55b6a4] => /$HOME/.ansible/cp ディレクトリを作成できません: [Errno 13] 権限が拒否されました: '/$HOME'

Ansibleは下に一時作業ディレクトリを作成しようとしていますが、何らかの/$HOME理由でその値が(サービスの起動時に使用されていても)$HOMEないため、Ansibleがリテラル名を使用してディレクトリを作成したいようです。その後、この操作を実行する権限がないため失敗します。/home/ubuntu--user ubuntu --chuid ubuntu/$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 プログラムで呼び出されます。 ansibleという環境変数を伝播する方法がわからず、$HOME今は少し混乱しています。

関連情報