如何在systemd单元条件下检查多个主机名

如何在systemd单元条件下检查多个主机名

我正在尝试使 systemd 服务基于多个主机名模式有条件启动。

我尝试过这个但没有运气:

root@linkbox-BI034415:/# systemctl cat mcbapp
# /lib/systemd/system/myservice.service
[Unit]
Description=My Service
Wants=another.service
After=another.service
ConditionHost=HostOne*|HostTwo*
Also tried
ConditionHost={HostOne*,HostTwo*}


[Service]
EnvironmentFile=/etc/default/myenv
ExecStart=/opt/bin/my-apps
Restart=on-failure

[Install]
WantedBy=multi-user.target

有什么建议吗?

答案1

长话短说:

ConditionHost=|HostOne*
ConditionHost=|HostTwo*

您可以使用 轻松检查您的条件systemd-analyze。这应该会加快你的测试速度。

ConditionHost这是我在自己的机器上使用的示例( stewbian)。

在这里,我成功地进行了精确匹配。

$ systemd-analyze condition ConditionHost=stewbian
test.service: ConditionHost=stewbian succeeded.
Conditions succeeded

在这里,我成功进行了全局匹配

$ systemd-analyze condition ConditionHost=stew*
test.service: ConditionHost=stew* succeeded.
Conditions succeeded.

在这里,我正确地失败了,因为匹配不正确

$ systemd-analyze condition ConditionHost=machine2
test.service: ConditionHost=machine2

因此,首先,我们可以说您的测试可以与 一起使用ConditionHost=Host*,但我怀疑您想要更精确。


man systemd.unit

如果指定了多个条件,则如果所有条件都适用(即应用逻辑 AND),则将执行该单元。

因此,多个条件应该在单独的行上,但它们将进行 AND 运算,因此会失败

$ systemd-analyze condition "ConditionHost=machine2" "ConditionHost=stewbian"
test.service: ConditionHost=stewbian succeeded.
test.service: ConditionHost=machine2 failed.
Conditions failed.

但手册页继续:

条件检查可以在等号(“Condition…=|…”)后使用竖线符号(“|”),这使得该条件成为触发条件。如果为一个单元定义了至少一个触发条件,则如果该单元的至少一个触发条件适用且所有常规(即非触发)条件适用,则该单元将被启动。

因此,ConditionHost=|在每个条件上使用,条件将进行“或”运算:

$ systemd-analyze condition "ConditionHost=|machine2" "ConditionHost=|stewbian"
test.service: ConditionHost=|stewbian succeeded.
test.service: ConditionHost=|machine2 failed.
Conditions succeeded.

您还可以包含 glob:

$ systemd-analyze condition \
    "ConditionHost=|stew*" \
    "ConditionHost=|machine*"
test.service: ConditionHost=|machine* failed.
test.service: ConditionHost=|stew* succeeded.
Conditions succeeded.

在您的文件中,使用:

ConditionHost=|HostOne*
ConditionHost=|HostTwo*

我可以看到你想做什么。这文档

这要么采用主机名字符串(可选择使用 shell 样式的 glob)这是针对本地设置的主机名进行测试的...

如果我们看一下man 7 glob我们读:

如果字符串包含字符“?”、“*”或“[”之一,则该字符串是通配符模式。通配符是将通配符模式扩展为与该模式匹配的路径名列表的操作。

在这个定义中, 和 都不|{...}认为是全局的。虽然systemd{...}可能被认为是一个常见的bashglob,但它不是 bash 并且不使用该定义。

相关内容