我知道可以通过使用ConditionHost
单元文件中的条件将 systemd 单元限制到特定主机。这ConditionHost
是针对调用主机名的结果进行测试的。
我无法找到(但我希望这是可能的)是一种基于 DNS 别名执行相同操作的方法。因此,我希望有一种方法可以在单元文件中指定的 DNS 别名解析为当前主机的主机上启动 systemd 单元。
背景:目前我们有一系列应用程序/服务,以 systemd 服务启动,并分组为 systemd 目标。每个服务单元文件都包含一个 ConditionHost,指定该服务应在哪台主机上运行。单元文件通过 RPM 分发,所有单元文件都安装在所有主机上。现在可以在所有这些主机上启动相同的 systemd 目标,systemd 将根据主机名在正确的主机上启动正确的服务。客户端通常使用 DNS 别名而不是直接使用主机名来访问服务。
如果上述主机之一出现故障,可以轻松使用具有相同配置的备用主机,并相应地更新 DNS 别名。然而,不便的是,现在还必须更新 systemd 单元文件以反映受影响服务的 ConditionHost 规范。
这个想法是,如果 systemd 能够使用 DNS 别名而不是主机名,则只需 1) 更新 DNS 别名,2) 在替换计算机上重新启动 systemd 目标就足够了。
答案1
您可以编写一个包装器脚本,仅当您的 DNS 别名检查通过时才执行该服务。要检查的值可以作为环境变量传递。
服务文件:
[Service]
Environment=CONDITION_DNSALIAS=abc
Exec=/path/to/dnsaliascheck-wrapper exec args
...
包装脚本:
#!/bin/sh
check_dns_alias() {
# Your logic to check DNS alias here, return 0 for success and 1 otherwise.
return 0
}
if [ -z "$@" ]; then
echo "No arguments!"
return 1
fi
# If CONDITION_DNSALIAS is empty, the check should pass
if [ -z "$CONDITION_DNSALIAS" ] || check_dns_alias ; then
unset CONDITION_DNSALIAS
exec "$@"
fi
echo "DNS alias condition not met"
exit 0
您需要编写实际的检查check_dns_alias
,使用CONDITION_DNSALIAS
变量进行比较。