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...=|...」)の後に垂直バー記号(「|」)を使用できます。デバイスに1つ以上のトリガ条件が定義されている場合は、そのデバイスに1つ以上のトリガ条件が適用され、すべての一般的な(つまりトリガされていない)条件が適用されると、デバイスが起動します。

したがって、ConditionHost=|各条件を使用すると、条件はORに関連付けられます。

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

次のようにグローブを含めることもできます。

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

ファイルで次を使用します。

ConditionHost=|HostOne*
ConditionHost=|HostTwo*

私はあなたがしたいことを知ることができます。これ文書 説明する:

これはホスト名文字列です(オプションでシェルスタイルのグローブを使用する)これはローカルに設定されたホスト名に対してテストされています...

私たちが見るとman 7 glob私達は読みます:

文字列に「?」、「*」、または「[」文字のいずれかが含まれている場合は、ワイルドカードパターンです。ワイルドカード割り当ては、ワイルドカードパターンをパターンと一致するパス名のリストに拡張する操作です。

この定義では、両方ともグローバルと見なされ|ません{...}。 systemdは{...}一般的なbashglobと見なすことができますが、bashではなく、その定義を使用しません。

おすすめ記事