Использование Net-SNMP и IPython

Используйте библиотеку Net-SNMP с привязками Python и IPython для интерактивного анализа состояние сети и управления системами, работающими под управлением ОС UNIX и Linux

Центры обработки и хранения данных, а также производственные предприятия используют протокол SNMP для управления сложной и разветвленной инфраструктурой. Теперь в библиотеке Net-SNMP появилась поддержка привязок Python™, в результате чего ее можно рекомендовать использовать при написании пользовательского кода, предназначенного для управления центром обработки и хранения данных, а также вспомогательных полнофункциональных систем управления сетью. Использование интерактивного инструмента IPython позволяет значительно упростить работу с таким сложным протоколом, как SNMP. Из данной статьи вы узнаете, как с помощью Net-SNMP, Python и оболочки IPython можно проводить анализ сети и управлять сетью в интерактивном режиме.

Ной Гифт, разработчик программного обеспечения, IBM  

Photo of Noah GIftНой Гифт (Noah Gift) – соавтор книги "Python For Unix and Linux" издательства O'Reilly. Он также является автором, докладчиком, консультантом и лидером сообщества, пишущим публикации для IBM developerWorks, Red Hat Magazine, O'Reilly и MacTech. Адрес сайта его консалтинговой компании - www.giftcs.com, адрес его персонального сайта - www.noahgift.com. В настоящий момент Ной также поддерживает сайт www.pyatl.org – место общения пользователей, работающих с Python, из Атланты, Джорджия. Он окончил университет штата Калифорния, получив степень магистра в области информационных компьютерных систем, а также окончил политехнический университет штата Калифорния, расположенный в Сан-Луис-Обиспо, получив степень бакалавра в области пищевых наук. Он также является сертифицированным системным администратором Apple и LPI, имеет опыт работы в таких компаниях, как Caltech, Disney Feature Animation, Sony Imageworks и Turner Studios. Все свое свободное время он проводит со своей женой Лией (Leah) и их сыном Лиамом (Liam), играя на пианино и духовно совершенствуясь.



10.11.2009

Введение

Большинство системных администраторов уже имеют опыт работы с протоколом SNMP (Simple Network Management Protocol) или, по крайней мере, слышали о нем. Если вы работаете в центре обработки и хранения данных, то вполне вероятно, что вы ежедневно взаимодействуете (определенным образом) с этим протоколом. Существует множество впечатляющих полнофункциональных систем управления сетью (Network Management Systems, NMS) или систем наблюдения за состоянием сети (Network Monitoring Systems), которые используют протокол SNMP, но эта статья не о них. Эта статья посвящена работе с протоколом SNMP с помощью языка Python™, а также рассмотрению примеров написания кода.

Недавно мой друг сказал мне (образно), что у него иногда возникает желание просто пройтись пешком вниз по улице к дому своей бабушки, вместо того, чтобы использовать для этого ракету «Сатурн 5». Многие задачи, такие как использование или настройка громоздких систем управления сетью, подобны этой ракете «Сатурн 5», в которой вы будете себя уверенно чувствовать до тех пор, пока ваши топливные баки будут заполнены жидким кислородом. И это все будет продолжаться до тех пор, пока вы не попробуете маленький Python. Знание того, как на языке Python можно написать код, позволяющий взаимодействовать с протоколом SNMP, является одним из наиболее интересных и полезных навыков, который системный администратор может приобрести. Несмотря на то, что SNMP является отпугивающее сложным в настройке и использовании, использование библиотеки Net-SNMP, описанной в данной статье, превращает этот процесс в развлечение.

Установка и настройка Net-SNMP

Чтобы повторить действия, описанные в данной статье, необходимо установить актуальную версию Python на вашу *nix-систему (версию 2.3 или более позднюю). На момент написания этой статьи версия 2.5.1 была самой последней. Для интерактивной работы с библиотекой Net-SNMP, поддерживающей привязки Python, также необходимо наличие IPython. Команда Net-SNMP проделала основательную работу по проверке работоспособности Net-SNMP в системах AIX®, HP-UX®, таких дистрибутивах GNU/Linux®, как Red Hat, а также Windows® и даже OS X™.

