| Получение множества значений с помощью SNMP |
|
Получение единственного значения не представляет большой сложности, хотя иногда бывает желательно проверить ответы или выполнить некоторое действие, основанное, например, на типе операционной системы, под управлением которой работает компьютер. Чтобы сделать что-то более значимое, бывает необходимо получить несколько значений и выполнить какие-либо действия над ними. Часто возникает задача произвести инвентаризацию центра обработки данных или отдела и собрать сведения о некоторых параметрах всех имеющихся машин. Представим такую гипотетическую ситуацию: вы готовитесь к крупному обновлению программного обеспечения и вам сказали, что каждая система должна иметь как минимум 1 Гбайт ОЗУ. Вы помните, что на большинстве компьютеров установлено памяти не менее 1 Гбайта, но среди тысяч поддерживаемых вами компьютеров имеется несколько таких, где памяти меньше требуемого объема. Очевидно, что у вас имеется несколько вариантов действий. Рассмотрим каждый из них: Вариант 1 Физически обойти все компьютеры и проверить объем ОЗУ на каждом из них, запустив некоторую команду или вскрыв корпус. Достаточно очевидно, что это не самый привлекательный вариант. Вариант 2 Зайти по сети на каждый компьютер и выполнить команду, чтобы определить объем ОЗУ. Этот подход обладает массой недостатков, но его хотя бы теоретически можно реализовать в виде сценария, выполняющего команду средствами ssh. Одна из основных проблем состоит в том, что сценарий должен учитывать различия между платформами, так как все операционные системы в чем-то немного отличаются. Другая проблема заключается в необходимости знать, где все эти компьютеры располагаются. Вариант 3 Написать небольшой сценарий, который опросит все устройства, включенные в сеть, и определит объем памяти на каждом из них с помощью SNMP. Вариант 3, основанный на использовании SNMP, позволяет легко создать опись, в которой будут присутствовать только компьютеры, имеющие менее 1 Гбайта ОЗУ. Точный идентификатор OID, который потребуется запросить, носит имя «hrMemorySize». Протокол SNMP относится к разряду тех инструментов, которые всегда выгоднее использовать в многозадачном режиме, но все-таки подобной оптимизации лучше избегать, если это не является абсолютно необходимым. Помня об этом, перейдем непосредственно к деталям. Чтобы быстро проверить нашу идею, воспользуемся программным кодом из предыдущего примера. Получение объема памяти с помощью SNMP:
Как видите, реализовать подобный сценарий достаточно просто. Результат возвращается в виде кортежа в строке [6], поэтому мы извлекаем элемент с индексом 0 и преобразуем его в целое число. Теперь мы имеем целое число, соответствующее объему памяти в килобайтах. Единственное, что следует иметь в виду, - на разных компьютерах объем ОЗУ вычисляется по-разному. Поэтому в таких случаях лучше принимать решение на основе приближенных, а не точных значений. Например, можно было бы искать компьютеры, объем ОЗУ в которых немного меньше 1 Гбайта - скажем, 990 Мбайт. В приведенном примере мы можем примерно оценить, что полученное число примерно соответствует объему ОЗУ 2 Гбайта. Вы можете полагаться на эту информацию, отвечая на запрос своего руководителя о наличии компьютеров с ОЗУ менее 2 Гбайт, если известно, что новое приложение, которое требуется установить, требует наличия памяти не менее 2 Гбайт. Получение множества значений с помощью SNMP 265 Теперь, проверив основную идею, мы можем автоматизировать процедуру определения памяти. Если говорить более определенно, следует опросить все компьютеры, выяснить, в каких из них установлено памяти менее 2 Гбайт ОЗУ и затем записать полученную информацию в файл формата CSV1, чтобы ее потом проще было импортировать в Excel или OpenOff iceCalc. Далее можно написать инструмент командной строки, который принимает диапазон сетевых адресов в качестве входного аргумента и, дополнительно, значение идентификатора OID, по умолчанию используя идентификатор «hrMemorySize». При этом в сценарии нам необходимо будет предусмотреть обход сетевых адресов из указанного диапазона. Всякий раз, когда системный администратор пишет программный код, он сталкивается с определенными ограничениями. В состоянии ли вы потратить несколько часов или даже дней на создание большого объектно-ориентированного сценария, который потом можно будет использовать для решения других задач, или вам нужно быстро получить хотя бы приблизительные результаты? На наш взгляд, в большинстве случаев вполне можно выполнить обе реализации. При использовании IPython вы можете быстро создавать заготовки сценариев и затем доводить их до окончательного состояния. Вообще - это хорошая идея писать программный код многократного использования, поскольку эта привычка, как снежный ком, быстро обретает инерцию движения. Надеемся, что теперь вы понимаете, в чем заключается сила SNMP. Давайте приступим к созданию нашего сценария... Поиск объема памяти В этом следующем примере мы реализуем инструмент командной строки, определяющий объем памяти, установленной в компьютерах, с помощью SNMP:
«!/usr/ьin/env python ((Инструмент командной строки, определяющий общий объем памяти в компьютере import netsnmp import optparse from IPy import IP class SnmpSession(Object): .... Простой сеанс SNHP def _ init__(self, oid="hrMemorySize", Version=2, DestHost="localhost",
Теперь пройдемся по этому сценарию и посмотрим, что он делает. Мы взяли целый класс из предыдущего примера и поместили его в новый модуль. Затем мы написали класс-контроллер, который анализирует аргументы командной строки с помощью модуля optparse. Модуль IРу, к которому мы обращаемся снова и снова, используется для автоматической обработки IP-адресов. Благодаря этому можно указать несколько IP-адресов или диапазон адресов, и наш модуль будет отсылать запросы SNMP и возвращать результаты в виде словаря, в котором роль ключей будут играть IP-адреса, а роль значений - ответы SNMP. Единственная сложность, которая здесь реализована, - это логика обработки пустых ответов и проверки порогового значения. То есть модуль возвращает только значения ниже указанного порога. При использовании порога мы можем получать значимые для нас результаты и учесть различия в том, как разные компьютеры вычисляют объем памяти. Посмотрим на вывод, полученный в результате работы этого модуля:
Как видите, результаты были получены для компьютеров в подсети 10.0.1.0/24. Теперь воспользуемся флагом threshold (порог), чтобы сымитировать поиск машин, объем ОЗУ в которых меньше 2 Гбайт. Как уже упоминалось выше, разные компьютеры по-разному вычисляют имеющийся объем ОЗУ, поэтому для пущей уверенности возьмем в качестве порогового значения число 1800, что примерно должно соответствовать объему ОЗУ 1800 Мбайт. То есть, если в компьютере объем ОЗУ составляет менее 1800 Мбайт, или примерно 2 Гбайта, информация о нем будет включена в наш отчет. Ниже приводится результат выполнения такого запроса:
Наш сценарий прекрасно справился с заданием, однако мы можем сделать еще кое-что, чтобы оптимизировать его. Если вам потребуется опросить несколько тысяч машин, то для выполнения работы этому сценарию может потребоваться целый день или даже больше. Это, может быть, и не страшно, но если вам требуется получить результаты очень быстро, вам необходимо будет обеспечить возможность параллельного выполнения нескольких запросов одновременно и организовать ветвление для каждого запроса, используя для этого библиотеку стороннего производителя. Еще одно усовершенствование, которое можно было бы внести, - это автоматическое создание файла отчета в формате CSV из нашего словаря. Но прежде чем мы перейдем к реализации этих задач, позвольте обратить ваше внимание на один момент, который вы, возможно, не заметили. Сценарий написан так, что позволяет запрашивать любой OID, а не только определять объем памяти. Это очень удобно, потому что у нас теперь имеется как инструмент определения объемов памяти, так и универсальный инструмент, позволяющий выполнять любые запросы SNMP. Рассмотрим пример, который наглядно демонстрирует, что мы имеем в виду:
Совсем не лишне учитывать это, приступая к работе над «одноразовым» инструментом для конкретного случая. Почему бы не потратить дополнительные 30 минут, чтобы придать ему универсальность? В результате у вас может получиться инструмент, который будет находить применение снова и снова, и эти 30 минут превратятся в ничто по сравнению с тем временем, которое вам удастся сэкономить в будущем.
Set as favorite
Bookmark
Email This
Hits: 182 Комментарии (0)RSS feed CommentsНаписать комментарий |