Сбор точной информации о серверах и инфраструктуре – очень важный аспект системного администрирования. Существует множество инструментов для сбора и обработки таких данных, и многие их них основаны на технологии SNMP.
SNMP (Simple Network Management Protocol) – это средство, с помощью которого серверы могут обмениваться информацией о своем текущем состоянии, а также канал, по которому администратор может управлять параметрами сервера. Сам протокол SNMP очень простой, однако структура программ, реализующих SNMP, может быть очень сложной.
Читайте также:
Данное руководство научит вас работать с набором инструментов net-snmp.
Примечание: Подразумевается, что вы выполнили руководство Установка и настройка демона и клиента SNMP в Ubuntu 14.04.
Клиентские команды SNMP
Набор инструментов net-snmp содержит довольно много утилит, которые помогают выполнять запросы или настраивать значения OID на удаленных хостах. Большинство инструментов используют общий синтаксис и имеют схожие шаблоны использования. Рассмотрим основы некоторых наиболее популярных инструментов.
Примечание: Руководство подразумевает, что вы знакомы с командами аутентификации net-snmp. Все данные аутентификации в приведённых ниже командах обозначены как authentication_info.
В предыдущем руководстве вы создали файл snmp.conf с настройками клиента. Теперь его можно удалить: в этом руководстве вы научитесь добавлять данные аутентификации в конфигурационный файл.
Если у вас нет конфигурационного файла snmp.conf, замените authentication_info в каждой команде информацией для подключения к удалённому демону. Аккаунт demo использует следующие данные:
-u demo -l authPriv -a MD5 -x DES -A my_new_password -X my_new_password
Примечание: Если вы используете другой аккаунт, не забудьте откорректировать учётные данные.
Извлечение значения OID с помощью SnmpGet
Это, пожалуй, самая простая команда для извлечения информации с помощью SNMP. При помощи базовых флагов аутентификации команда snmpget может прочитать любое значение OID, к которому пользователь имеет доступ.
В базовом синтаксисе нужно указать известный числовой OID. К примеру, чтобы извлечь описание системы, нужно ввести:
snmpget authentication_info host 1.3.6.1.2.1.1.1.0
Поскольку в предыдущем руководстве на менеджер был установлен пакет snmp-mibs-downloader, вы также можете сослаться на OID по имени. К примеру, ту же информацию можно получить с помощью:
snmpget authentication_info host sysDescr.0
Извлечение следующего доступного OID с помощью SnmpGetNext
Эта команда извлекает значение OID, идущего после запрашиваемого OID. Иерархия MIB позволяет извлекать значения последовательно. Используя это свойство, вы можете получить значение (и метку OID) следующего объекта с помощью любого объекта в дереве.
Ранее вы получили описание системы. Теперь попробуйте узнать следующий OID и его значение. Для этого нужно использовать:
snmpgetnext authentication_info host sysDescr.0
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
Эта команда вернёт ObjectID системы, который является следующим объектом в дереве. Эту команду можно обновлять, указывая полученный OID, и таким образом получать доступ к следующему объекту.
snmpgetnext authentication_info host sysObjectID.0
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (114216) 0:19:02.16
Извлечение раздела иерархии MIB с помощью SnmpWalk
С помощью команды snmpwalk можно получить доступ ко всем OID, которые подчиняются заданному OID. Эта команда выведет целое дерево, которое принадлежит указанной точке.
К примеру, чтобы получить все значения в точке system, нужно ввести:
snmpwalk authentication_info host 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: admin@example.com
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 authentication_info host .
Она выведет всё доступное текущему пользователю дерево.
Эта команда в сочетании с grep позволяет искать OID по имени. Предположим, вы знаете, что OID с именем sysUpTime.0 выдает время работы SNMP на удалённых хостах, но вы также хотите узнать, как давно работает сам сервер.
Команда snmpwalk может вывести всю иерархию объектов OID, а затем grep отфильтрует их по слову «uptime» в имени. Флаг –i отключает чувствительность к регистру.
snmpwalk authentication_info host . | 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
HOST-RESOURCES-MIB::hrSystemUptime.0 = Timeticks: (9741455) 1 day, 3:03:34.55
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 authentication_info host hrSystemUptime.0
HOST-RESOURCES-MIB::hrSystemUptime.0 = Timeticks: (9795352) 1 day, 3:12:33.52
Преобразование числовых OID в буквенные с помощью snmptranslate
Утилита 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. Наиболее распространённые флаги для форматирования вывода:
Флаг | Описание | Пример |
-Oa | Отображает строки ASCII | SNMPv2-MIB::sysDescr.0 |
-Of | Показывает полный текстовый путь к OID | .iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0 |
-On | Показывает полный числовой путь к OID | .1.3.6.1.2.1.1.1.0 |
-Os | Отображает конечное текстовое представление OID | sysDescr.0 |
Эти опции применимы и к некоторым другим инструментам набора.
Извлечение табличных данных с помощью SnmpTable
SNMP хранит и табличные данные. Команда snmpwalk может отобразить любые необходимые данные, однако она не всегда сохраняет форматирование.
К примеру, так snmpwalk покажет OID udpTable:
snmpwalk authentication_info host 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 authentication_info host udpTable
Вы получите таблицу:
udpLocalAddress udpLocalPort
0.0.0.0 161
0.0.0.0 35679
С такими данными гораздо удобнее работать.
Изменение значений с помощью SnmpSet
Эта команда используется для записи значения в OID. Все предыдущие команды предназначены для получения информации, а эта команда используется для изменения данных на хосте.
Синтаксис команды snmpset почти такой же, как у других команд, однако этой команде необходима дополнительная информация, чтобы установить значение.
Базовый синтаксис:
snmpset authentication_info host OID_to_modify data_type new_value
Синтаксис довольно прост и понятен, но типы данных требуют более подробного объяснения. Каждый тип представлен одним символом. Доступны следующие типы данных:
- i (Integer): целое число.
- u (Unsigned integer): целое число без знака.
- s (String): строка.
- x (Hexadecimal string): шестнадцатеричная строка.
- d (Decimal string): десятеричная строка.
- n (Null object): объект Null.
- (Object ID): ID объекта.
- t (Time ticks): отметки времени.
- a (IP Address): IP-адрес.
- b (Bits): биты.
Пакет 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
Перейдите на менеджер и установите Earth в качестве значения OID sysLocation. Параметр s задаёт тип данных (строки).
snmpset authentication_info host sysLocation.0 s "Earth"
SNMPv2-MIB::sysLocation.0 = STRING: Earth
Теперь проверьте, сможет ли спецификатор типа = правильно установить тип значения.
snmpset authentication_info host sysLocation.0 = "New York City"
SNMPv2-MIB::sysLocation.0 = STRING: New York City
Как видите, спецификатор = работает правильно.
Отправка запросов с помощью SnmpBulkGet и SnmpBulkWalk
При повторном запуске команд snmpget и snmpwalk можно создать большое количество сетевого трафика.
Команды snmpbulkget и snmpbulkwalk устраняют эту проблему; они собирают все возвращаемые значения в одну транзакцию вместо того, чтобы отправлять каждое значение OID в отдельной транзакции.
Передайте команде snmpbulkget один или несколько OID или веток, и вы получите пакет значений дополнительных OID.
snmpbulkget authentication_info host 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 – надёжное и гибкое средство для извлечения и управления данных. С помощью этих утилит вы можете создать сложную среду для мониторинга и управления серверами.