Chapitre 58. Héritage d'objet

Introduction

Cette documentation essaye d'expliquer l'héritage d'objet et comment il peut être utilisé dans vos définitions d'objet.

Si vous êtes perdu dans le fonctionnent des récurrences et des héritages après avoir lu cela, allez voir le ficher de configuration d'un objet simple proposé par la distribution Nagios. Si cela ne vous aide toujours pas, laissez un message mail à la liste de diffusion nagios-users avec une description détaillée de votre problème.

Les bases

Il y a trois variables qui affectent la récursion et l'héritage qui sont présentes dans toutes les définitions d'objet. Elles sont indiquées en rouge ci-dessous

define someobjecttype {
    object-specific variables ...
    name            template_name
    use             name_of_template_to_use
    register        [0/1]
}
        

La première variable est name. C'est le nom du gabarit qui peut être référencé dans d'autre définition d'objet, de manière à ce qu'ils héritent des propriétés/variables de cet objet.

La deuxième variable est use. C'est ici que vous spécifiez le nom des objets gabarit dont vous voulez hériter les propriétés/variables. Le nom que vous spécifiez dans cette variable doit être défini dans un autre gabarit d'objet nommé. (En utilisant la variable nom)

La troisième variable est register. Cette variable est utilisée pour indiquer si la définition de l'objet doit être prise en compte par Nagios ou non. Par défaut, toutes les défintions d'objet sont prise en compte. Si vous utilisez une définition d'objet partiel comme gabarit, vous voulez éviter qu'il soit prise en compte (Un exemple de ce mécanisme sera présentez plus loin). Les valeurs acceptées sont les suivantes : 0 = ne PAS prendre en compte la définition de l'objet, 1 = prendre en compte la définition de l'objet (Comportement par défaut). Cette variable n'est pas héritée, toutes définitions d'objet (partiel) utilisées comme gabarits doivent explicitement avoir le paramètre register à 0. Celà évite d'avoir à surcharger une directive register héritée avec la valeur 1 pour tous les objets qui doivent être pris en compte.

Variables locales vs Variables héritées

Une chose importante à comprendre avec l'héritage c'est que les variables locales ont toujours autorité sur les variables définies dans un gabarit d'objet. Regardez l'exemple suivant avec deux définitions d'hotes (toutes les variables nécessaires n'ont pas été indiquées)

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
}
        

Vous remarquerez que la définition de l'hôte bighost1 a été définie comme ayant hosttemplate1 comme nom de gabarit. La définition de l'hôte bighost2 utilise la définition de bighost1 comme gabarit. Une fois que Nagios traite les données, le résultat de la définition de l'hôte bighost2 sera équivalent à cette définition :

define host {
    host_name               bighost2
    check_command           check-host-alive
    notification_options    d,u,r
    max_check_attempts      3
}
        

Vous pouvez voir que les variables check_command et notification_options sont héritées du gabarit.( où l'hôte bighost1 a été défini). Cependant, les variables host_name et max_check_attempts n'ont pas été héritées du gabarit car elles sont définies localement. N'oubliez pas que les variables définies localement surchargent les variables qui devraient normalement être héritées du gabarit. C'est un concept assez facile à comprendre.

Si vous voulez qu'une variable d'une chaîne locale soit concaténée avec la valeur d'une chaîne héritée, vous pouvez le faire. Pour plus de renseignements sur comment réaliser ça, lisez plus bas.

Enchainement d'héritage

Les objets peuvent hériter des propriétés/variables de multiples niveaux des gabarits objets. Regardez l'exemple suivant :

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
}
        

Vous remarquerez que la définition de l'hôte bighost3 hérite des variables de la définition de l'hôte bighost2, qui lui-même hérite des variables de la définition de l'hôte bighost1. Une fois que Nagios a traité ces données de configuration, le résultat de la définition de ces hôtes est équivalent à :

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
}
        

Il n'y a pas de limite de profondeur d'héritage, mais vous voudrez probablement vous limitez à tout au plus quelques niveaux, de façon à garder votre santé mentale.

Utiliser des définitions incomplète d'objet comme gabarit

