Passa uma variável de ambiente do shell atual para uma unidade systemd

4

Estou tentando passar uma variável de ambiente definida no shell atual para uma das systemd unidade que estou escrevendo.

DB_URL=databus.dev.mysite.io:8080

Estou usando isso em um script python que está sendo executado como um serviço. Minha unidade systemd executará este script como uma unidade que faz uso da variável para seu funcionamento.

[Unit]
Description=device-CompStatus: Computes device availability status

[Service]
Type=simple    
ExecStart=/usr/bin/bash -c "/usr/bin/python /opt/deviceCompStatus/deviceCompStatusHandler.py"
Restart=always

[Install]
WantedBy=default.target

A maneira como estou usando a variável no script Python seria

if os.environ.get('DB_URL') is not None:
    dbEndPoint = "http://" + os.environ['DB_URL']

O problema é que não consigo usar a variável ao executar o script em systemd . Eu pesquisei alguns recursos Usando variáveis de ambiente em unidades systemd , diz para usar a atribuição sob [Service] diretamente como

[Service]
Environment=DB_URL=databus.dev.mysite.io:8080

Como você pode ver, meu DB_URL pode mudar dependendo do ambiente em que estou implantando minha máquina, pode ser um desenvolvedor ou uma configuração de produção, em que os URLs podem variar.

Como faço isso dinamicamente? ou seja, passar o valor disponível para DB_URL to systemd environment?

Eu também tentei usar a opção EnvironmentFile= para definir um arquivo e passá-lo para o serviço. Mas o mesmo problema novamente, minha variável poderia ser dinâmica e não pode ser codificada.

Atualizar

Depois de usar a opção

systemctl import-environment DB_URL

Eu posso ver a variável disponível no ambiente de systemd que confirmei por

systemctl show-environment
DB_URL=databus.dev.mysite.io:8080
LANG=en_US.UTF-8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin

mas ainda assim o valor não é refletido no aplicativo python que eu executo. O os.environ('DB_URL') é um caminho errado para acessar a variável?

    
por Inian 02.08.2017 / 14:24

1 resposta

8

Você pode afetar o ambiente systemd global para todos os comandos futuros usando

 sudo systemctl set-environment var=value

ou se você já tiver var exportado em seu ambiente, poderá usar

 sudo systemctl import-environment var

Depois de iniciar sua unidade, você pode remover a variável com unset-environment da mesma forma.

Como isso é global, na verdade, seria melhor escrever a linha DB_URL=databus.dev.mysite.io:8080 em algum arquivo /some/file e definir EnvironmentFile=/some/file em sua unidade.

Um método alternativo é usar uma unidade de modelo [email protected] , que é iniciada com systemctl start myunit@'databus.dev.mysite.io:8080' . Você pode recuperar esse parâmetro como %i dentro da unidade, por exemplo, na seção [Service] com uma linha como:

Environment=DB_URL=%i
    
por 02.08.2017 / 14:46