是否可以覆盖 systemd 单元文件来创建模板单元文件?

suj*_*itv 8 linux systemd

我知道 systemd 提供了一种很好的机制来覆盖包提供的单元文件以影响服务配置/行为。这通常通过使用以下命令来完成

sudo systemctl edit <unitfile>
Run Code Online (Sandbox Code Playgroud)

在以下位置创建覆盖 conf 文件

/etc/systemd/system/<unitfile.d>/
Run Code Online (Sandbox Code Playgroud)

Systemd 还提供了一种单独的机制来定义模板单元文件,并在运行时对其进行实例化以创建特定于实例的单元。这需要将模板文件命名为

<servicename>@.service
Run Code Online (Sandbox Code Playgroud)

然后将其实例化为

systemctl start <servicename>@<instancename>
Run Code Online (Sandbox Code Playgroud)

现在,我想将包提供的服务作为多个单元实例运行。我想避免创建自己的模板单元文件,所以我想看看是否可以覆盖包提供的单元文件来创建模板单元文件。

由于,根据我的理解,模板单元文件的命名约定与常规单元文件不同,我认为我无法通过将包提供的单元文件放在 /etc/systemd/system.conf 中来覆盖模板文件。

有什么明确的方法可以实现我想要做的事情吗?

具体场景:grafana 包安装了一个 grafana-server.service 单元文件。我想在我的机器上运行两个 grafana 实例——一个分别用于 DEV 和 STG。我已经能够做到这一点:

但是,这会断开与 grafana 提供的服务单元文件的链接,如果他们在我升级时增强了服务文件,我将需要再次重做此活动。我的目标是避免这种直接依赖,而是将其转换为覆盖依赖。

有什么想法吗?

RDP*_*RDP 6

对于下面的两个选项,首先覆盖 grafana-server.service(不带@)/etc/systemd/system并抑制ExecStart(假设它使用它)使其不启动。在/etc/systemd/system/grafana-server.service.d/10-disable-execstart.conf

[Service]
ExecStart=
WorkingDirectory=/path/to/your/confdir
Run Code Online (Sandbox Code Playgroud)

选项 1 - 覆盖通用实例

grafana-server@.service使用以下配置创建与您的设置相对应的[Unit][Service]

[Unit]
PartOf=grafana-server.service
ReloadPropagatedFrom=grafana-server.service
Run Code Online (Sandbox Code Playgroud)

这些应该将 grafana-server start/stop/restart 绑定到所有实例。这个魔法没有很好的文档记录,但是如果你把<instance_name>.conf文件放在你的/path/to/your/confdir,所有这些实例都将自动绑定!

选项 2 - 覆盖特定实例以保留包配置

如果您想保留包服务文件中的所有更新优点,但接受维护自定义实例选项,请为通用的每个实例名称创建一个符号链接

/lib/systemd/system/grafana-server.service
Run Code Online (Sandbox Code Playgroud)

/etc/systemd/system/grafana-service@<instance>.service
Run Code Online (Sandbox Code Playgroud)

然后使用仅覆盖该实例的特定选项

/etc/systemd/system/grafana-server@<instance>.service.d/99-my-options.conf
Run Code Online (Sandbox Code Playgroud)

请确保以下配置增加[Unit][Service]99-my-options.conf

[Unit]
PartOf=grafana-server.service
ReloadPropagatedFrom=grafana-server.service
Run Code Online (Sandbox Code Playgroud)

这将为每个实例假定所有grafana-server.service选项,并将使用99-my-options.conf文件中的所有选项覆盖它们,并将启动/停止/重启操作绑定到 grafana-server.service。

在这两个选项上,如果您运行

systemctl start grafana-server.service
Run Code Online (Sandbox Code Playgroud)

/path/to/confdir/<instance>.conf将启动所有具有文件的实例。这同样适用于stoprestart,并且您始终可以使用其grafana-server@<instance>服务名称单独管理它们。