Nagios

序論


このドキュメントでは、オブジェクト継承とテンプレートベースオブジェクト定義について説明します。

もしこのドキュメントを読んでも再帰と継承の働き方について理解できないままであれば、ディストリビューション内にあるサンプルのテンプレートベース設定ファイルを見ると良いでしょう。 さらにサンプルファイルが理解の助けにならなければ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_commandnotification_options変数が(ホストbighost1で使用されている)テンプレートオブジェクトから継承されている事が分かるでしょう。 しかしながらhost_namemax_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にしています。

ホスト bighost1bighost2の定義は総括的なホスト定義の変数を引き継いでいます。 唯一上書きしている値はaddress変数です。 これが意味しているのは、両ホストともhost_nameaddress変数を除いてすべてのプロパティを使用しているということです。 この例の設定データを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
}

この場合、ホストbighost1generichosttemplateで定義されるイベント_操作者変数の値を引き継ぎません。 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-hostdevelopment-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規則が右側に示されます。

テスト、トライアル、エラーは、あなたが、このような複雑な継承状況でどのように働くかよりよく正確に理解するのを助けるでしょう。

多重継承ソース

参照 参照: オブジェクトの設定, オブジェクト・トリック, カスタム・オブジェクト変数, 速い起動のオプション

English Deutsch 日本語

目次