序論
このドキュメントでは、オブジェクト継承とテンプレートベースオブジェクト定義について説明します。
もしこのドキュメントを読んでも再帰と継承の働き方について理解できないままであれば、ディストリビューション内にあるサンプルのテンプレートベース設定ファイルを見ると良いでしょう。 さらにサンプルファイルが理解の助けにならなければE-Mailで理解できない箇所の詳細をnagios-usersメーリングリストに投げてください。
基本
全オブジェクト定義内に再帰・継承に影響のある3つの変数があります。それらは以下の通りです・・・。 それらは以下の赤で示されます…
define someobjecttype{
object-specific variables ...
name template_name
use name_of_template_to_use
register [0/1]
}
最初の変数はnameです。 単純に他のオブジェクト定義から参照される"テンプレート"の名前です。したがってオブジェクトのプロパティ/値を継承することが出来ます。 テンプレート名は同じタイプのオブジェクトの中で一意のものでなくてはなりません。つまりホスト定義のテンプレート名に、"hosttemplate"という名前は複数設定できません。
2番目の変数はuseです。 これはプロパティ/変数を受け継ぎたいテンプレートオブジェクトの名称です。 ここで指定した名称は他のオブジェクトのテンプレート名のように決定しなくてはなりません(name変数を使用します)。
3番目の変数はregisterです。 この変数はNagiosでこのテンプレートが"レジスト"されるべきかどうかを示すために使用します。 デフォルトでは、全オブジェクト定義はレジストされます。 もしあるオブジェクト定義をテンプレートとして使いたい場合は、レジストしないようにします(後に例を挙げます)。 値は以下の通りです: 0 = オブジェクト定義として登録しない、1 = オブジェクト定義として登録する(デフォルト) この変数は継承しません。 テンプレートとして使用されるあらゆる(部分的)オブジェクト定義は、register指示に0を明示的に設定しなければなりません。 これは、登録されるべきすべてのオブジェクトに1の値にすることで継承したregister指示の上書きを防ぎます。
ローカル変数 vs. 継承された変数
継承について理解するための1つの重要なことは、"ローカル"オブジェクト変数がテンプレートオブジェクトに定義された変数より常に優先されるということです。 次に挙げる2つのホスト定義の例を見てみましょう(すべての必要な変数が表示されているわけではありません):
define host{
host_name bighost1
check_command check-host-alive
notification_options d,u,r
max_check_attempts 5
name hosttemplate1
}
define host{
host_name bighost2
max_check_attempts 3
use hosttemplate1
}
ホストbighost1用の定義はテンプレート名、hosttemplate1 が定義されていることに注意してください。 ホストbighost2の定義は、そのテンプレートオブジェクトとしてbighost1の定義を使用しています。 このデータをNagiosが処理したら、ホストbighost2の定義の結果は、次の定義と同等になるでしょう:
define host{
host_name bighost2
check_command check-host-alive
notification_options d,u,r
max_check_attempts 3
}
check_command と notification_options変数が(ホストbighost1で使用されている)テンプレートオブジェクトから継承されている事が分かるでしょう。 しかしながらhost_name と max_check_attempts 変数はテンプレートオブジェクトから継承されていません。 つまり、ローカルで定義された値は通常テンプレートオブジェクトから継承される値を上書きします 実にわかりやすいコンセプトです。
チップ: あなたがローカル文字変数が継承した文字列値に追加されて欲しいならば、そうすることができます。 以下でどうこれを達成するかに関してもう少し読みます。
継承の連鎖
オブジェクトは、テンプレートオブジェクトの複数のレベルからのプロパティ/変数を継承することができます。 では例を見ていきましょう:
define host{
host_name bighost1
check_command check-host-alive
notification_options d,u,r
max_check_attempts 5
name hosttemplate1
}
define host{
host_name bighost2
max_check_attempts 3
use hosttemplate1
name hosttemplate2
}
define host{
host_name bighost3
use hosttemplate2
}
ホストbighost3の定義はホストbighost1から継承されている変数を含むホストbighost2から変数を継承されていることに注意してください。 Nagiosがこの設定データを処理すると、結果的に次のホスト定義と同じようになります:
define host{
host_name bighost1
check_command check-host-alive
notification_options d,u,r
max_check_attempts 5
}
define host{
host_name bighost2
check_command check-host-alive
notification_options d,u,r
max_check_attempts 3
}
define host{
host_name bighost3
check_command check-host-alive
notification_options d,u,r
max_check_attempts 3
}
継承できるレベルの"深さ"には制限がありませんが、メンテナンス性という意味で各自で数レベルに制限したほうが良いでしょう。
不完全なテンプレート定義の使用
他のオブジェクト定義に不完全なオブジェクト定義をテンプレートとして使用することが可能です。 "不完全な"定義とはオブジェクト定義内でそれがオブジェクトとして必要なすべての変数を設定していないという意味です。 テンプレートとして不完全な定義を使用すると言うことは奇妙に思えるかも知れませんが、実際には使用することを推奨しています。 なぜですか? それは、不完全な定義が他のすべてのオブジェクト定義のデフォルトとして使用することができるかも知れないからです。 では例を見ていきましょう:
define host{
check_command check-host-alive
notification_options d,u,r
max_check_attempts 5
name generichosttemplate
register 0
}
define host{
host_name bighost1
address 192.168.1.3
use generichosthosttemplate
}
define host{
host_name bighost2
address 192.168.1.4
use generichosthosttemplate
}
可変であるという必要なhost_name がなくなっているので、最初のホスト定義が不完全であるのに注意します。 このホスト定義を総括的なテンプレートとして使用したいのでhost_nameは設定する必要がありません。 Nagiosに通常のホストとして登録しないようにするために、register変数を0にしています。
ホスト bighost1 と bighost2の定義は総括的なホスト定義の変数を引き継いでいます。 唯一上書きしている値はaddress変数です。 これが意味しているのは、両ホストともhost_name と address変数を除いてすべてのプロパティを使用しているということです。 この例の設定データをNagiosが処理したら、ホスト定義の結果は次のものと同等になります:
define host{
host_name bighost1
address 192.168.1.3
check_command check-host-alive
notification_options d,u,r
max_check_attempts 5
}
define host{
host_name bighost2
address 192.168.1.4
check_command check-host-alive
notification_options d,u,r
max_check_attempts 5
}
少なくとも、デフォルト値の設定のためにテンプレート定義を使うことは設定に必要なキータイプ回数をかなり少なくすることができます。 同様に多数のホストのデフォルト値を変更したい場合に頭を悩ますことも無くなりますよ。
カスタムオブジェクト変数
あなたのホスト、サービス、または連絡先定義テンプレートで定義するどんなカスタムオブジェクト変数も、他の標準変数のように継承されます。 では例を見ていきましょう:
define host{
_customvar1 somevalue ; Custom host variable
_snmp_community public ; Custom host variable
name generichosttemplate
register 0
}
define host{
host_name bighost1
address 192.168.1.3
use generichosthosttemplate
}
ホストbighost1はそれぞれの値と同様にgenerichosttemplate定義から、カスタムホスト変数 _customvar1 および _snmp_communityを継承します。 効果的な結果bighost1は、このように定義されます:
define host{
host_name bighost1
address 192.168.1.3
_customvar1 somevalue
_snmp_community public
}
文字列継承のキャンセル
いくつかの場合、あなたのホスト、サービス、または連絡先定義にそれらが参照するテンプレートから文字列変数の値を継承して欲しいと思わないかもしれません。 その場合、引き継ぎたくない変数の値として「null」(引用文のない)を指定できます。 では例を見ていきましょう:
define host{
event_handler my-event-handler-command
name generichosttemplate
register 0
}
define host{
host_name bighost1
address 192.168.1.3
event_handler null
use generichosthosttemplate
}
この場合、ホストbighost1はgenerichosttemplateで定義されるイベント_操作者変数の値を引き継ぎません。 bighost1の結果として生じる有効な定義は以下です:
define host{
host_name bighost1
address 192.168.1.3
}
文字列の付加的な継承
Nagiosはテンプレートから引き継がれた値の代わりにローカル変数を優先します。 ほとんどの場合、ローカル変数の値は、テンプレートに定義されているものを無視します。 いくつかの場合、それはNagiosが継承されたローカル変数とともに変数の値を使用することは、意味があります。
この「付加的な継承」は、プラス記号(+)でローカル変数値を付加することによって達成されることができます。 この機能はストリング値を含む標準(非カスタムの)の変数に利用可能です。 では例を見ていきましょう:
define host{
hostgroups all-servers
name generichosttemplate
register 0
}
define host{
host_name linuxserver1
hostgroups +linux-servers,web-servers
use generichosthosttemplate
}
この場合、ホストlinuxserver1は、generichosttemplateからローカル変数hostgroupsの値を追加するでしょう。 linuxserver1の結果として生じる有効な定義は以下です:
define host{
host_name linuxserver1
hostgroups all-servers,linux-servers,web-servers
}
暗黙の継承
通常、オブジェクト定義における、必要な変数の値を明示的に指定しなければならないか、またはテンプレートからそれを引き継がなければなりません。 この規則へのいくつかの例外があります。(そこでは、Nagiosが、代わりに関連するオブジェクトから来る値を使用したいと仮定します)。 例えば、別の方法でそれらを指定しないと、いくつかのサービス変数の値はサービスが関連しているホストからコピーされます。
次の表は、あなたがオブジェクト定義の中で明示的にそれらの値を指定しないか、テンプレートからそれらを受け継がなければ、関連するオブジェクトから暗黙に継承されるオブジェクト変数をリストします。
オブジェクトタイプ | オブジェクト変数 | 暗黙のソース |
---|---|---|
サービス | contact_groups | 関連するホスト定義中のcontact_group |
notification_interval | 関連するホスト定義中のnotification_interval | |
notification_period | 関連するホスト定義中のnotification_period | |
ホストのエスカレーション | contact_groups | 関連するホスト定義中のcontact_group |
notification_interval | 関連するホスト定義中のnotification_interval | |
escalation_period | 関連するホスト定義中のnotification_period | |
サービスのエスカレーション | contact_groups | 関連するホスト定義中のcontact_group |
notification_interval | 関連するホスト定義中のnotification_interval | |
escalation_period | 関連するホスト定義中のnotification_period |
エスカレーションにおける暗示/付加的な継承
サービスとホストのエスカレーション定義は暗黙で付加的な継承の特徴を結合する特別な規則を利用できます。 エスカレーション 1)が別のエスカレーション・テンプレートからそれら連絡先グループや連絡先指示の値を引き継がない、そして 2) それら連絡先グループや連絡先の指示が (+)プラスサインで始まっているなら、それらに対応したホストやサービス定義の連絡先グループや連絡先指示では付加的な引き継ぎロジックが使 われます。
混乱していますか? ここに、例があります:
define host{
name linux-server
contact_groups linux-admins
...
}
define hostescalation{
host_name linux-server
contact_groups +management
...
}
This is a much simpler equivalent to: これは、非常により単純な同じものです:
define hostescalation{
host_name linux-server
contact_groups linux-admins,management
...
}
多重継承のソース
これまでのところ、継承の例はすべて、単一のソースからの変数/値を継承するオブジェクト定義を示しました。 また、以下に示されているように、より複雑な設定のための多数のソースから変数/値を引き継ぐことができます。
# Generic host templatedefine host{
name generic-host
active_checks_enabled 1
check_interval 10
...
register 0
}
# Development web server template
define host{
name development-server
check_interval 15
notification_options d,u,r
...
register 0
}
# Development web server
define host{
use generic-host,development-server
host_name devweb1
...
}
例では、上では、devweb1が2つのソースから変数/値を引き継いでいます: generic-host と development-server check_interval変数が両方のソースで定義されているのに気付きます。 generic-hostがdevweb1のところで指定された最初のテンプレートであったので、check_interval変数の値はdevweb1ホストによって引き継がれます。 継承の後、devweb1の有効な定義は以下のとおりです:
# Development web server
define host{
host_name devweb1
active_checks_enabled 1
check_interval 10
notification_options d,u,r
...
}
多重継承による優先順位
あなたが多重継承ソースを使用する場合、Nagiosが多数のソースの中で定義されている変数をどのように扱うか知ることは重要です。 これらの例ではNagiosが使用する指示内に指定されている最初のソースからの変数/値を使用します。 継承が自分たちで出所を明示できるので、他の1つ以上のソースから変数/値を引き継いで、何の変数/値の組が優先するかを理解するのはトリッキーに成ります。
3つのテンプレートに参照をつける以下のホスト定義を考慮してください:
# Development web server
define host{
use 1, 4, 8
host_name devweb1
...
}
それらの参照をされたテンプレート自体のうちいくつかが1つ以上の他のテンプレートから変数/値を引き継ぐ場合、precendence規則が右側に示されます。
テスト、トライアル、エラーは、あなたが、このような複雑な継承状況でどのように働くかよりよく正確に理解するのを助けるでしょう。