<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    模板的對象繼承

    介紹

    本文檔試圖說明對象繼承以及如何在對象定義中使用它。

    閱讀完本文后,如果對遞歸和繼承的工作方式感到困惑,請查看Nagios發行版中提供的示例對象配置文件。如果仍然不能解決問題,請在nagios核心支持論壇上發送一封電子郵件,其中詳細說明您的問題。

    基本

    所有對象定義中都存在三個影響遞歸和繼承的變量。它們用紅色表示,如下所示:

    定義someobjecttype {
    對象特定的變量 …
    名稱 template_name
    使用 name_of_template_to_use
    寄存器[0/1]
    }

    第一個變量是name。它只是一個“模板”名稱,可以在其他對象定義中引用它,以便它們可以繼承對象的屬性/變量。在相同類型的對象之間,模板名稱必須唯一。因此,不能有兩個或多個以“ hosttemplate”作為模板名稱的主機定義。

    第二個變量是use。在這里可以指定要從其繼承屬性/變量的模板對象的名稱。您為此變量指定的名稱必須定義為另一個對象的模板命名(使用name變量)。

    第三個變量是register。該變量用于指示對象定義是否應在Nagios中“注冊”。默認情況下,所有對象定義都已注冊。如果您使用部分對象定義作為模板,則希望阻止其注冊(稍后提供此示例)。值如下:0 =不注冊對象定義,1 =注冊對象定義(這是默認值)。這個變量不是繼承的。用作模板的每個(部分)對象定義都必須將register指令顯式設置為0。這樣可以避免需要覆蓋值為1的繼承寄存器指令 對于應該注冊的每個對象。

    局部變量與繼承變量

    繼承要理解的一件事是,“本地”對象變量始終優先于模板對象中定義的變量。看下面兩個主機定義的示例(未提供所有必需的變量):

    定義主機{
    host_name bighost1
    check_command檢查主機有效
    notification_options d,u,r
    max_check_attempts 5
    名稱hosttemplate1
    }
    ?
    定義主機{
    host_name bighost2
    max_check_attempts 3
    使用hosttemplate1
    }

    您會注意到,主機bighost1的定義已定義為以hosttemplate1作為其模板名稱。主機的定義bighost2使用的定義bighost1作為模板對象。一旦Nagios處理了這些數據,主機bighost2的最終定義將等同于以下定義:

    定義主機{
    host_name bighost2
    check_command檢查主機有效
    notification_options d,u,r
    max_check_attempts 3
    }

    您可以看到check_commandnotification_options變量是從模板對象(定義主機bighost1的位置)繼承的。但是,host_namemax_check_attempts變量不是從模板對象繼承的,因為它們是在本地定義的。請記住,本地定義的變量會覆蓋通常從模板對象繼承的變量。這應該是一個相當容易理解的概念。

    提示:如果您希望將本地字符串變量附加到繼承的字符串值上,則可以這樣做。在下面閱讀更多有關如何完成此操作的信息。

    繼承鏈

    對象可以從多個級別的模板對象繼承屬性/變量。請看以下示例:

    定義主機{
    host_name bighost1
    check_command檢查主機有效
    notification_options d,u,r
    max_check_attempts 5
    名稱hosttemplate1
    }
    ?
    定義主機{
    host_name bighost2
    max_check_attempts 3
    使用hosttemplate1
    名稱hosttemplate2
    }
    ?
    定義主機{
    host_name bighost3
    使用hosttemplate2
    }

    您會注意到,主機bighost3的定義從主機bighost2的定義繼承了變量,而主機bighost2的定義又從主機bighost1的定義繼承了變量。Nagios處理此配置數據后,生成的主機定義將等同于以下內容:

    定義主機{
    host_name bighost1
    check_command檢查主機有效
    notification_options d,u,r
    max_check_attempts 5
    }
    ?
    定義主機{
    host_name bighost2
    check_command檢查主機有效
    notification_options d,u,r
    max_check_attempts 3
    }
    ?
    定義主機{
    host_name bighost3
    check_command檢查主機有效
    notification_options d,u,r
    max_check_attempts 3
    }

    “深度”繼承的方式沒有固有的限制,但是您可能希望將自己限制在幾個級別以保持理智。

    使用不完整的對象定義作為模板

    可以將不完整的對象定義用作模板,以供其他對象定義使用。“不完整”定義是指對象定義中未提供對象中所有必需的變量。使用不完整的定義作為模板聽起來很奇怪,但是實際上建議您使用它們。它們可以用作一組默認值,以用于所有其他對象定義。請看以下示例:

    定義主機{
    check_command檢查主機有效
    notification_options d,u,r
    max_check_attempts 5
    名稱通用主機模板
    寄存器0
    }
    ?
    定義主機{
    host_name bighost1
    地址192.168.1.3
    使用generichosttemplate
    }
    ?
    定義主機{
    host_name bighost2
    地址192.168.1.4
    使用generichosttemplate
    }

    請注意,第一個主機定義不完整,因為它缺少必需的host_name變量。我們不需要提供主機名,因為我們只想將此定義用作通用主機模板。為了避免將此定義作為正常主機向Nagios注冊,我們將register變量設置為0。

    主機bighost1bighost2的定義從通用主機定義繼承其值。我們選擇覆蓋的唯一變量是地址變量。這意味著除了host_nameaddress變量之外,這兩個主機將具有完全相同的屬性。一旦Nagios處理了示例中的配置數據,生成的主機定義將等同于指定以下內容:

    定義主機{
    host_name bighost1
    地址192.168.1.3
    check_command檢查主機有效
    notification_options d,u,r
    max_check_attempts 5
    }
    ?
    定義主機{
    host_name bighost2
    地址192.168.1.4
    check_command檢查主機有效
    notification_options d,u,r
    max_check_attempts 5
    }

    至少,為默認變量使用模板定義將為您節省很多輸入時間。如果要更改大量主機的變量的默認值,這也將在以后為您省去很多麻煩。

    自定義對象變量

    您在主機,服務或聯系人定義模板中定義的 任何自定義對象變量都將像其他標準變量一樣被繼承。請看以下示例:

    定義主機{
    _customvar1 somevalue; <-自定義主機變量
    _snmp_community public; <-自定義主機變量
    名稱通用主機模板
    寄存器0
    }
    ?
    定義主機{
    host_name bighost1
    地址192.168.1.3
    使用generichosttemplate
    }

    主機bighost1將繼承自定義的主機變量_customvar1_snmp_community,以及它們各自的值,從generichosttemplate定義。有效的結果是bighost1的定義如下所示:

    定義主機{
    host_name bighost1
    地址192.168.1.3
    _customvar1 somevalue
    _snmp_community公共
    }

    取消字符串值的繼承

    在某些情況下,您可能不希望主機,服務或聯系人定義從它們引用的模板繼承字符串變量的值。在這種情況下,可以將“ null ”(不帶引號)指定為您不想繼承的變量的值。請看以下示例:

    定義主機{
    event_handler我的事件處理程序命令
    名稱通用主機模板
    寄存器0
    }

    定義主機{
    host_name bighost1
    地址192.168.1.3
    event_handler null
    使用generichosttemplate
    }

    在這種情況下,主機bighost1不會繼承的值event_handler是在所定義的變量generichosttemplate。得到的bighost1的有效定義如下:

    定義主機{
    host_name bighost1
    地址192.168.1.3
    }

    字符串值的加性繼承

    Nagios Core優先使用局部變量,而不是從模板繼承的值。在大多數情況下,局部變量值會覆蓋模板中定義的值。在某些情況下,允許Nagios Core一起使用繼承變量局部變量的值是有意義的。

    可以通過在局部變量值前加一個加號(+)來實現這種“附加繼承” 。此功能僅適用于包含字符串值的標準(非自定義)變量。請看以下示例:

    定義主機{
    主機組所有服務器
    名稱通用主機模板
    寄存器0
    }

    定義主機{
    host_name linuxserver1
    主機組+ Linux服務器,Web服務器
    使用generichosttemplate
    }

    在這種情況下,主機linuxserver1將其本地hostgroups變量的值附加到generichosttemplate的值之后。結果是linuxserver1的有效定義如下:

    定義主機{
    host_name linuxserver1
    主機組所有服務器,Linux服務器,Web服務器
    }

    隱式繼承

    通常,您必須在對象定義中顯式指定必需變量的值,或者從模板繼承它。該規則有一些例外,Nagios將假定您要使用的值來自相關對象。例如,如果沒有另外指定,則將從與服務相關聯的主機中復制某些服務變量的值。

    下表列出了如果未在對象定義中顯式指定值或從模板繼承它們,則將從相關對象隱式繼承的對象變量。例如,如果將聯系人添加到服務,它將不再從主機繼承聯系人或contact_groups。

    對象類型 對象變量 隱含來源
    服務 聯絡人 關聯主機定義中的聯系人
    contact_groups 關聯主機定義中的contact_groups
    notification_interval 相關主機定義中的notification_interval
    notification_period 關聯主機定義中的notification_period
    主機升級 contact_groups 關聯主機定義中的contact_groups
    notification_interval 相關主機定義中的notification_interval
    escalation_period 關聯主機定義中的notification_period
    服務升級 contact_groups 關聯服務定義中的contact_groups
    notification_interval 相關服務定義中的notification_interval
    escalation_period 相關服務定義中的notification_period

    升級中的隱式/加性繼承

    服務和主機升級定義可以利用特殊規則,該規則結合了隱式繼承和加性繼承的功能。如果升級1)不從另一個升級模板繼承其contact_groupscontacts指令的值,并且2)他們的contact_groupscontacts指令以加號(+)開頭,則其相應主機或服務定義的contact_groupscontacts指令的值將在加性繼承邏輯中使用。

    這是一個例子:

    定義主機{
    名稱linux服務器
    contact_groups linux-admins

    }

    定義主機升級{
    host_name linux服務器
    contact_groups +管理

    }

    這等效于簡單得多:

    定義主機升級{
    host_name linux服務器
    contact_groups linux-admins,管理

    }

    重要價值

    服務模板可以利用特殊的規則,該規則優先于它們的check_command值。如果check_command帶有感嘆號(!)前綴,則模板的check_command被標記為重要,并將在為該服務定義的check_command上使用(此樣式采用CSS語法,使用!作為重要屬性)。

    為什么這有用?當為分布式系統設置不同的check_command時,它主要有用。您可能需要設置新鮮度閾值和一個check_command,以強制服務進入失敗狀態,但這不適用于常規模板系統。使用此重要標志可以編寫自定義的check_command,但是在中央Nagios服務器上使用時,可以使用通用的分布式模板來否決check_command。

    例如:

    #掌握
    定義服務{
    分布式名稱服務
    寄存器0
    active_checks_enabled 0
    check_freshness 1
    check_command !set_to_stale
    }

    #在奴隸上
    定義服務{
    分布式名稱服務
    寄存器0
    active_checks_enabled 1
    }

    #服務定義,由主服務器和從服務器使用
    定義服務{
    host_name host1
    service_description服務A
    check_command check_http …
    使用服務分布式

    }

    多個繼承源

    到目前為止,所有繼承示例都顯示了僅從單個來源繼承變量/值的對象定義。您還可以從多個來源繼承變量/值以進行更復雜的配置,如下所示。

    #通用主機模板
    定義主機{
    名稱 泛型主機
    active_checks_enabled 1
    check_interval 10

    寄存器0
    }

    #開發Web服務器模板
    定義主機{
    名稱 開發服務器
    check_interval 15
    notification_options d,u,r

    寄存器0
    }

    #開發Web服務器
    定義主機{
    使用 通用主機,開發服務器
    host_name devweb1

    }

    多個繼承源

    在上面的示例中,devweb1從兩個來源繼承了變量/值:generic-hostdevelopment-server。您會注意到在兩個源中都定義了一個check_interval變量。由于generic-hostdevweb1use指令中指定的第一個模板,因此devweb1主機將繼承其check_interval變量的值。繼承后,devweb1的有效定義如下:

    #開發Web服務器
    定義主機{
    host_name devweb1
    active_checks_enabled 1
    check_interval 10
    notification_options d,u,r

    }

    具有多個繼承源的優先級

    當您使用多個繼承源時,了解Nagios如何處理在多個源中定義的變量很重要。在這些情況下,Nagios將使用use指令中指定的第一個來源中的變量/值。由于繼承源本身可以從一個或多個其他源繼承變量/值,因此弄清楚哪些變量/值對具有優先權會很棘手。

    考慮以下引用了三個模板的主機定義:

    #開發Web服務器
    定義主機{
    使用 1,4,8
    host_name devweb1

    }

    如果其中一些引用的模板本身從一個或多個其他模板繼承變量/值,則優先規則顯示在右側。

    測試,試驗和錯誤將幫助您更好地了解事物在類似復雜繼承情況下的工作方式。

    本文章首發在 網安wangan.com 網站上。

    上一篇 下一篇
    討論數量: 0
    只看當前版本


    暫無話題~
    亚洲 欧美 自拍 唯美 另类