Então, eu tenho um programa em Java que executa o Ansible. Eu gostaria de executar este programa como um serviço. Eu escrevi um script de serviço em /etc/init.d que usa o daemon start-stop para executar / parar o programa Java. Eu me deparei com um problema onde Ansible falha com este erro:
GATHERING FACTS *************************************************************** fatal: [i-0f55b6a4] => Could not make dir /$HOME/.ansible/cp: [Errno 13] Permission denied: '/$HOME'
O Ansible está tentando criar um diretório de trabalho temporário em /$HOME
, mas por algum motivo, $HOME
não avalia para /home/ubuntu
(mesmo que eu usei --user ubuntu --chuid ubuntu
ao iniciar o serviço), então parece Ansible tenta criar um diretório com o nome literal /$HOME
. E então ele falha, porque não tem permissão para fazer isso.
Esta não é uma opção configurável, então fiz algumas pesquisas e acho que encontrei exatamente onde o Ansible está tentando fazer isso: link
O snippet python, no caso de o link ficar ruim, é:
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)
Eu tentei algumas coisas para resolver isso, mas até agora nada funcionou.
Algumas das coisas que eu tentei incluem:
Usando /usr/bin/env
para definir HOME
(já que a minha versão do daemon start-stop não parece suportar --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
Infelizmente, isso não funcionou.
Eu tentei gerar um script de wrapper que definirá a variável e, em seguida, executará o programa principal:
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
O script do wrapper é assim:
#! /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
Isso também não funcionou.
Quando o programa Java é chamado diretamente da linha de comando, tudo funciona bem.
O Ansible está sendo chamado de um programa Java que está sendo chamado a partir do daemon start-stop que está sendo chamado de serviço. Não tenho certeza de como posso propagar uma variável de ambiente chamada $HOME
para ansible, e estou meio que perplexo agora.