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


8

我知道systemd提供了一种出色的机制来覆盖程序包提供的单元文件,以影响服务配置/行为。通常使用以下命令完成此操作

sudo systemctl edit <unitfile>

在创建一个覆盖conf文件

/etc/systemd/system/<unitfile.d>/

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

<servicename>@.service

然后实例化为

systemctl start <servicename>@<instancename>

现在,我遇到了一种情况,我想将包提供的服务作为多个单元实例运行。我想避免创建自己的模板单元文件,因此我尝试查看是否可以重写软件包提供的单元文件来创建模板单元文件。

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

有什么明确的方法可以实现我的目标吗?

特定方案:grafana软件包安装grafana-server.service单位文件。我想在我的机器上运行grafana的两个实例-DEV和STG分别一个。我已经能够做到这一点:

  • 修改grafana-server.service文件(使用%I设置文件夹位置和文件路径)
  • 将修改后的grafana-server.service重命名为grafana-server @ .service
  • 使用以下命令启动grafana实例:

    sudo systemctl start grafana-server@dev
    

    sudo systemctl start grafana-server@stg
    

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

有什么想法吗?

Answers:


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

选项1-用通用实例覆盖

创建一个grafana-server@.service具有以下配置对应于您的设置[Unit][Service]

[Unit]
PartOf=grafana-server.service
ReloadPropagatedFrom=grafana-server.service

这些应该将grafana-server启动/停止/重新启动绑定到所有实例。该魔术是不是非常有据可查的,但如果你把<instance_name>.conf你的文件/path/to/your/confdir,所有这些实例都将被自动地束缚!

选项2-覆盖特定实例以保持程序包配置

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

/lib/systemd/system/grafana-server.service

/etc/systemd/system/grafana-service@<instance>.service

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

/etc/systemd/system/grafana-server@<instance>.service.d/99-my-options.conf

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

[Unit]
PartOf=grafana-server.service
ReloadPropagatedFrom=grafana-server.service

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

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

systemctl start grafana-server.service

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.