ConditionHost
ユニットファイルの条件を使用して、systemdユニットを特定のホストに制限できることを知っています。これは、ConditionHost
ホスト名呼び出しの結果に対してテストされました。
私が見つけることができないのは(しかし可能であることを願っています)、DNSエイリアスに基づいて同じことをする方法です。そのため、ユニットファイルで指定されたDNSエイリアスが現在ホストとして解決されているホストでsystemdユニットを起動する方法があることを望みました。
背景:現在、私たちはsystemdサービスから始まり、systemdターゲットにグループ化された一連のアプリケーション/サービスを持っています。各サービス単位ファイルには、サービスを実行するホストを指定するConditionHostが含まれています。ユニットファイルはRPMを介して配布され、すべてのユニットファイルはすべてのホストにインストールされます。これで、これらのすべてのホストで同じ systemd ターゲットを起動できるようになり、systemd はホスト名に基づいて正しいホストで正しいサービスを開始します。クライアントは通常、ホスト名の代わりに DNS エイリアスを使用してサービスに直接アクセスします。
上記のいずれかのホストに障害が発生した場合、同じ構成のバックアップホストを簡単に使用でき、それに応じてDNSエイリアスが更新されます。ただし、残念ながら、影響を受けるサービスのConditionHost仕様を反映するようにsystemdユニットファイルも更新する必要があります。
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
。