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

1 systemd systemd-unit

我正在尝试使 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

Run Code Online (Sandbox Code Playgroud)

有什么建议吗?

Ste*_*art 5

长话短说:

\n
ConditionHost=|HostOne*\nConditionHost=|HostTwo*\n
Run Code Online (Sandbox Code Playgroud)\n
\n

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

\n

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

\n

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

\n
$ systemd-analyze condition ConditionHost=stewbian\ntest.service: ConditionHost=stewbian succeeded.\nConditions succeeded\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
$ systemd-analyze condition ConditionHost=stew*\ntest.service: ConditionHost=stew* succeeded.\nConditions succeeded.\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
$ systemd-analyze condition ConditionHost=machine2\ntest.service: ConditionHost=machine2\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
\n

man systemd.unit

\n
\n

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

\n
\n

因此,多个条件应该在单独的行上,但它们将被AND\'d,所以它会失败

\n
$ systemd-analyze condition "ConditionHost=machine2" "ConditionHost=stewbian"\ntest.service: ConditionHost=stewbian succeeded.\ntest.service: ConditionHost=machine2 failed.\nConditions failed.\n\n
Run Code Online (Sandbox Code Playgroud)\n

但手册页继续:

\n
\n

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

\n
\n

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

\n
$ systemd-analyze condition "ConditionHost=|machine2" "ConditionHost=|stewbian"\ntest.service: ConditionHost=|stewbian succeeded.\ntest.service: ConditionHost=|machine2 failed.\nConditions succeeded.\n
Run Code Online (Sandbox Code Playgroud)\n

您还可以包含 glob:

\n
$ systemd-analyze condition \\\n    "ConditionHost=|stew*" \\\n    "ConditionHost=|machine*"\ntest.service: ConditionHost=|machine* failed.\ntest.service: ConditionHost=|stew* succeeded.\nConditions succeeded.\n
Run Code Online (Sandbox Code Playgroud)\n

在您的文件中,使用:

\n
ConditionHost=|HostOne*\nConditionHost=|HostTwo*\n
Run Code Online (Sandbox Code Playgroud)\n
\n

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

\n
\n

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

\n
\n

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

\n
\n

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

\n
\n

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

\n