ホストとサービスの依存関係


序文

サービスとホストの依存関係は1つ以上のホストやサービスのステータスからホストやサービスの挙動を制御することができる上級者向け機能です。ここではホストやサービスの依存関係の違いでどのように依存機能が働くのか説明します。

サービス依存関係の概要

次に示す画像を依存サービスの論理図として例に挙げます。ここではいくつか注意すべきポイントがあります:

  1. Aサービスは1つまたは複数の他のサービスに依存することができる。
  2. AサービスはAサービスが所属していない異なるホストのサービスでも依存することができる。
  3. サービスの依存関係は継承されません。
  4. サービスの依存関係は異なる状態(OK,WARNING,UNKNOWN,CRITICALステート)内でサービス実行とサービス通知を省略するために使用することができます。。

Service Dependencies

サービス依存関係の定義

まず、基本から。オブジェクト設定ファイルにサービス依存定義を追加することでサービスの依存関係を作成できます。それぞれの定義の中で依存しているサービスと依存されているサービスを定義し、実行と通知の依存関係を壊す(後述します)基準を(もしあれば)定義します。

1つのサービスに対し複数の依存関係を定義することができますが、それぞれの依存関係毎に定義を分けなくてはなりません。

上の画像では、ホストCサービスFの依存定義は次のようになります:

define servicedependency{
	host_name			Host B
	service_description		Service D
	dependent_host_name		Host C
	dependent_service_description	Service F
	execution_failure_criteria	o
	notification_failure_criteria	w,u
	}

define servicedependency{
	host_name			Host B
	service_description		Service E
	dependent_host_name		Host C
	dependent_service_description	Service F
	execution_failure_criteria	n
	notification_failure_criteria	w,u,c
	}

define servicedependency{
	host_name			Host B
	service_description		Service C
	dependent_host_name		Host C
	dependent_service_description	Service F
	execution_failure_criteria	w
	notification_failure_criteria	c
	}

上図の他の依存関係定義は以下のようにして行います:

define servicedependency{
	host_name			Host A
	service_description		Service A
	dependent_host_name		Host B
	dependent_service_description	Service D
	execution_failure_criteria	u
	notification_failure_criteria	n
	}

define servicedependency{
	host_name			Host A
	service_description		Service B
	dependent_host_name		Host B
	dependent_service_description	Service E
	execution_failure_criteria	w,u
	notification_failure_criteria	c
	}

define servicedependency{
	host_name			Host B
	service_description		Service C
	dependent_host_name		Host B
	dependent_service_description	Service E
	execution_failure_criteria	n
	notification_failure_criteria	w,u,c
	}

サービス依存性のチェック方法