Il est possible d'utiliser une définition incomplète d'object comme gabarit afin de les utiliser dans d'autres définitions d'objets. Par définition incomplète, je veux dire que toutes les variables requises pour l'objet n'ont pas été mises dans la définition de l'objet. Celà peut paraître bizarre d'utiliser des définitions incomplètes comme gabarit, mais c'est en fait recommandé de les utiliser. Pourquoi? Et bien, ils servent d'ensemble par défaut afin d'être utilisés dans d'autres définitions d'objets. Regardez l'exemple suivant :

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
}
        

Notez que la 1er définition d'hotes est incomplète car il manque la variable requise host_name. Nous n'avons pas besoin de définir un nom d'hôte car nous voulons juste utiliser cette définition comme un gabarit d'hôte générique. Afin de prévenir cette defintion d'être registered par nagios comme un hôte normal, nous devons définir la variable register à 0.

La définition des hôtes bighost1 et bighost2 héritent leurs valeurs de la définition d'hôte générique. La seule variable que nous avons choisi de surcharger est la variable address. Celà veut dire que les deux hôtes auront exactement les mêmes propriétés, à l'exeption de leurs variables host_name et address. Une fois que Nagios aura traité les données de configuration de l'exemple, les définitions d'hôtes résultants seront la même chose que si nous spécifions :

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
}
        

Enfin, utiliser une définition de gabarit pour les variables par défaut vous fera gagner beaucoup de temps. Cela vous évitera aussi beaucoup de maux de tête ultérieurs si vous voulez changer la valeur par défaut d'une variable pour un grand nombre d'hôtes.

Variables personnalisées d'objet

Toutes les variables personnalisées d'objet que vous définisez dans vos définitions de gabarit d'hôtes, de services ou de contacts seront héritées comme n'importe quelle autre variable standard. Regardez l'exemple suivant :

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
}
        

L'hôte bighost1 va hériter de la variable personnalisée de l'hôte _customvar1 et _snmp_community, aussi bien que de leur valeurs respectives de la définition du generichosttemplate. Le résultat effectif est une définition pourbighost1 qui ressemble à ça :

define host {
    host_name               bighost1
    address                 192.168.1.3
    _customvar1             somevalue
    _snmp_community         public
}
        

Annulation de l'héritage de la valeur de la chaîne

Dans certains cas, vous ne voulez pas que votre défintion d'hôte, service ou contact hérite de la valeur d'une variable du gabarit qu'il référence. Dans ce cas, vous pouvez spécifier null (sans quotes) comme valeur pour cette variable. Regardez l'exemple suivant :

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
}
        

Dans ce cas, l'hôte bighost1 n'héritera pas de la valeur de la variable event_handler qui est définie dans generichosttemplate. Le résultat effectif de la définition de bighost1 est :

define host {
    host_name               bighost1
    address                 192.168.1.3
}
        

Héritage additif de la valeur de la chaîne

Nagios donne la préférence aux variables locales au lieu des valeurs héritées par leurs gabarits. Dans la pluspart des cas, les valeurs locales des variables surchargent celles définies dans les gabarits. Dans certains cas, il peut être judicieux d'autoriser Nagios d'utiliser la valeur locale et héritée de la variable ensemble.

Cet héritage additif peut être réalisé en rajoutant devant la valeur de la variable local un signe plus (+). Cette fonctionnalité est uniquement accessible pour les variables standards (non-personnels) qui contiennent des valeurs sous forme de chaîne. Regardez l'exemple suivant :

define host{
    hostgroups              all-servers
    name                    generichosttemplate
    register                0
}

define host {
    host_name               linuxserver1
    hostgroups              +linux-servers,web-servers
    use                     generichosthosttemplate
}
        

Dans ce cas, l'hôte linuxserver1 va ajouter la valeur de sa variable hostgroups local, à celui du generichosttemplate. Le résultat effectif de la définition de linuxserver1 est le suivant :

define host {
    host_name       linuxserver1
    hostgroups      all-servers,linux-servers,web-servers
}
        

Héritage implicite

