Вступление
Большая часть работы системного администратора собирает точную информацию о ваших серверах и инфраструктуре. Существует ряд инструментов и опций для сбора и обработки информации такого типа. Многие из них основаны на технологии под названием * 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 +
, вы можете извлекать данные и манипулировать ими различными способами. Создавая сценарии этих действий или используя эти утилиты в приложениях, вы можете создавать сложные среды мониторинга и управления.