| Наверное, самый популярный вопрос касательно OpsMgr: “Для многих програмных продуктов существуют менеджмент паки, как же быть с устройствами?”. Действительно, когда речь заходит об устройствах выбор готовых пакетов достаточно невелик. В основном он сводится к продуктам Quest или Jalasoft. Я не хочу сказать ничего плохого об этих производителях, их решения вполне хороши, а Quest к тому же охватывает своими “расширениями” (management extensions) достаточно большое количество продуктов и устройств. |
Но у всех подобных продуктов есть одно общее свойство, которое делает их использование довольно затруднительным, особенно в России. Они весьма недешевы.
В случае множества устройств в сети организации и достаточно больших требований к функциональности (количеству наблюдаемых параметров) покупка подобных решений может быть оправдана. Но для десятка ИБП, пары маршрутизаторов и еще небольшого набора устройств, на которых нужно наблюдать лишь за базовыми параметрами, суммарная стоимость таких решений может быть черезмерной.~~~
Что же делать?
| Разрабатывать собственный менеджмент пак.
Мне нравятся решения с коннекторами (когда отдельное ПО “собирает” данные по SNMP и конвертирует эти данные в форму, “понятную” OpsMgr). Это позволяет заметно разгрузить RMS или агенты с которых запускаются SNMP-модули. Но написание коннекторов требует навыков программирования, а написание хороших коннекторов – хороших навыков и опыта программирования, поэтому мы ограничимся написанием менеджмент пака стандартными средствами. Для демонстрации я буду использовать ИБП компании APC, а конкретно – Symmetra. Потому что во-первых, ИБП данной компании широко распространены, во-вторых конкретно модели Symmetra обладают всеми нужными для демонстрации компонентами. Например, в них много |
отдельных батарей. Я не буду описывать все компоненты (написание модулей для них), а только опишу принципы и подходы с примерами, на базе которых можно будет впоследствии разрабатывать другие менеджмент паки для любых устройств, поддерживающих SNMP.
В первой части я покажу как создать классы и дискавери для них.
Классы
В классах OpsMgr для SNMP-устройств нет ничего особенного или отличного от классов для ПО, компонент ПО или компьютеров. У нас будет три класса:
- APC Device
- APC UPS Generic
- APC UPS Symmetra 3 Phase
<ClassType ID="OpsMgr.RU.APC.SNMP.APCDevice" Accessibility="Internal"
Abstract="false"
Base="SCNetDevLib!Microsoft.SystemCenter.NetworkDevice"
Hosted="false" Singleton="false" />
<ClassType ID="OpsMgr.RU.APC.SNMP.UPS.Generic" Accessibility="Internal" Abstract="false"
Base="OpsMgr.RU.APC.SNMP.APCDevice" Hosted="false" Singleton="false" />
<ClassType ID="OpsMgr.RU.APC.SNMP.APCDevice.Symmetra3phaseUPS" Accessibility="Internal"
Abstract="false" Base="SystemHardwareLibrary!System.HardwareEnclosure" Hosted="true"
Singleton="false" />
На что сразу нужно обратить внимание – класс APC UPS Symmetra 3 Phase
(OpsMgr.RU.APC.SNMP.APCDevice.Symmetra3phaseUPS) не наследуется ни из одного из двух
других классов, которые я создаю. Поэтому я делаю Hosting-зависимость отдельно.
<RelationshipType ID="OpsMgr.RU.APC.SNMP.APCDevice.Hosts.Symmetra3phaseUPS"
Accessibility="Internal" Abstract="false" Base="System!System.Hosting"> <Source>OpsMgr.RU.APC.SNMP.UPS.Generic</Source> <Target>OpsMgr.RU.APC.SNMP.APCDevice.Symmetra3phaseUPS</Target>
</RelationshipType>
Теперь нам нужно создать правило для дискавери. Сначала мы подготовимся и создадим композитный источник данных, который будем использовать:
<DataSourceModuleType ID="OpsMgr.RU.APC.SNMP.QuerySysOID.DataSource"
Accessibility="Internal" Batching="false">
<Configuration>
<xsd:element minOccurs="1" name="IP" type="xsd:string" />
<xsd:element minOccurs="1" name="CommunityString" type="xsd:string" />
<xsd:element minOccurs="1" name="ClassId" type="xsd:string" />
<xsd:element minOccurs="1" name="Pattern" type="xsd:string" />
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="IP" Selector="$Config/IP$" ParameterType="string" />
<OverrideableParameter ID="CommunityString" Selector="$Config/CommunityString$" ParameterType="string" />
<OverrideableParameter ID="DiscoveredClass" Selector="$Config/ClassId$" ParameterType="string" />
<OverrideableParameter ID="Pattern" Selector="$Config/Pattern$" ParameterType="string" />
</OverrideableParameters>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<DataSource ID="DS" TypeID="SystemSnmpLibrary!System.SnmpQueryProvider">
<Interval>15</Interval>
<IsWriteAction>true</IsWriteAction>
<IP>$Config/IP$</IP>
<CommunityString>$Config/CommunityString$</CommunityString>
<SnmpVarBinds>
<SnmpVarBind>
<OID>1.3.6.1.2.1.1.2.0</OID>
<Syntax>0</Syntax>
<Value VariantType="8" />
</SnmpVarBind>
</SnmpVarBinds>
</DataSource>
<ConditionDetection ID="FIlteredMapper" TypeID="System!System.Discovery.FilteredClassSnapshotDataMapper">
<Expression>
<RegExExpression>
<ValueExpression>
<XPathQuery>/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
</ValueExpression>
<Operator>ContainsSubstring</Operator>
<Pattern>$Config/Pattern$</Pattern>
</RegExExpression>
</Expression>
<ClassId>$Config/ClassId$</ClassId>
<InstanceSettings>
<Settings>
<Setting>
<Name>$MPElement[Name="SCNetDevLib!Microsoft.SystemCenter.NetworkDevice"]/IPAddress$</Name>
<Value>$Data/Source$</Value>
</Setting>
<Setting>
<Name>$MPElement[Name="System!System.Entity"]/DisplayName$</Name>
<Value>$Data/Source$</Value>
</Setting>
</Settings>
</InstanceSettings>
</ConditionDetection>
</MemberModules>
<Composition>
<Node ID="FIlteredMapper">
<Node ID="DS" />
</Node>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>System!System.Discovery.Data</OutputType>
</DataSourceModuleType>
Композитный модуль состоит из трех частей (модулей). Первый (System.Snmp.Query) запрашивает по SNMP данные, содержащиеся в SystemOID, второй (System.Discovery.FilteredClassSnapshotDataMapper) проверяет содержится ли в полученных первым модулем данных некая строка (конкретный паттерн указывается уже в правиле для дискавери) и если содержится – конвертирует SNMP-данные в данные для дискавери-пакета.
Теперь на базе этого композитного модуля напишем правило для дискавери:
<Discovery ID="OpsMgr.RU.APC.SNMP.APCDevice.Discovery" Enabled="true"
Target="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"
ConfirmDelivery="true" Remotable="true" Priority="Normal">
<Category>Discovery</Category>
<DiscoveryTypes>
<DiscoveryClass TypeID="OpsMgr.RU.APC.SNMP.APCDevice" />
</DiscoveryTypes>
<DataSource ID="DS" TypeID="OpsMgr.RU.APC.SNMP.QuerySysOID.DataSource">
<IP>$Target/Property[Type="SCNetDevLib!Microsoft.SystemCenter.NetworkDevice"]/IPAddress$</IP>
<CommunityString>$Target/Property[Type="SCNetDevLib!Microsoft.SystemCenter.NetworkDevice"]/CommunityString$</CommunityString>
<ClassId>$MPElement[Name='OpsMgr.RU.APC.SNMP.APCDevice']$</ClassId>
<Pattern>1.3.6.1.4.1.318</Pattern>
</DataSource>
</Discovery>
В качестве паттерна указываем OID, который выделен для компании APC (он будет почти у всех устройств APC).
Теперь дискавери для трехфазного Symmetra:
<Discovery ID="OpsMgr.RU.APC.SNMP.APCDevice.Symmetra3phase.Discovery" Enabled="true"
Target="OpsMgr.RU.APC.SNMP.APCDevice" ConfirmDelivery="true" Remotable="true" Priority="Normal">
<Category>Discovery</Category>
<DiscoveryTypes>
<DiscoveryClass TypeID="OpsMgr.RU.APC.SNMP.APCDevice.Symmetra3phaseUPS" />
</DiscoveryTypes>
<DataSource ID="DS" TypeID="OpsMgr.RU.APC.SNMP.QuerySysOID.DataSource">
<IP>$Target/Property[Type="SCNetDevLib!Microsoft.SystemCenter.NetworkDevice"]/IPAddress$</IP>
<CommunityString>$Target/Property[Type="SCNetDevLIb!Microsoft.SystemCenter.NetworkDevice"]/CommunityString$
</CommunityString>
<ClassId>$MPElement[Name='OpsMgr.RU.APC.SNMP.APCDevice.Symmetra3phaseUPS']$</ClassId>
<Pattern>1.3.6.1.4.1.318.1.3.13</Pattern>
</DataSource>
</Discovery>
В качестве паттерна указываем OID класса Symmetra3phaseUPS.
Все OID вы можете найти в MIB-файлах или на интернет-ресурсах, таких как OIDView.com. Антон Гриценко написал хорошую статью об основах SNMP и о том как пользоваться MIB-браузером.