Nagiosがサービスに対してサービスチェックや通知を行う前に、そのサービスが何か依存関係を持っていないかチェックします。もしなにも依存関係を持っていないのであれば、通常通りチェックは実行され、通知が送られます。もしそのサービスが何か1つ以上の依存関係を持っている場合、Nagiosは依存関係ぞれぞれの次のエントリをチェックします:

  1. Nagiosは依存されているサービスの現在の状態*を取得します。
  2. Nagiosは依存定義の中の実行または通知失敗オプション(そのとき適切ないずれかのもの)の状態と依存されているそのサービスの現在の状態を比較します。
  3. もしその依存されているサービスの現在の状態が失敗オプションの1つにでもマッチしたら、その依存関係は崩れたと言え、Nagiosは依存関係チェックのループに入ります。
  4. 依存されているそのサービスの現在の状態が、依存関係のエントリの失敗オプションのいずれにもマッチ内場合は、その依存関係は正常と言え、Nagiosは次の依存エントリをチェックします。

    このサイクルはそのサービスのための依存関係がすべてチェックされるか、依存チェックが失敗するまで続きます。

    *1つ重要なことは、デフォルトでは依存チェックを行う際に依存されているそのサービスのもっとも最近の ハードステートを使用します。もしNagiosに(ハードステート・ソフトステートにかかわらず)もっとも最近のステートを使用させたい場合は、soft_service_dependenciesオプションを有効にしてください。

    サービス実行依存

    実行依存はサービスのアクティブチェックを制限する時に使います。 パッシブチェックは実行依存では制限されません。

    そのサービスの実行依存テストがパスした場合、 Nagiosはそのサービスを通常通りのサービスチェックを実行します。 サービスの実行依存テストのいずれかにも失敗した場合、 Nagiosはその(依存している)サービスのチェックを一時的に停止します。 後に、その実行依存テストがすべてパスするかもしれません。 そうなった場合、Nagiosは通常通りのサービスチェックを再開します。チェックスケジューリングロジックのより詳しい情報は こちらです。

    上の例では、もし サービスBがWARNINGもしくはUNKNOWNステートになった場合、 サービスEは実行依存テストに失敗します。そうなった場合、 そのサービスチェックは実行されず、チェックのスケジュールは後に回されます。

    サービス通知依存

    そのサービスの通知依存テストがパスした場合、Nagiosはそのサービスを通常通りの通知を実行します。サービスの通知依存テストのいずれかにも失敗した場合、Nagiosはその(依存している)サービスの通知を一時的に停止します。後に、その通知依存テストがすべてパスするかもしれません。そうなった場合、Nagiosは通常通りの通知を再開します。通知ロジックに関する詳しい説明はこちらです。

    上の例では サービスCがCRITICAL、または/もしくはサービスDがWARNINGもしくはUNKNOWNステート、または/もしくはサービスEがWARNING、UNKNOWN、CRITICALステートの場合にサービスFは通知依存テストに失敗します。そうなった場合、そのサービスの通知は送られません。

    サービス依存関係の継承

    前述しましたが、サービス依存関係は継承されません。上の例ではサービスFはサービスEに依存しています。しかし、サービスEがサービスBとサービスCに依存していると依存関係が自動で継承されることはありません。サービスBの依存定義が存在しないため、サービスFはサービスBには依存しない事になります。

    サービス依存の継承関係を作成するなら、 サービス依存定義中で inherits_parentディレクティブを使用しなければなりません。 このディレクティブが有効な時、依存はサービスの依存を引き継ぐ事を意味します。 言い換えれば、マスターサービスが他のサービスや依存の失敗をも依存していると この依存もまた失敗します。

    あるケースでは、サービス依存が自動で継承されないために、 設定ファイルの中に追加で依存定義をしてやる必要が出てくるでしょう。 しかし、これはよりフレキシブルな設定が可能であることを意味しています。 例えば、上の例ではおそらくサービスFがサービスBに依存しないようにする方が 良い十分な理由があるのかも知れません。もし自動的に依存関係が継承されると、 こういう設定は不可能です。

    define servicedependency{
    	host_name			Host B
    	service_description		Service D
    	dependent_host_name		Host C
    	dependent_service_description	Service F
    	execution_failure_criteria	o
    	notification_failure_criteria	n
    	inherits_parent		1
    	}
    
    

    inerits_parentディレクティブが有効になっているので、サービスAとDの依存は サービスFとDが検証される時に検証されます。

    依存は継承の倍数レベルを持てます。AとDのinherits_parentディレクティブの依存定義が有効に なると、サービスAは他のサービス(サービスGと呼ぶ)に依存し、サービスFはサービスD、AとGに依存する (各々で異なった評価基準がある)。

    ホスト依存関係

    期待しているとおり、ホスト依存関係はサービス依存関係と似た動きをします。大きな違いは、サービスではなくホストであると言うことです。他に違いと言えば、ホスト依存関係はホスト通知を停止することしか行わず、ホストチェックを停止させることはできません。

    注意! ホスト依存と親子関係を混同してはいけません。 殆どの場面ではホスト依存ではなく、親子関係(ホストディレクティブを定義する)を使用したほうがいいでしょう。

    下の画像はホスト依存関係の論理図のサンプルです。

    Host Dependencies

    上の画像のホストCの依存定義は次のようになります:

    define hostdependency{
    	host_name			Host A
    	dependent_host_name		Host C
    	notification_failure_criteria	d
    	}
    
    define hostdependency{
    	host_name			Host B
    	dependent_host_name		Host C
    	notification_failure_criteria	d,u
    	}
    

    サービス依存関係と同じように、ホスト依存関係も継承されません。上の図ではホストCがホストBのホスト依存関係を継承していません。ホストCがホストAに依存関係を作るためには、新しいホスト依存定義を作成しなくてはなりません。

    ホスト通知依存関係はサービス依存関係のそれと同じような働きをします。そのホストの通知依存テストがパスした場合、Nagiosはそのホストの通常通りの通知を実行します。ホストの通知依存テストのいずれかに失敗した場合、Nagiosはその(依存している)ホストの通知を一時的に停止します。後に、その通知依存テストがすべてパスするかもしれません。そうなった場合、Nagiosは通常通りの通知を再開します。通知ロジックに関する詳しい説明はこちらです。

    注釈: ホストの実行依存はサービスの実行依存の非常によく似ています。 しかし、定期的なホストチェックスケジュール。 必要に応じたホストチェックはホストの実行依存に影響を受ける事はありません。