Как использовать Net-SNMP Tool Suite для управления и мониторинга серверов

Вступление

Большая часть работы системного администратора собирает точную информацию о ваших серверах и инфраструктуре. Существует ряд инструментов и опций для сбора и обработки информации такого типа. Многие из них основаны на технологии под названием * SNMP *.

SNMP обозначает простой протокол управления сетью. Это способ, которым серверы могут обмениваться информацией о своем текущем состоянии, а также канал, через который администратор может изменять предопределенные значения. Хотя сам протокол очень прост, структура программ, реализующих SNMP, может быть очень сложной.

В предыдущих руководствах мы обсуждали Основы протокола SNMP и https: // www. digitalocean.com/community/tutorials/how-to-install-and-configure-an-snmp-daemon-and-client-on-ubuntu-14-04, как установить и настроить компоненты SNMP на серверах Ubuntu 14.04]. В этом руководстве мы рассмотрим базовое использование многих инструментов, которые поставляются с набором + net-snmp +, с которым мы работали.

Мы обсудим, как использовать конфигурацию, которую мы настроили в последнем руководстве, для фактического сбора информации и манипулирования удаленными хостами. В этом руководстве предполагается, что у вас есть два хоста, настроенные так, как они были в конце https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-an-snmp-daemon-and- client-on-ubuntu-14-04 [руководство по установке и настройке].

Использование команд клиента SNMP

Набор инструментов + net-snmp +, который мы использовали, содержит довольно много утилит, которые полезны для запроса или установки значений OID на удаленных хостах. К счастью, большинство инструментов используют набор общего синтаксиса и имеют схожие схемы использования. Ниже мы рассмотрим основные способы использования некоторых из наиболее популярных.

Для целей данного руководства мы предполагаем, что вы знакомы с частью аутентификации, которая необходима для предоставления команд + net-snmp +. Мы будем ссылаться на всю информацию аутентификации как ++ в следующих разделах.

Если у вас есть https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-an-snmp-daemon-and-client-on-ubuntu-14-04#CreatingaClientConfigurationFile так, чтобы они установили настройка snmp.conf для вашего клиента], как обсуждалось здесь, вы можете удалить этот раздел команды, так как детали аутентификации будут считаны из вашего файла конфигурации.

Если у вас нет файла + snmp.conf, вам нужно будет заменить« информацию аутентификации »в каждой команде информацией, необходимой для подключения к вашему удаленному демону. Для учетной записи + demo +, которую мы настроили в этой серии, можно использовать следующие значения:

-u demo -l authPriv -a MD5 -x DES -A my_new_password -X my_new_password

Подставьте свои собственные значения при выполнении этих команд, если вы находитесь в другой среде.

Теперь, когда вы знаете детали аутентификации, которые вам понадобятся, давайте ознакомимся с некоторыми из доступных команд.

Получение значений OID с помощью SnmpGet

Это, вероятно, самая простая команда для запроса информации с использованием SNMP. Используя основные флаги аутентификации, которые обсуждались ранее, команда + snmpget + может использоваться для считывания значения любого OID, к которому у пользователя есть доступ.

Основное использование - указать известный числовой OID. Например, мы можем получить описание системы, набрав:

snmpget   1.3.6.1.2.1.1.1.0

Так как мы установили пакет + snmp-mibs-downloader + на нашем компьютере менеджера в последнем руководстве, мы также можем ссылаться на общие OID по их имени. Например, мы можем получить ту же информацию, набрав:

snmpget   sysDescr.0

Получение следующего доступного значения OID с SnmpGetNext

Эта команда используется для получения значения OID после указанного. Поскольку база данных MIB представляет собой доступную иерархию, ее значения можно извлекать последовательно. Используя это свойство, мы можем узнать значение (и метку OID) для следующего объекта из любого объекта в дереве.

Например, мы видели выше, как получить описание системы. Чтобы узнать следующий OID и его значение, мы можем вызвать ту же команду, но на этот раз с командой + snmpgetnext +:

snmpgetnext   sysDescr.0
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10

Это возвращает системный ObjectID, который является следующим последовательным объектом в дереве. Мы можем повторять это снова и снова, используя возвращенный OID для получения каждого последовательного объекта:

snmpgetnext   sysObjectID.0
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (114216) 0:19:02.16

Они могут использовать строковые идентификаторы или числовые идентификаторы, как и раньше.

Использование SnmpWalk для получения раздела иерархии MIB

Чтобы получить все OID под указанным OID, вы можете использовать команду + snmpwalk +. Это вернет все дерево, которое существует ниже указанной точки.

Например, мы можем получить все значения в части дерева + system +, набрав:

snmpwalk   system
SNMPv2-MIB::sysDescr.0 = STRING: Linux target 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (126926) 0:21:09.26
SNMPv2-MIB::sysContact.0 = STRING: [email protected]
SNMPv2-MIB::sysName.0 = STRING: target
SNMPv2-MIB::sysLocation.0 = STRING: Sitting on the Dock of the Bay
SNMPv2-MIB::sysServices.0 = INTEGER: 72
. . .

