Los*_*und 4 variables configuration systemd
I have unit files for bunch of services. In ExecStart I want to refer to directory part of a path name using a variable so that I can easily update many unit files in case a location of executables changes.
我正在使用 EnvironmentFile 来定义变量并在单元文件中获取文件。然而,变量似乎在单元文件本身内不可见,而只能在环境中(我没有测试过它们是否确实在环境中可见)。有没有其他惯用的方式来使用变量进行动态配置?
[Service]
Environment=MYS_PATH=/opt/myservice
Environment=MYS_USER=user
Run Code Online (Sandbox Code Playgroud)
[Unit]
Description=My service
After=network.target
[Service]
EnvironmentFile=/etc/systemd/system/myservice.service.d/myservice_defs.conf
Type=simple
User=${MYS_USER}
WorkingDirectory=${MYS_PATH}
ExecStart=${MYS_PATH}/usr/bin/myservice -C ${MYS_PATH}/etc/myservice.conf
Run Code Online (Sandbox Code Playgroud)
简短的回答是“这不是你使用 EnvironmentFile 的方式”,aEnvironmentFile应该只是键值(没有环境)前缀的形式。
MYS_PATH=/opt/myservice
MYS_USER=user
Run Code Online (Sandbox Code Playgroud)
您所描述的是服务覆盖,这是另一回事,遗憾的是您的环境变量仅适用于您正在启动的服务的上下文,而不适用于 systemd 单元本身。除了定义二进制文件的路径外,您仍然可以将它们用于 Excec 启动)。
但是有一些方法可以实现你想要的。
您可以创建瞬态单元,它们不会在您的系统上重新启动,但可以以编程方式定义或动态定义,我最喜欢的(出于显而易见的原因)是 pystemd.run 但您也可以使用 systemd-run,第一个是python 库,第二个是 cli 工具
pystemd.run
# install pystemd
[root@~] pip install pystemd
[root@~] python
>>> import pystemd.run
>>> MYS_PATH='/opt/myservice'
>>> MYS_USER='user'
>>> pystemd.run([f'{MYS_PATH}/usr/bin/myservice', '-C' f'{MYS_PATH}/etc/myservice.conf'], cwd=MYS_PATH, user=MYS_USER)
Run Code Online (Sandbox Code Playgroud)
你可以做各种各样的事情,因为你在 Python 的世界里。
系统运行
[root@~] MYS_PATH='/opt/myservice'
[root@~] MYS_USER='user'
[root@~] systemd-run --uid ${MYS_USER} -p WorkingDirectory=${MYS_PATH} ${MYS_PATH}/usr/bin/myservice -C ${MYS_PATH}/etc/myservice.conf
Run Code Online (Sandbox Code Playgroud)
此外,如果您可以避免多个配置,您可以随时设置模板单位,您只需将您的单位重命名myservice.service为myservice@.service. 然后每次你开始一个单元时你都喜欢这样做systemctl start myservice@configsetting.service
然后在你的设备上,你可以在任何你想要的地方使用configsetting作为 %i,就像这样
[Unit]
Description=My service
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/myservice -C /etc/myservice/%i.conf
Run Code Online (Sandbox Code Playgroud)
如果你问我...使用 pystemd.run 或 systemd-run