PySNMP 4.4 с выводом Python 2.7 bulkCmd, не включая дочерние OID

Начнем с того, что я новичок в Python и PySNMP. Я пытаюсь передать список сетевых устройств в bulkCmd, чтобы получить информацию обо всех физических интерфейсах.

В настоящее время он собирает только первый интерфейс, а затем переходит к следующему сетевому устройству в списке. Я внес изменения в лексикографические и maxCalls, повторения, но ничего не изменилось.

Я успешно опросил все интерфейсы при отправке одного bulkCmd на одно сетевое устройство.

Код:

from pysnmp.hlapi import *

routers = ["router1", "router2"]

#adds routers to getCmd and bulkCmd
def snmpquery (hostip):

    errorIndication, errorStatus, errorIndex, varBinds = next (
        bulkCmd(SnmpEngine(),
            CommunityData('communitystring'),
            UdpTransportTarget((hostip, 161)),
            ContextData(),
            0, 50,  
            ObjectType(ObjectIdentity('IF-MIB', 'ifDescr')),
            ObjectType(ObjectIdentity('IF-MIB', 'ifAlias')),
            ObjectType(ObjectIdentity('IF-MIB', 'ifOperStatus')),
            lexicographicMode=True
        )
    )

    # Check for errors and print out results
    if errorIndication:
        print(errorIndication)

    elif errorStatus:
        print('%s at %s' % (errorStatus.prettyPrint(),
                            errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
    else:
        for varBind in varBinds:
            print(' = '.join([x.prettyPrint() for x in varBind]))


# calls snmpquery for all routers in list
for router in routers:
    snmpquery(router)

Выход:

IF-MIB::ifDescr.1 = GigabitEthernet0/0
IF-MIB::ifAlias.1 = InterfaceDesc
IF-MIB::ifOperStatus.1 = 'up'
IF-MIB::ifDescr.1 = GigabitEthernet0/0
IF-MIB::ifAlias.1 = InterfaceDesc
IF-MIB::ifOperStatus.1 = 'up'

person Ev9432    schedule 12.11.2017    source источник


Ответы (2)


bulkSNMP возвращает итератор, и вы использовали для него next(), который извлекает только первую из итераций. Вероятно, вы почерпнули эту идею из документации PySNMP, что не очень хорошо показывает, как получить все результаты.

Вы должны использовать цикл for для перебора всех итераций следующим образом:

from pysnmp.hlapi import *
routers = ["router1", "router2"]

def snmpquery (hostip):
    snmp_iter = bulkCmd(SnmpEngine(),
                        CommunityData('communitystring'),
                        UdpTransportTarget((hostip, 161)),
                        ContextData(),
                        0, 50,  
                        ObjectType(ObjectIdentity('IF-MIB', 'ifDescr')),
                        ObjectType(ObjectIdentity('IF-MIB', 'ifAlias')),
                        ObjectType(ObjectIdentity('IF-MIB', 'ifOperStatus')),
                        lexicographicMode=True)
    for errorIndication, errorStatus, errorIndex, varBinds in snmp_iter:
        # Check for errors and print out results
        if errorIndication:
            print(errorIndication)
        elif errorStatus:
            print('%s at %s' % (errorStatus.prettyPrint(),
                            errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
        else:
            for varBind in varBinds:
                print(' = '.join([x.prettyPrint() for x in varBind]))

# calls snmpquery for all routers in list
for router in routers:
    snmpquery(router)

Кроме того, будьте осторожны с отступами при публикации вопросов, связанных с Python, так как это важно.

person soundstripe    schedule 12.11.2017
comment
Спасибо soundstripe, это сработало отлично! Я также проверю свой отступ при следующей публикации. - person Ev9432; 07.12.2017

Вам необходимо выполнить итерацию по генератору, созданному функцией bulkCmd, чтобы повторить запросы SNMP для извлечения управляемых объектов SNMP, которые не поместились в предыдущие пакеты ответов. Просто отбросьте вызов next() и запустите цикл for поверх bulkCmd().

Примечание 1: вам может не понадобиться lexicographicMode=True, если вы хотите получить управляемые объекты, которые находятся сразу под столбцами таблицы MIB (например, IF-MIB::ifDescr и т. д.).

Примечание 2: если в вашей сети много агентов SNMP, вы можете ускорить процесс извлечения данных, обратившись к параллельно. Вы бы использовали тот же вызов getBulk(), но параллелизм выполняется только нижележащим сетевым вводом-выводом.

person Ilya Etingof    schedule 12.11.2017
comment
Спасибо Иия. Я рассмотрю вашу рекомендацию! - person Ev9432; 07.12.2017