現在のシェルで定義されている環境変数を、作成している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')
は変数にアクセスする間違った方法ですか?
次のコマンドを使用して、将来のすべてのコマンド(再起動まで)のグローバル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
その価値については、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
現在のターミナルで環境変数を設定していて、systemctl
にSudo
でエクスポートした場合、次のように使用できます。
Sudo -E systemctl import-environment <LIST OF ENVIRONMENTS TO BE AVAILABLE FOR SERVICE>