Normalement vous devez soit explicitement spécifier la valeur de la variable dans la définition d'un objet, ou bien l'hériter d'un gabarit. Il existe quelques exceptions à cette règle, où Nagios assumera que vous voulez utiliser une valeur qui vient en fait d'un objet lié. Par exemple, la valeur de certaines variables de service vont être copiées de l'hôte auquel le service est associé si vous ne lui spécifiez pas le contraire.

Les tableaux suivants listent les variables d'objet qui seront implicitement héritées par des objets liés, si vous spécifiez pas explicitement leurs valeurs dans votre définition d'objet ou dans son gabarit.

Object Type

Variable Objet

Source implicite

Services

contact_groups

contact_groups dans la définition d'hôtes associée

notification_interval

notification_interval dans la définition d'hôtes associée

notification_period

notification_period dans la définition d'hôtes associée

Escalade d'hôtes

contact_groups

contact_groups dans la définition d'hôtes associée

notification_interval

notification_interval dans la définition d'hôtes associée

escalation_period

notification_period dans la définition d'hôtes associée

Escalade de Services

contact_groups

contact_groups dans la définition de services associée

notification_interval

notification_interval dans la définition de services associée

escalation_period

notification_period dans la définition de services associée

Héritage Implicite/Additive dans les escalades

La superposition de défintion d'hôte et de service peuvent utiliser une règle spéciale qui combine les fonctionnalités de l'héritage implicite et explicite. Si la superposition 1) n'hérite pas la valeurs de leurs paramètres contact_groups ou contacts d'un autre gabarit et 2) leurs paramètres contact_groups ou contacts commencent avec un signe (+), alors les valeurs des paramètres contact_groups ou contacts de leurs défintions d'hôte ou service seront utilisées avec une logique d'héritage additive.

Perdu ? Voici un exemple :

define host {
    name            linux-server
    contact_groups  linux-admins
    ...
}

define hostescalation {
    host_name       linux-server
    contact_groups  +management
    ...
}
        

C'est un équivalent beaucoup plus simple que :

define hostescalation {
    host_name       linux-server
    contact_groups  linux-admins,management
    ...
}
        

Multiples sources d'héritage

Jusqu'à maintenant, tous les exemples d'héritage présentaient l'héritage de variables/valeurs à partir d'une seule source. Vous pouvez aussi hériter des variables/valeurs de sources multiples pour réaliser des configurations plus complexes, comme cela est présenté ci-dessous.

#Generic host template
define 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
    ...     
}
                            

Multiple templates 1

Dans l'exemple ci-dessous, devweb1 hérite de variables/valeurs provenant de deux sources : generic-host et development-server. Vous noterez qu'une variable check_interval est définie dans les deux sources. Puisque generic-host était le premier gabarit spécifié dans les paramètres de devweb1, sa valeur pour la variable check_interval est héritée par l'hôte devweb1. Après l'héritage, la définition effective de devweb1 est la suivante :

# Development web server

define host {
    host_name               devweb1
    active_checks_enabled   1
    check_interval          10
    notification_options    d,u,r
    ...
}
        

Priorité avec des sources d'héritage multiples

Quand vous utilisez de multiples sources d'héritage, il est très important de savoir comment Nagios gère les variables qui sont définies dans ces sources multiples. Dans ces cas, Nagios utilisera les variables/valeurs de la première source qui est spécifiée dans le paramètre à utiliser. Puisque les sources d'héritage peuvent elles-même hériter de variables/valeurs provement d'une ou plusieurs sources, il peut devenir très compliqué de trouver quelle paire de variable/valeur aura la priorité.

Regardez la définition d'hôte suivant qui se réfère à trois gabarits.

# Development web server
define host {
    use         1, 4, 8
    host_name   devweb1
    ...
}
                                

Si certains des gabarits héritent eux-même de variables/valeurs de un ou plusieurs autre gabarits, les règles de priorité sont montrées à droite.

Tests, essais et erreurs vous aideront à mieux comprendre exactement comment les choses fonctionnent dans une situation d'héritage complexe comme celle-ci :-)

Multiple Templates 2