그래서 저는 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
지금은 약간 혼란스럽습니다.