Un de mes clients souhaitait pouvoir donner un aperçu des services d’accès client sur son infrastructure Exchange Server 2013 en utilisant la supervision proposée par System Center Operations Manager. Avec Exchange Server 2010, Microsoft avait créé un service de corrélation pour permettre d’agréger et donner une vue d’ensemble de l’état de santé d’une organisation Exchange distribuée. Ce service de corrélation constituait un point faible et Microsoft a choisi d’intégrer l’intelligence directement dans Exchange Server 2013 via Managed Availability. Ce composant présente directement l’état de l’infrastructure qui peut être utilisé par SCOM afin d’alerter correctement.
En dépilant le Management Pack, j’ai vu que Microsoft avait créé des objets d’une classe appelée Health Set pour les différents composants (IMAP, POP, protocole, etc…). Lorsque, j’ai souhaité créer une application distribuée pour agréger l’état des différents composants, j’ai découvert que Microsoft avait créé un moniteur agrégé (Custom) au plus haut de la hiérarchie de santé. Ce dernier n’était donc pas lier aux 4 moniteurs proposés par défaut (Availability, Performance, Configuration, Security). Cet article va vous aider à pallier aux limites de la console d’administration pour créer une application distribuée qui agrège les états provenant d’une hiérarchie de moniteur personnalisée.
Commencez par créer votre application distribuée le plus simplement du monde sur la base du modèle Blank. Rappel : Stockez votre application distribuée dans un Management Pack non scellé dédié à cet effet. Ajoutez un composant que vous nommerez comme souhaité. Cliquez ensuite sur Advanced Search. Dans Search for, sélectionnez la classe Health Set, puis ajoutez les éléments souhaités :
Cliquez droit sur les objets et sélectionnez Add To component puis le nom du composant créé (dans mon cas POP)
Quand on regarde de plus près, l’interface ne propose la configuration du cumul (Rollup) uniquement pour les 4 moniteurs par défaut
Sauvegardez l’application distribuée.
Jusque-là tout va bien ! Maintenant si vous attendez que l’état remonte, celui-ci ne sera jamais agrégé car par défaut l’assistant créé les blocs de code en utilisant les 4 moniteurs agrégés par défaut. (Availability, Performance, Configuration, Security)
Vous devez donc exporter le Management Pack créé (Vue Administration – Management Packs).
Une fois exportée, ouvrez-le avec votre éditeur de texte préféré.
Voici les grandes étapes :
- Ajout d’un moniteur personnalisé
- Ajout du Display String associé au Moniteur
- Modification de la découverte du Composant pour faire référence à la classe du moniteur
- Modification de la relation
Commencez par rajouter la référence au Management Pack que vous souhaitez agréger :
Une fois la référence ajoutée, identifiez le bloc <Monitors></Monitors>. Copiez collé un des moniteurs dépendants comme exemple. Effectuez les modifications suivantes :
- Changez la valeur de la balise Category en Custom
- Changez l’algorithme comme souhaité (WorstOf, BestOf…)
- Changez l’identifiant pour inclure la notion de Custom
- Modifiez l’attribut MemberMonitor. Ce dernier fait référence par défaut à un des moniteurs racines. Utilisez l’identifiant du moniteur personnalisé créé dans le Management Pack. Par exemple pour Exchange, cela donne ceci : MemberMonitor="Exchange!HealthSetUnitMonitor"
Vous pouvez trouver l’identifiant de deux façons : En descellant le Management Pack ou en requêtant la base de données.
Le bloc devient ainsi :
<DependencyMonitor ID="SCIMembership_f15f1b91f958457494c40d5ba776f906_Custom_HealthMonitor" Accessibility="Public" Enabled="true" Target="SC_b22070c172ad4c10a8262b78c4477726_Service_58815ee81bcc4dd4ae70887423925a9c" ParentMonitorID="SystemHealthLibrary7084320!System.Health.AvailabilityState" Remotable="true" Priority="Normal" RelationshipType="SCIMembership_f15f1b91f958457494c40d5ba776f906" MemberMonitor="Exchange!HealthSetUnitMonitor">
<Category>Custom</Category>
<Algorithm>WorstOf</Algorithm>
</DependencyMonitor>
Dans le bloc <DisplayStrings></DisplayStrings>, ajoutez le display string correspondant à cet ajout. Par exemple :
<DisplayString ElementID="SCIMembership_f15f1b91f958457494c40d5ba776f906_Custom_HealthMonitor">
<Name>Component Group Health Roll-up for type Object</Name>
<Description>The health of this Component is determined by the health of its members. This monitor rolls up health from each of the members of this Component.</Description>
</DisplayString>
Nous devons ensuite modifier la découverte pour référence à la classe correspondant au moniteur. Identifiez le bloc <Discoveries></Discoveries>. Reperez la découverte correspondant au composant puis dans le bloc, changez la valeur du blog MonitoringClass en spécifiant la classe correspondant au moniteur
Par exemple :
<Discovery ID="SC_b22070c172ad4c10a8262b78c4477726_Service_58815ee81bcc4dd4ae70887423925a9c_ItemPopulation" Enabled="true" Target="SC_b22070c172ad4c10a8262b78c4477726_Service_58815ee81bcc4dd4ae70887423925a9c" ConfirmDelivery="false" Remotable="true" Priority="Normal">
<Category>Discovery</Category>
<DiscoveryTypes />
<DataSource ID="DS" TypeID="SystemCenter!Microsoft.SystemCenter.GroupPopulator">
<RuleId>$MPElement$</RuleId>
<GroupInstanceId>$Target/Id$</GroupInstanceId>
<MembershipRules>
<MembershipRule> <MonitoringClass>$MPElement[Name="Exchange!Microsoft.Exchange.15.HealthSet"]$</MonitoringClass>
<RelationshipClass>$MPElement[Name="SCIMembership_f15f1b91f958457494c40d5ba776f906"]$</RelationshipClass>
<IncludeList>
<MonitoringObjectId>{9dd75ea2-49cb-be61-6aa2-a3b1761e8b17}</MonitoringObjectId>
<MonitoringObjectId>{ea079083-81e5-e785-ad9d-a1452162fb7c}</MonitoringObjectId>
<MonitoringObjectId>{ef8d8582-a1cb-f611-06ff-f22925bb9cde}</MonitoringObjectId>
<MonitoringObjectId>{0dc5911b-69a1-f5ce-11e8-07230b91e3f4}</MonitoringObjectId>
<MonitoringObjectId>{f70989a2-fab6-018d-0724-30ee4031f253}</MonitoringObjectId>
</IncludeList>
</MembershipRule>
</MembershipRules>
</DataSource>
</Discovery>
Dernière étape, vous devez modifier le type relationnel et la classe de destination. Repérez le bloc <RelationShipTypes> et le type de relation correspondant (avec les identifiants). Dans la balise Target, changez l’attribut Type par la classe :
<RelationshipType ID="SCIMembership_f15f1b91f958457494c40d5ba776f906" Accessibility="Public" Abstract="false" Base="SystemLibrary7585010!System.Containment">
<Source ID="source" MinCardinality="0" MaxCardinality="2147483647" Type="SC_b22070c172ad4c10a8262b78c4477726_Service_58815ee81bcc4dd4ae70887423925a9c" />
<Target ID="target" MinCardinality="0" MaxCardinality="2147483647" Type="Exchange!Microsoft.Exchange.15.HealthSet" />
</RelationshipType>
Enregistrez le fichier puis réimportez-le dans votre Management Group. Attendez que l’état soit recalculé. Cela peut prendre plusieurs minutes en fonction de la charge de l’infrastructure.
Télécharger le Management Pack d'exemple : ICI