start-stop-daemon, serviços, variáveis de ambiente e ansible

3

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.

    
por FrustratedWithFormsDesigner 07.08.2015 / 19:48

0 respostas