web-dev-qa-db-ja.com

現在のシェルからsystemdユニットに環境変数を渡す

現在のシェルで定義されている環境変数を、作成しているsystemdユニットの1つに渡そうとしています。

_DB_URL=databus.dev.mysite.io:8080
_

私はこれをサービスとして実行しているpythonスクリプトで使用しています。私のsystemdユニットは、このスクリプトを、変数を使用して機能するユニットとして実行します。

_[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
_

Pythonスクリプトで変数を使用する方法は

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

問題は、systemdでスクリプトを実行するときに変数を使用できないことです。私はいくつかのリソースを調べました systemdユニットで環境変数を使用 、それは_[Service]_での割り当てを直接

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

ご覧のとおり、私の_DB_URL_は、マシンを展開している環境に応じて変化する可能性があります。それは、URLが変化する開発者または本番環境のセットアップである可能性があります。

これを動的に行うにはどうすればよいですか?つまり、_DB_URL_で利用可能な値をsystemd環境に渡しますか?

_EnvironmentFile=_ オプションを使用してファイルを定義し、サービスに渡しました。しかし、同じ問題が繰り返されますが、私の変数は動的であり、できませんハードコードできません。

更新

オプション使用後

_systemctl import-environment DB_URL
_

私が確認したsystemdの環境で利用可能な変数を見ることができます

_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
_

しかし、それでも値は私が実行するpythonアプリケーションに反映されません。 os.environ('DB_URL')は変数にアクセスする間違った方法ですか?

5
Inian

次のコマンドを使用して、将来のすべてのコマンド(再起動まで)のグローバルsystemd環境に影響を与えることができます

 Sudo systemctl set-environment var=value

または、環境にすでにvarがエクスポートされている場合は、

 Sudo systemctl import-environment var

ユニットを起動した後、unset-environmentを使用して変数を同様に削除できます。

これは実際にはグローバルなので、DB_URL=databus.dev.mysite.io:8080という行をファイル/some/fileに書き込み、ユニットでEnvironmentFile=/some/fileを設定するだけの方がよいでしょう。

別の方法は、[email protected]で始まるテンプレートユニットsystemctl start myunit@'databus.dev.mysite.io:8080'を使用することです。次に、このパラメーターをユニット内で%iとして復元できます。たとえば、次のような行を使用して[Service]セクションで行います。

Environment=DB_URL=%i
15
meuh

その価値については、systemd自体の50-systemd-user.shが、参照可能な環境変数DISPLAYおよびXAUTHORITYをインポートする方法を提供します。

#!/bin/sh                                                                                                                                                                                                    

systemctl --user import-environment DISPLAY XAUTHORITY

if command -v dbus-update-activation-environment >/dev/null 2>&1; then 
    dbus-update-activation-environment DISPLAY XAUTHORITY
fi

https://github.com/systemd/systemd/blob/master/xorg/50-systemd-user.sh

1
Kai

現在のターミナルで環境変数を設定していて、systemctlSudoでエクスポートした場合、次のように使用できます。

Sudo -E  systemctl import-environment <LIST OF ENVIRONMENTS TO BE AVAILABLE FOR SERVICE>
0