web-dev-qa-db-ja.com

Systemd-DNSが利用可能になった後にのみサービスを開始します

私はいくつかのサービス、特にnginxとntpdを持っています。これらは適切に起動するためにDNS解決が機能しているかどうかに依存します。現在、これらのサービスはどちらも起動時に正しく起動しませんが、マシンが起動したときに手動で介入すると正常に起動し、名前を解決できないことに関するログのメッセージがいくつかあります。

これにより、systemdで競合状態が発生していると思います。私のサーバーは、ネームサーバーとして127.0.0.1を指しています。 localhost:53にバインドされているのはpdns-recursorです。次のように、ユニットファイルでntpとnginxをWantedBy pdns-recursorに設定しました

[Unit]
WantedBy=pdns-recursor.service

ただし、nginxとntpの両方で、起動時に名前を解決できないというログメッセージが引き続き表示されます。

これらのサービスが開始する前に、DNSが完全に起動していることを確認するにはどうすればよいですか? Ubuntu 16.04を使用しています

Aug 09 22:35:25 Host.blah ntpd[3574]: restrict: ignoring line 21, address/Host 'ntp.blah' unusable.
Aug 09 22:35:26 Host.blah ntpd[3574]: restrict: ignoring line 23, address/Host 'ntp.blah' unusable.
Aug 09 22:35:28 Host.blah ntpd[3574]: restrict: ignoring line 25, address/Host 'ntp.blah' unusable.
Aug 09 22:35:29 Host.blah ntpd[3574]: restrict: ignoring line 27, address/Host 'ntp.blah' unusable.
2
Brando__

私の問題に対する適切な解決策ではなく、ほぼ間違いなく私のコードレビューに合格しないでしょうが、おそらく他の誰かにとっては役立つでしょう。

続行する前に名前の解決を引き続き試行するために、ntpおよびnginxユニットファイルにexec start前提条件を配置しました。

ExecStartPre=/bin/bash -c 'until Host example.com; do sleep 1; done'
3
Brando__

使ってみてください:

[Unit]
After=network-online.target
Wants=network-online.target

nix&LinuxFreeDesktop のサイトに完全な記事があります。

6
jeberle

したがって、IPではなくDNS FQDNを介してマウントする必要があるリモートマウントCIFSドライブと同じジレンマがあります。私はいくつかのことを試しましたが、これまでのところ、Brandoのソリューションに同意する必要があります(Systemdサービス全体を記述して、.mountまたはnetwork-online.targetの前にそれを引き出すのではありません)。

私が見つけたBrandoの唯一の代替策(これは、マンページからの理論上ではなく、実際に実際に機能します)は、そりハンマーでフライをたたき、ExecStartPre =を-に入れることですsystemd-networkd-wait-online.service:

[Service]
...
ExecStartPre=/bin/sleep 15

熱心な場合は、ExecStart =-interface = interface_name を使用して追加することもできます(オプションで--timeout =)。これは、vlanサブインターフェイスを持っているので役立ちますが、オンラインで待機するインターフェイス(ループバックは除外されます)の最初を追跡するだけでした。しかし、それだけでは問題は解決しませんでした。

私は-o _netdev を/ etc/fstabのマウント定義内で使用するとそれを修正します(そして、理論的にはSystemdリモートドライブはネットワークオンラインを待ちますデフォルトでは.target)ですが、残念ながらサイコロはありません。結果のmnt-remote.mountファイルの依存関係をリストすると、network-online.targetが前兆であることが示されますが、それでもDNSは失敗します。ブート後のサービスを手動で実行すると問題なく動作します。マウントプロセスが発生する前に、ターゲットが起動してから実際にDNSが解決するまでの間に何らかの競合状態が発生します。それと、「オンライン」インターフェースの定義が人から人へ、そしてケースからケースへと変わるという事実(私のユースケースはDNSを必要とし、他は明らかにそうではありません-FreeDesktopで広範囲にカバーされるトピック: https ://www.freedesktop.org/wiki/Software/systemd/NetworkTarget )。

Brandoのソリューションはよりエレガントです。これは、スリープ時間を最小限に抑えるために試行錯誤が必要ですが、DHCP/DNS/NICがすべてを整理するのにかかる時間を条件として、確実に機能します。

Brandoが何らかの理由で機能しない場合に備えて、これを劣った解決策として捨てます。

もう1つの回避策は、ローカルのhostsファイルにエントリをパンチすることですが、IPからFQDNへの変更が比較的頻繁に行われる場合には、これを行うことには興味がありませんでした(IPを使用してマウントするだけの場合と同様の問題)最初の場所)。

1
Chris

競合状態の診断に同意します...依存関係が明示的に構成されていない限り、systemdはこれらのサービスを並行して開始しようとします。しかし、WantedByディレクティブが役立つとは思いません。これは this man page のように、起動時の依存関係ではなく、インストールの依存関係に影響を与えるためです。

あなたが探しているのは、WantsディレクティブとAfterディレクティブの組み合わせだと思います。 ntpとnginxのそれぞれについて、ユニットファイルに以下を追加したいと思います。

Wants=pdns-recursor.service
After=pdns-recursor.service

これらの2つのオプションにより、ntp/nginxサービスの前にDNSサービスが確実に開始され、競合を解決できるはずです。

ベルトサスペンダーのような人なので、実際には、名前/ IPマッピングを/ etc/hostsファイルに入れることをお勧めします。これにより、DNSに障害が発生した場合でも他のサービスを開始できます。静的ファイルより優先してDNSを使用したい場合は、解決順序を切り替えることができます。

0
Jeremy Dover