だから私は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
今は少し混乱しています。