Systemd Environment e EnvironmentFile não funciona

5

Eu criei um aplicativo e uma unidade systemd para ele. A unidade systemd funciona bem, mas como os ambientes dev e prod divergiram, comecei a mover a configuração para variáveis de ambiente e não consigo fazer com que funcionem no systemd.

Eu tentei variáveis de ambiente em todo o sistema, e elas estão visíveis para o sistema operacional, mas não para o programa, então comecei a procurar construí-las em unidades de sistema.

Primeiro, tentei usar o EnvironmentFile

Eu criei um arquivo de ambiente que simplesmente tinha

LCSQLH=localhost
LCSQLU=application

como /etc/lc.sh e

[Unit]
Description=Service for this app

[Service]
EnvironmentFile=/etc/lc.sh
ExecStart=/usr/bin/env python /opt/app/__init__.py

fez um systemctl --system daemon-reload , mas não, meu aplicativo cometeu um erro:

Jan 27 14:24:59 machine.host env[630]: KeyError: 'LCSQLU'

Eu vi alguns:

EnvironmentFile=-/etc/lc.sh

Eu tentei isso ... não ...

Então eu tentei colocá-los individualmente

[Service]
Environment="LCSQLH=localhost"
Environment="LCSQLU=application"
ExecStart=/usr/bin/env python /opt/app/__init__.py

Mais uma vez, não ...

Então eu ouvi sobre a idéia de /etc/systemd/service_name.service.d , então coloquei um service.conf lá com os ambientes (mesmo formato acima) mas não ...

Meu aplicativo não tem acesso a essas variáveis de ambiente.

Se eu exportá-los (manualmente no meu shell ou usando /etc/profile.d/) e executar meu aplicativo diretamente, isso funciona, portanto, eles não estão sendo definidos em vez de um problema de aplicativo.

Este é o Centos 7.3 e eu escolhi as variáveis de ambiente ao invés de uma configuração embutida no código porque ele pode rodar tanto no Linux quanto no Windows, então não quero enterrar um arquivo de configuração em / etc /

    
por Keef Baker 27.01.2017 / 15:41

2 respostas

2

Eu encontrei o mesmo problema no RHEL 7.3 e encontrei este :

You may then refer to variables set in the /etc/sysconfig/httpd file with ${FOOBAR} and $FOOBAR, in the ExecStart lines (and related lines).

Isso me faz pensar que o propósito de Environment e EnvironmentFile não é nada do que você e eu esperávamos (definindo variáveis de ambiente para o processo iniciado pela unidade systemd), mas se aplica apenas à expansão imediata do ExecStart line.

Talvez eu esteja completamente fora da base e isso é um bug no systemd (espero que sim). Mas parei de percorrer o caminho que você está tentando e fiz de outra forma: no meu caso, eu precisava definir LD_LIBRARY_PATH , então fiz isso criando /etc/ld.so.conf.d/new_file.conf e executando ldconfig . Eu também tentei usar variáveis de todo o sistema em /etc/profile.d/new_file.sh , mas aparentemente definir apenas LD_LIBRARY_PATH foi suficiente para este serviço (mariadb) e, portanto, não sei se as variáveis que eu estava configurando em /etc/profile.d/new_file.sh estavam funcionando.

    
por 10.05.2017 / 22:14
18

Environment e EnvironmentFile definem as variáveis, utilizáveis pela unidade, mas como o comando sh , não o exportam para processos filho. Para isso, você também precisa listá-lo em PassEnvironment , assim como faria com o comando export shell. Consulte a documentação do systemd em EnvironmentFile e PassEnvironment

Além disso, observe que o conteúdo de um EnvironmentFile não é um shell script, mas pares de valores-chave que parecem muito com sh, então nomear com uma extensão .sh é enganoso.

    
por 06.06.2017 / 12:18