Установка IPython довольна проста. Для управления пакетами Python лучше всего воспользоваться простой установкой (Easy Install). Довольно легко установить любой из пакетов Python, выполнив сценарий ez_setup.py. Например, просто введите команду:

easy_install ipython

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

python setup.py install

Чтобы повторить действия, описанные в данной статье, необходимо убедиться, что на клиентском компьютере или на компьютере, на котором будет запускаться весь код, установлен NET-SNMP 5.4.x или более поздней версии, поскольку начиная именно с этой версии привязки Python были включены в состав дистрибутива. Установка привязок в большинстве случаев потребует выполнения компиляции из исходного кода, но вы также можете воспользоваться менеджерами пакетов Red Hat (Red Hat Package Managers, RPM). Если вы достаточно смелы, то можете попробовать воспользоваться самой последней версией из хранилища основной ветви разработки (trunk), доступной на сайте Net-SNMP.

Есть много разных параметров компиляции, но основной задачей является правильная компиляция NET-SNMP с последующим запуском отдельного инсталлятора Python в директории Python. Необходимо также отметить, что когда вы выполняете компиляцию и запускаете ./configure, то запускается сценарий настройки для локального компьютера, на котором ранее производилась компиляция агента. Вам не нужно использовать сценарий настройки, поэтому просто создайте простую конфигурацию, которую и будете использовать.

Создайте резервную копию конфигурационного файла /etc/snmp/snmpd.conf и замените его файлом со следующими простым содержимым:

syslocation "My Local Machine"
syscontact me@localhost.com
rocommunity public

Сохраните этот файл и перезапустите демон snmpd. В большинстве *nix-систем для этого необходимо выполнить команду /etc/init.d/snmpd restart.

Если вы не до конца уверены в своих силах, то рекомендуем вам не компилировать программное обеспечение из кода, находящегося в разработке (который содержится в системе управления версиями), поскольку вы можете попасть в ситуацию, когда вам придется самостоятельно исправлять возможные ошибки, найденные в этом коде. Для CentOS 5 и Red Hat Enterprise Linux 5 (RHEL 5) вы можете загрузить исходный код самой последней стабильной версии RPM (на момент написания этой статьи самая последняя версия была 5.4.1). Пожалуйста, также обратите внимание на то, что вам понадобится исходный код Python, чтобы собрать привязки. Поэтому, если на вашем компьютере установлена ОС Red Hat, убедитесь, что вы установили пакет python-dev (или его эквивалент) и заголовочные файлы Python для вашей конкретной ОС *nix. Если у вас возникают трудности при сборке RPM из исходного кода, обратитесь к официальной документации по Red Hat. Сборка пакетов из исходного кода может быть довольно сложной задачей и выходит за рамки рассмотрения данной статьи. Если вы столкнулись с проблемами работоспособности привязок Python, свяжитесь с разработчиками Net-SNMP по электронной почте, адрес которой указан на их сайте.

Переходим к коду

Не будем больше ждать и предположим, что у вас уже есть привязки Python, и в данный момент IPython у вас работает. Другими словами, вы готовы начать работу с IPython. В некоторых случаях вам все-таки придется обратиться к документации IPython. Есть также очень хорошие скринкасты, посвященные IPython, созданные Джеффом Рашем (Jeff Rush), который в данный момент является координатором группы продвижения Python. Хорошо, давайте вернемся к написанию кода.

Давайте создадим простой запрос с целью идентификации компьютера по значению его идентификатора объекта (object identifier, OID) sysDescr. Запустите IPython, введя команду ipython, после чего в интерактивном режиме выполните следующую последовательность команд:

Листинг 1. Пример кода на IPython
        In [1]: import netsnmp

        In [2]: oid = netsnmp.Varbind('sysDescr')

        In [3]: result = netsnmp.snmpwalk(oid,
        ...:                         Version = 2,
        ...:                         DestHost="localhost",
        ...:                         Community="public")

        In [4]: result = netsnmp.snmpwalk(oid,
                                Version = 2,
                                DestHost="localhost",
                                Community="public")

        In [16]: result
        Out[16]: ('Linux localhost 2.6.18-8.1.14.el5 #1 SMP Thu Sep 27 
        18:58:54 EDT 2007 i686',)

Обратите внимание на то, что полученные вами значения будут отличаться от тех, что показаны в этом примере. Если вы полностью повторили действия из листинга 1 , то все будет работать так, как нужно. Если вы уже знакомы с SNMP, то можете незамедлительно воспользоваться всей мощью этого протокола.

Одной из замечательных особенностей использования IPython при тестировании фрагментов SNMP-кода является то, что IPython работает как обычный командный процессор, и при этом большинство основных интерактивных возможностей командного процессора в нем действительно работают, но особым образом. Написание кода для работы с SNMP может быть весьма нудным занятием, но использование библиотеки Net-SNMP с IPython превращает этот процесс в развлечение.

Как вы могли заметить, получить результирующие данные в формате Python довольно просто. Вот почему IPython и Net-SNMP так хорошо использовать вместе. Для получения необходимой информации теперь осталось только интерактивно подставлять необходимые комбинации OID в этот пользовательский сценарий. В идеальном мире, необходим довольно громоздкий сценарий, предназначенный для простой настройки NMS, с помощью которого новый компьютер автоматически бы добавлялся в сеть.

Конечно, наш мир не идеален, и для системного администратора умение быстро написать небольшой интеллектуальный SNMP-код всегда пригодится. Предположим ситуацию, при которой вы только что преобразовали высокоскоростное устройство DDR в 2 ТБ RAID 0 на сервере, работающем под ОС Ubuntu Linux, поскольку это единственное, что вы смогли сделать за тот час, который вам дали для решения возникшей проблемы.

И теперь вы находитесь в весьма затруднительном положении, поскольку не знаете, стоит ли вам готовиться искать новую работу и рассылать свое резюме, или готовить речь, рассказывающую о своих заслугах, и просить повышение. При этом у вас есть всего несколько минут, чтобы разобраться в сложившейся ситуации. Давайте воспользуемся функцией редактирования в IPython для написания файла сценария, после чего запустим его в этой же сессии, не выходя из IPython: ed snmpinput.py

Листинг 2. Создание модуля IPython
import netsnmp

class snmpSessionBaseClass(object):
    """A Base Class For a SNMP Session"""
    def __init__(self,
                oid="sysDescr",
                Version=2,
                DestHost="localhost",
                Community="public"):

        self.oid = oid
        self.Version = Version
        self.DestHost = DestHost
        self.Community = Community


    def query(self):
        """Creates SNMP query session"""
        try:
            result = netsnmp.snmpwalk(self.oid,
                                    Version = self.Version,
                                    DestHost = self.DestHost,
                                    Community = self.Community)
        except:
            import sys
            print sys.exc_info()
            result = None

        return result

Не останавливайтесь на достигнутом, скопируйте и вставьте представленный выше код в только что созданный вами файл. Когда вы сохраните этот файл, IPython автоматически выполнит его и поместит класс из этого модуля в вашу среду. Если вы введете «who», то должны получить примерно следующий ответ:

In [2]: who
netsnmp snmpSessionBaseClass

Это очень эффективно, поскольку вы можете использовать ваш любимый текстовый редактор (такой как Vim или Emacs), а затем созданный в этом редакторе код мгновенно выполнить командной оболочкой IPython в интерактивном сеансе. Обратите внимание на то, что если у вас есть ранее написанный вами модуль, то вы также можете просто вписать его название и запустить его для получения такого же результата. Запуск и выполнение модуля в IPython проходит путем выполнения его кода и помещения этого модуля в среду IPython.

Итеративное кодирование

Используя IPython, можно объединить лучшие возможности, которые есть у оболочки Python, командного процессора UNIX и вашего любимого текстового редактора. Когда взаимодействуешь с чем-то таким сложным, как библиотека для SNMP, необходимо собрать всю имеющуюся информацию, которая может помочь в работе. Только в этом случае вы сможете почувствовать всю силу IPython.

Вы можете писать модули «на лету», а тестировать и использовать их позже. IPython также позволяет использовать различные методики программирования, включая разработку через тестирование (Test Driven Development, TDD) и разработку через расширенное тестирование (Test Enhanced Development, TED). Давайте перейдем к только что созданному вами модулю, чтобы показать все преимущества данных методов.

Теперь, когда у вас есть объектно-ориентированный интерфейс SNMP, вы можете начать получать от вашего локального компьютера более подробную информацию:

Листинг 3. Итеративное кодирование в IPython
In [1]: run snmpinput

In [2]: who
netsnmp snmpSessionBaseClass    

In [3]: s = snmpSessionBaseClass()

In [4]: s.query()
Out[4]: ('Linux localhost 2.6.18-8.1.14.el5 #1 SMP Thu Sep 27 18:58:54 EDT 2007 i686',)

In [5]: result = s.query()

In [6]: len(result)
Out[6]: 1

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

Листинг 4. Изменение значение OID объекта
In [7]: s.oid
Out[7]: 'sysDescr'

In [8]: s.oid = ".1.3.6.1.2.1.1"

In [9]: result = s.query()

In [10]: print result
('Linux localhost 2.6.18-8.1.14.el5 #1 SMP Thu Sep 27 18:58:54 EDT 2007 i686', 
            '.1.3.6.1.4.1.8072.3.2.10', '121219', 'me@localhost.com', 
            'localhost', '"My Local 
Machine"', '0', '.1.3.6.1.6.3.10.3.1.1', '.1.3.6.1.6.3.11.3.1.1', 
'.1.3.6.1.6.3.15.2.1.1', 
'.1.3.6.1.6.3.1', '.1.3.6.1.2.1.49', '.1.3.6.1.2.1.4', '.1.3.6.1.2.1.50',
 '.1.3.6.1.6.3.16.2.2.1', 
'The SNMP Management Architecture MIB.', 'The MIB for Message Processing and
 Dispatching.', 'The management information definitions for the SNMP 
User-based Security Model.', 'The MIB module for SNMPv2 entities', 'The 
MIB module for managing TCP implementations', 'The MIB module for
managing IP and ICMP implementations', 'The MIB module for managing 
UDP implementations', 'View-based Access 
Control Model for SNMP.', '0', '0', '0', '0', '0', '0', '0', '0')

Как видите, довольно просто взять этот модуль и начать исследовать всю сеть, один компьютер за раз. Не спешите и подумайте над тем, что бы вы хотели найти в вашей сети с помощью запроса. Заслуживает внимания также другая интересная возможность IPython. IPython позволяет вам запускать фрагменты Python-кода в фоновом режиме. Сделать это невероятно просто. Давайте еще раз выполним тот же запрос, но только в фоновом режиме (листинг 5).

Листинг 5. Пример выполнения фрагмента итеративного кода IPython в фоновом режиме
In [11]: bg s.query()
Starting job # 0 in a separate thread.

In [12]: jobs[0].status
Out[12]: 'Completed'

In [16]: jobs[0].result
Out[16]: 
('Linux localhost 2.6.18-8.1.14.el5 #1 SMP Thu Sep 27 18:58:54 EDT 2007 i686',
 '.1.3.6.1.4.1.8072.3.2.10', '121219', 'me@localhost.com', 'localhost', '"My Local
 Machine"', '0', '.1.3.6.1.6.3.10.3.1.1', '.1.3.6.1.6.3.11.3.1.1', 
'.1.3.6.1.6.3.15.2.1.1', '.1.3.6.1.6.3.1', '.1.3.6.1.2.1.49', 
'.1.3.6.1.2.1.4', '.1.3.6.1.2.1.50', '.1.3.6.1.6.3.16.2.2.1',
 'The SNMP Management Architecture MIB.', 'The MIB for Message Processing and
 Dispatching.', 'The management information definitions for the SNMP User-based
 Security Model.', 'The MIB module for SNMPv2 entities', 'The MIB module for
 managing TCP implementations', 'The MIB module for managing IP and ICMP
 implementations', 'The MIB module for managing UDP implementations',
 'View-based Access Control Model for SNMP.', '0', '0', '0', '0', '0', '0', '0', '0')

Прежде чем вы придете в бурный восторг, хотелось бы отметить, что поточная обработка в фоновом режиме работает в IPython отлично, но только с теми библиотеками, которые поддерживают асинхронную обработку. К сожалению, Net-SNMP является синхронной. Если вы сильно любопытны, то можете проверить это, изменив значение s.oid на .iso. Тогда вы сможете заметить, как интерпретатор IPython будет "блокироваться" или "подвисать" пока запрос не будет выполнен. Небольшое замечание: выполнение SNMP-запроса по всему дереву .iso может занять некоторое время, поэтому, возможно, вы просто поверите мне на слово и не станете проверять.

Конечно, есть и другое решение. Вы можете воспользоваться одной из многочисленных библиотек обработки, доступных в Python, чтобы ответвить этот блокируемый процесс. Несколько библиотек сторонних разработчиков вы можете найти в репозитарии Python (Python cheese shop). Если вы используете простую установку easy_install, то установка пакета, такого как Parallel Python, и испытание в работе этой библиотеки вместе с Net-SNMP станет для вас простой задачей. Все в ваших руках!

easy_install http://www.parallelpython.com/downloads/pp/pp-1.5.zip

Последнее, что осталось продемонстрировать – выполнение поблочного тестирования (unittest) в оболочке IPython. Очень удобно при внесении изменений в модуль сразу выполнять поблочное тестирование. Вам необходимо использовать флаг run -e для того, чтобы результат трассировки не передавался в модуль поблочного тестирования в оболочке IPython. Этот поблочный тест вы можете найти в исходном файле, который идет вместе с этой статьей.

Пожалуйста, обратите внимание на то, что в IPython 0.8.2 включен также новый модуль - doctest, который позволяет в IPython выполнять проверку кусков текста, которые похожи на фрагменты кода. Модуль Doctest является замечательной возможностью в Python, поскольку кроме прочих вещей, он позволяют создавать документацию к API с возможностью проверки работоспособности кода, написанного в этой документации. Ниже представлен пример того, как запустить проверку вашего модуля в IPython в режиме doctest:

Листинг 6. Запуск IPython в режиме doctest
In [5]: %doctest_mode
*** Pasting of code with ">>>" or "..." has been enabled.
Exception reporting mode: Plain
Doctest mode is: ON
>>> from snmpinput import snmpSessionBaseClass

>>> s = snmpSessionBaseClass()

>>> s.query()
('Linux devmws2.racemi.com 2.6.9-55.0.2.EL #1 Tue Jun 26 14:08:18 EDT 2007 i686',)

Поскольку модуль doctest последовательно выполняет все операторы Python, вам следует быть внимательными и не использовать те операторы, которые могут изменить свое значение при использовании doctest (пример таких значений показан выше). Если вы вставите строки кода в строковый литерал (docstring) вашего модуля, то вы сможете протестировать документацию к API, используя для этого следующее выражение:

def _test():
    import doctest
    doctest.testmod()

if __name__ == "__main__":
    _test()

Заключение

Из данной статьи вы узнали о том, что использование Net-SNMP совместно с IPython является очень эффективным решением. Кроме этого также были рассмотрены следующие аспекты:

  1. Привязки Python: в библиотеке Net-SNMP теперь есть поддержка привязок Python, которые позволяют использовать всю мощь и элегантность языка Python для работы с протоколом SNMP.
  2. Библиотека обработки: привязки Python на данный момент времени являются синхронными, но использование библиотеки обработки для ответвления каждого запроса позволяет решить данную проблему.
  3. Гибкая техника написания кода: IPython является невероятно сложным и мощным инструментом, предназначенным для системных администраторов и разработчиков ПО. Несмотря на то, что в данной статье очень бегло были рассмотрены гибкие техники написания кода (такие как doctests и unittests), вы можете использовать эти техники для разработки кода по методу «test-centric development» или просто для интерактивного написания и анализа кода.
  4. SNMP и IPython: в данной статье был дан лишь краткий обзор того, что SNMP и IPython могут делать по отдельности, а что вместе.

SNMP является чрезвычайно сложным протоколом. Возможно, почти сразу захочется подумать над написанием какого-либо действительно значимого кода. Хочется верить, что описанная здесь техника наведет вас на некоторые мысли. Если вам любопытно, насколько хорошо реализована поддержка SNMP в Python, обратите внимание на Zenoss, загрузите виртуальную машину и протестируйте его возможности. Есть также интерфейсы API, для которых вы можете писать сценарии, благодаря чему вы сможете совместить то, что узнали из этой статьи с полноценной системой NMS Python. Конечно, все сказанное относится также ко всем другим системам NMS.


Загрузка

ОписаниеИмяРазмер
Пример Net-SNMP сценариев, написанных на Pythonipython_netsnmp_code.zip1КБ

Ресурсы

Научиться

  • Оригинал статьи – "Using Net-SNMP and IPython" (EN).
  • Для получения информации об использовании и настройке оболочки IPython посетите страницу, на которой представлена документация IPython (EN).
  • Прочтите статью Джереми Джонса (Jeremy Jones) «Enhanced interactive Python with IPython» (EN), в которой всесторонне охватывается вопрос использования IPython.
  • Прочтите статью «IPython article in science and engineering» (EN), в которой описывается использование IPython в научных и инженерных целях.
  • Посмотрите скринкасты, посвященные IPython (EN), в которых показана работа с интерактивной оболочкой Python.
  • Воспользуйтесь официальной документацией к модулю Doctest (EN), если вы хотите более глубоко понять принцип его работы.
  • Посетите раздел Википедии, посвященный Net-SNMP (EN), чтобы получить больше информации об использовании привязок Python к Net-SNMP.
  • Чтобы получить общую информацию о языке Python, узнать основные принципы и возможности данного языка и системы, изучите руководство по Python (EN).
  • Для получения самой последней версии системы управления сетью Python Enterprise Network Management System посетите сайт Zenoss trunk (EN).
  • Воспользуйтесь модулем Easy Install for Python (EN), с помощью которого вы сможете автоматически загружать, собирать, устанавливать и управлять пакетами Python.
  • Просмотрите популярные материалы раздела AIX и UNIX, чтобы узнать, чем интересуются другие пользователи (EN).
  • На сайте developerWorks в разделе AIX и UNIX вы всегда сможете найти огромное количество справочных материалов, касающихся всех аспектов администрирования систем AIX, а также улучшения ваших навыков работы с UNIX.
  • Посетите раздел AIX и UNIX для новичков, чтобы узнать больше о системах AIX и UNIX.
  • Посетите страницу AIX Wiki (EN), на которой представлена техническая информация об AIX, собранная общими усилиями многих специалистов.
  • Ищите в технической библиотеке AIX и UNIX информацию, посвященную следующим темам:
  • Посетите библиотеку ссылок на электронные ресурсы Safari (EN), чтобы найти интересующую вас информацию.
  • Оставайтесь всегда в курсе событий с помощью сайта технических мероприятий и Web-трансляций developerWorks (EN).
  • Слушайте интересные интервью и дискуссии разработчиков программного обеспечения на сайте подкастов developerWorks (EN).

Получить продукты и технологии

  • Используйте в своем следующем проекте пробные версии продуктов IBM, которые можно загрузить непосредственно с сайта developerWorks (EN).

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=AIX и UNIX
ArticleID=445791
ArticleTitle=Использование Net-SNMP и IPython
publish-date=11102009