web-dev-qa-db-ja.com

rndc reload <zonename>を実行した後、バインド取得ゾーン転送ステータス

変更されたゾーンのセカンダリ(スレーブ)サーバーでrndc reload <zone_name> in <view_name>を実行するスクリプトがあります。このコマンドは、リロードが正常にキューに入れられた場合に成功を返します。

ログ自体を経由せずに実際のゾーン転送のステータスを取得できる方法があるかどうかを知りたいと思いました。エラー自体に基づいてバインドの再読み込みが失敗した場合を自動的に処理できるようにしたい。現在、rndc reloadを実行した後、ログを解析してゾーン転送のステータスを取得する必要があります。

ログ自体を解析するよりも優れているrndc reload <zone_name>を実行した後、ゾーン転送のステータスを取得する方法を誰かが理解するのを手伝ってくれませんか。

注[わかりやすくするため]:マスターが変更についてスレーブと通信するためにnotifyを使用できることはわかっています。私の質問は、ログを解析せずに、何らかの理由でスレーブによって開始されたゾーン転送が失敗したときにnotifiedを取得する方法があるかどうかを知ることです。

例えば。スレーブに通知した後、何らかの理由でマスターサーバーが停止した可能性があります。この場合、スレーブがゾーン転送を開始すると、マスターからSOAレコードを取得できません。ゾーン転送中に発生する可能性のあるこの種のエラーについて通知を受け取りたいのですが、実際にログを解析します。

さらに情報が必要な場合はお知らせください。

1
unrealsoul007

(エラー)ログファイルは、Bindがそのようなエラーをログに記録する唯一の場所です。したがって、特定のエラーについてログファイルを解析したくない場合は、(Splunkなどを使用して、このような解析と関連するアラートの生成を自動化できます)あなたは何か他のものにする必要があります。

監視の観点からは、ゾーン転送中にエラーが通知されることに焦点を当てていると、ポイントが少し外れていると思います。それほど重要なのは実際にはエラーではなく、そのようなエラーがサービスの減少、失敗、またはエラーを示しているという事実です。代わりに、サービスに焦点を合わせます。

正しく構成された監視ソリューションは、そのような変更されたサービス状態を検出し、警告します。次に、エンジニア/オペレーターは、ログファイルを簡単に検索して、そのサービスの低下/失敗の関連する原因を探すことができます...

マスタースレーブシナリオでは、監視で次のことを確認する必要があります。

  • すべてのスレーブおよびマスターネームサーバーが応答し、ゾーンデータを返します
  • すべてのスレーブは、マスターと整合性のあるデータを返します

ゾーンを監視するのに適したDNSレコードは、SOAレコードです。これは、各ネームサーバーがすべてのゾーンに対して常に返すことができる必要があるためです。

次に、SOAレコードのシリアル番号は、スレーブがマスターと同期しているかどうかを示します。スレーブがNOTIFYメッセージを見逃したことが原因でシリアル番号に違いがある場合は、その差がSOA更新間隔より長く存在する場合、より深刻な問題が発生します。

2
HBruijn

次のスクリプトslave.shを作成します。

#!/bin/sh

ns1="yourfirstdnsserver"
ns2="yourslavednsserver" 
serial='grep SOA |cut -d " " -f7'
domain=$1

rndc reload $domain

a=`Host -t SOA $domain $ns1 |grep SOA |cut -d " " -f7`
b=`Host -t SOA $domain $ns2 |grep SOA |cut -d " " -f7`

if [ $a = $b ];
        then echo "$domain : synchro ok";
        else "$domain : Error";
fi;

./slave.sh yourdomain.comを使用するだけです。

楽しい!

a=`Host -t SOA yourdomain.com yourns1.com |grep SOA |cut -d " " -f7` && b=`Host -t SOA yourdomain.com yourns2.com |grep SOA |cut -d " " -f7` && if [ $a = $b ]; then echo "synchro ok"; else "Error"; fi;