Эта команда работает, автоматически отправляя запросы SNMP getNext на хост, пока она не сможет построить все дерево ниже запрошенного значения.

Если вы хотите получить в основном все дерево MIB, вы можете выполнить команду в корне:

snmpwalk   .

Это вернет все дерево, которое доступно пользователю.

Это можно использовать вместе с + grep + для поиска определенных имен OID. Например, вы можете знать, что OID + sysUpTime.0 + возвращает длину, в течение которой демон SNMP работал на удаленных хостах, но вам может быть интересно узнать, как долго сам сервер был в сети.

Мы можем использовать команду + snmpwalk +, чтобы получить всю иерархию OID, а затем отфильтровать ее с помощью grep для поиска всего, что имеет «uptime» в имени. Мы будем использовать флаг + -i + для отключения чувствительности к регистру в нашем поиске:

snmpwalk   . | grep -i uptime

Вы получите ответ, который выглядит следующим образом:

DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (113856) 0:18:58.56
SNMPv2-MIB::sysORUpTime.1 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.2 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.3 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.4 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.5 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.6 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.7 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.8 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.9 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.10 = Timeticks: (0) 0:00:00.00

NOTIFICATION-LOG-MIB::nlmLogVariableID."default".1.1 = OID: DISMAN-EVENT-MIB::sysUpTimeInstance
NET-SNMP-AGENT-MIB::nsModuleName."".8.1.3.6.1.2.1.1.3.127 = STRING: mibII/sysUpTime

Попробовав несколько из этих значений, мы можем узнать, что OID + hrSystemUptime.0 + содержит правильное значение времени безотказной работы. Теперь, когда бы мы ни захотели узнать, сколько времени прошло с момента загрузки этой машины, мы можем использовать этот OID:

snmpget   hrSystemUptime.0
HOST-RESOURCES-MIB::hrSystemUptime.0 = Timeticks: (9795352) 1 day, 3:12:33.52

Как видите, + snmpwalk + может быть очень полезен для определения правильных OID для значений.

Переводите между числовыми и строковыми OID с SnmpTranslate

Одна из наиболее полезных команд в наборе фактически не связывается с удаленным хостом. Вместо этого это просто помогает нам находить информацию об иерархии MIB.

Используя утилиту + snmptranslate +, мы можем легко преобразовать числовые результаты в их текстовое представление:

snmptranslate 1.3.6.1.2.1.1.1.0
SNMPv2-MIB::sysDescr.0

Это дает модуль MIB, который определяет текстовое имя, и имя для самого OID.

Мы также можем использовать инструмент для перевода в другом направлении. Когда мы обнаружили текстовый MIB для времени работы системы (+ hrSystemUptime.0 +), нам, возможно, было любопытно, где находится дерево, которое было определено. Мы можем передать флаг + -On +, чтобы получить числовой адрес.

Не забудьте включить модуль MIB, который предоставляется каждый раз, когда вы получаете информацию об OID:

snmptranslate -On HOST-RESOURCES-MIB::hrSystemUptime.0
.1.3.6.1.2.1.25.1.1.0

Вы также можете использовать этот инструмент, чтобы получить много другой подробной информации о любой точке. Например, с флагом + -Td + вы можете получить полное описание с указанием пути внизу:

snmptranslate -Tp 1.3.6.1.2.1.1.1.0
SNMPv2-MIB::sysDescr.0
sysDescr OBJECT-TYPE
 -- FROM   SNMPv2-MIB
 -- TEXTUAL CONVENTION DisplayString
 SYNTAX    OCTET STRING (0..255)
 DISPLAY-HINT  "255a"
 MAX-ACCESS    read-only
 STATUS    current
 DESCRIPTION   "A textual description of the entity.  This value should
           include the full name and version identification of
           the system's hardware type, software operating-system,
           and networking software."
::= { iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) system(1) sysDescr(1) 0 }

Вы можете изменить способ отображения вывода, передав параметр + -O_ +, где «_» заменяется форматом вывода. Вы можете увидеть полный список в разделе «OUTPUT OPTIONS» справочной страницы + snmpcmd +, но некоторые из наиболее распространенных вариантов:

Output Flag Description Example

-Oa

Display in ASCII strings

SNMPv2-MIB::sysDescr.0

-Of

Display full textual path to OID

.iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0

-On

Display full numerical path to OID

.1.3.6.1.2.1.1.1.0

-Os

Display only the end textual OID representation

sysDescr.0

Обратите внимание, что описанные выше параметры форматирования также могут применяться с большинством других инструментов этого набора для форматирования вывода так, как вам бы хотелось.

Извлечение табличных данных с форматированным выводом с помощью SnmpTable

Некоторая информация, хранящаяся в SNMP, на самом деле является табличной. Хотя + snmpwalk + может отображать все релевантные данные, форматирование не подходит для некоторых целей.

