Remarque: cet article avait été publié alors qu'il n'avait pas été écrit. Toutes mes excuses pour le désagrément. Voici la bonne version.

Si vous ne connaissez pas l'héritage multiple, il vous faut d'abord l'apprendre. Uns fois cette étape passée, vous pouvez lire ce billet.

Ce qu'il y a de bien avec l'héritage c'est l'éternelle discussion: "pour ou contre l'héritage multiple?". Le but ici n'est pas d'être pour ou contre (bien au contraire!) mais de vivre avec son temps. Nagios versions 1.x et 2.x ne supportaient pas l'héritage multiple. Nagios 3 le supporte. Il est toujours possible d'interdire à tout le monde d'utiliser l'héritage multiple mais autant savoir les apports de cette technique pour pouvoir la critiquer plus facilement ;-) .

L'héritage multiple permet d'hériter de plusieurs modèles. Auparavant, Nagios ne supportait pas l'héritage multiple. Ce qui avait pour inconvénient une double écriture de paramètres de configuration à certains endroits. C'était le cas notamment pour les services, sur des configurations avancées avec de nombreux modèles de service. Surtout, cela avait pour inconvénient d'être moins parlant au niveau configuration. Un exemple? Admettons que l'on définisse une stratégie de configuration poussée. Plusieurs modèles de services sont définis: un modèle standard , un modèle Linux, un modèle Windows, un modèle AIX, ... Puis ensuite, on définit les modèles de service Linux_Cpu_Usage, Windows_Cpu_Usage et Aix_Cpu_Usage vérifiant le taux d'occupation du CPU sur l'OS considéré et testés toutes les 15 minutes. Puis, les modèles Linux_Process_Status, Windows_Process_Status et Aix_Process_Status vérifient la présence d'un processus sur l'OS considéré. Ceux là doivent être testés toutes les 5 minutes. Comment définir cela en Nagios 2.x? Comme ça:

define service{
   register   0
   name       standard
   .... # tous paramètres par défaut
}

define service{
   register        0
   use             standard
   name            Windows
   contact_groups  Windows
}

define service{
   register        0
   use             standard
   name            Linux
   contact_groups  Linux
}

define service{
   register        0
   use             standard
   name            Aix
   contact_groups  Aix
}

define service{
   register        0
   use             Aix
   name            Aix_Cpu_Usage
   check_command   ...
   normal_check_interval 15
}

define service{
   register        0
   use             Linux
   name            Linux_Cpu_Usage
   check_command   ...
   normal_check_interval 15
}

define service{
   register        0
   use             Windows
   name            Windows_Cpu_Usage
   check_command   ...
   normal_check_interval 15
}

define service{
   register        0
   use             Aix
   name            Aix_Process_Status
   check_command   ...
   normal_check_interval 5
}

define service{
   register        0
   use             Linux
   name            Linux_Process_Status
   check_command   ...
   normal_check_interval 5
}

define service{
   register        0
   use             Windows
   name            Windows_Process_Status
   check_command   ...
   normal_check_interval 5
}

Et alors? me direz vous! C'est simple: il est très facile de se tromper... et d'oublier sur un des templates de plus bas niveau que le test doit être effectué toutes les 5 minutes. Il est plus parlant et moins risqué de faire ceci:

define service{
   register        0
   name            Cpu_Usage
   normal_check_interval 15
}

define service{
   register        0
   name            Process_Status
   normal_check_interval 5
}

define service{
   register        0
   use             Aix, Cpu_Usage
   name            Aix_Cpu_Usage
   check_command   ...
}

define service{
   register        0
   use             Linux, Cpu_Usage
   name            Linux_Cpu_Usage
   check_command   ...
}

define service{
   register        0
   use             Windows, Cpu_Usage
   name            Windows_Cpu_Usage
   check_command   ...
}

define service{
   register        0
   use             Aix, Process_Status
   name            Aix_Process_Status
   check_command   ...
}

define service{
   register        0
   use             Linux, Process_Status
   name            Linux_Process_Status
   check_command   ...
}

define service{
   register        0
   use             Windows, Process_Status
   name            Windows_Process_Status
   check_command   ...
}

Avec cette stratégie de configuration, il est simple de ne pas se tromper. En documentant cette méthode, les utilisateurs sont habitués à écrire tout le temps la même chose. Il n'ont qu'une question à se poser pour l'héritage: Quel OS? et Quel type d'indicateur?. Facile non? Merci Nagios!

L'héritage multiple est une bonne chose s'il est correctement intégré à la stratégie de configuration. Faire de l'héritage multiple pour faire de l'héritage multiple n'est pas utile. J'ai montré un exemple où il est intéressant de l'utiliser. Étant donné que nous sommes aux tous premiers pas de Nagios 3, il est très probable que d'autres apports positifs vont être identifiés avec cette nouvelle fonctionnalité.