Например, если мы используем + snmpwalk + в + udpTable + OID:

snmpwalk   udpTable

Мы бы получили это:

UDP-MIB::udpLocalAddress.0.0.0.0.161 = IpAddress: 0.0.0.0
UDP-MIB::udpLocalAddress.0.0.0.0.35679 = IpAddress: 0.0.0.0
UDP-MIB::udpLocalPort.0.0.0.0.161 = INTEGER: 161
UDP-MIB::udpLocalPort.0.0.0.0.35679 = INTEGER: 35679

Однако, если мы сделаем тот же запрос с + snmptable +:

snmptable   udpTable

Мы получили бы красиво отформатированную таблицу, например:

udpLocalAddress udpLocalPort
        0.0.0.0          161
        0.0.0.0        35679

Это намного приятнее форматирование и проще для человека читателя.

Изменение значений с помощью SnmpSet

Эта команда используется для записи значения в OID. Пока другие команды использовались для получения информации, эта команда используется для изменения данных на хосте.

Хотя команда + snmpset + наследует большую часть своего синтаксиса от других команд, она требует некоторой дополнительной информации для установки значений. Основной синтаксис выглядит так:

snmpset

Большинство из вышеперечисленных полей довольно очевидны. Однако типы данных требуют немного большего объяснения. Каждый тип представлен одним символом. Список возможных типов приведен ниже:

  • * i *: целое число

  • * u *: целое число без знака

  • * s *: строка

  • * x *: шестнадцатеричная строка

  • * d *: десятичная строка

  • * n *: нулевой объект

  • * o *: идентификатор объекта

  • * t *: Тики времени

  • * a *: IP-адрес

  • * b *: биты

Поскольку мы загрузили пакет + snmp-mibs-downloader +, большую часть времени вы можете просто набрать + = + вместо одного из идентификаторов типов.

Чтобы продемонстрировать эту команду, мы можем закомментировать одно из значений, установленных в нашем файле + snmpd.conf + на компьютере агента. Указание значений в файле конфигурации по существу жестко его кодирует, не позволяя вам изменять значение с помощью обычных методов SNMP.

На агентском компьютере откройте файл + / etc / snmp / snmpd.conf +:

sudo nano /etc/snmp/snmpd.conf

Закомментируйте директиву + sysLocation +:

sysLocation  Sitting on the Dock of the Bay

Сохраните и закройте файл. Теперь перезапустите сервис:

sudo service snmpd restart

Теперь с нашего компьютера управления мы можем установить для + sysLocation + OID значение “Земля”, набрав это. Обратите внимание на «s», который указывает, что тип данных является строкой:

snmpset   sysLocation.0 s "Earth"
SNMPv2-MIB::sysLocation.0 = STRING: Earth

Мы можем проверить, правильно ли спецификатор типа + = + установит тип значения, уточнив наше местоположение:

snmpset   sysLocation.0 = "New York City"
SNMPv2-MIB::sysLocation.0 = STRING: New York City

Он правильно интерпретировал наше значение как обычную строку.

Эффективное выполнение запросов с помощью SnmpBulkGet и SnmpBulkWalk

Отправка повторных запросов + snmpget + и + snmpwalk + может создать довольно много сетевого трафика при многократном использовании.

Чтобы сократить эту проблему, были созданы две сопутствующие команды + snmpbulkget + и + snmpbulkwalk +. Они будут упаковывать все возвращаемые значения в пределах одной транзакции, а не транзакции для каждого из возвращенных значений OID. Вы также можете передавать более одного OID одновременно.

Чтобы использовать + snmpbulkget, вы передаете один или несколько идентификаторов KID или веток, и вы получите столько значений для дополнительных идентификаторов, сколько уместится в пакете:

snmpbulkget   system
SNMPv2-MIB::sysDescr.0 = STRING: Linux target 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (429891) 1:11:38.91
SNMPv2-MIB::sysContact.0 = STRING: call now
SNMPv2-MIB::sysName.0 = STRING: target
SNMPv2-MIB::sysLocation.0 = STRING: New York City
SNMPv2-MIB::sysServices.0 = INTEGER: 72
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORID.1 = OID: SNMP-MPD-MIB::snmpMPDCompliance
SNMPv2-MIB::sysORID.2 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance

Следует отметить, что + snmpbulkget + работает как команда + snmpgetnext +, что означает, что она не учитывает объект, заданный в качестве аргумента. В приведенном выше примере вместо предоставления конкретного объекта мы предоставили ветвь. Вы можете думать о + snmpbulkget + как о вызове + snmpwalk +, но результаты будут в одном пакете.

Команда + snmpbulkwalk + работает аналогичным образом, но будет продолжать выполнять команды + BulkGet +, пока не будет извлечено все поддерево.

Заключение

Как вы можете видеть, используя пакет + net-snmp +, вы можете извлекать данные и манипулировать ими различными способами. Создавая сценарии этих действий или используя эти утилиты в приложениях, вы можете создавать сложные среды мониторинга и управления.

Related