Python3 easysnmp, запрашивающий несколько коммутаторов, приводит к случайному тайм-ауту для некоторых случайных коммутаторов

У меня есть 3 коммутатора, с которых я пытаюсь получить данные SNMP. Каждый коммутатор время от времени отвечает, но какие коммутаторы отвечают, зависит от порядка, в котором я их опрашиваю. Я использую easysnmp.Session.

Мой код (пароли явно не показаны):

      import easysnmp

switches_dns1 = {
            "switch1": "switch-mBvk1-1.obis.ns.nl",
            "switch2": "switch-mBvk1-2.obis.ns.nl",
            "switch3": "switch-abv5-1.obis.ns.nl"
            }

switches_dns2 = {
            "switch3": "switch-abv5-1.obis.ns.nl",
            "switch1": "switch-mBvk1-1.obis.ns.nl",
            "switch2": "switch-mBvk1-2.obis.ns.nl"          
            }

switches_dns3 = {
            "switch2": "switch-mBvk1-2.obis.ns.nl",
            "switch3": "switch-abv5-1.obis.ns.nl",
            "switch1": "switch-mBvk1-1.obis.ns.nl"                      
            }

switches_dns4 = {
            "switch2": "switch-abv5-1.obis.ns.nl",
            "switch3": "switch-mBvk1-2.obis.ns.nl",
            "switch1": "switch-mBvk1-1.obis.ns.nl"                      
            }

print("====> Testcase 1")   
for switch, hostname_dns in  switches_dns1.items():
    print(switch)
    try:
        snmp_session = easysnmp.Session(hostname=hostname_dns, security_username='test_user', auth_protocol='MD5', auth_password='blahblahblah', version=3, security_level='auth_with_privacy', privacy_password='blahblahblah', privacy_protocol='DES')
        result=snmp_session.get('.1.3.6.1.4.1.37072.302.3.1.1.3.6.0')
        print("Switch: {}, Result: {}".format(switch, result))
    except easysnmp.exceptions.EasySNMPTimeoutError as err:
        print("Switch: {}, result: TIMEOUT ERROR".format(switch))

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

====> Тестовый пример 1 switch1 Switch: switch1, Результат: <SNMPVariable value='10.160.59.131' (oid='enterprises.37072.302.3.1.1.3.6.0', oid_index='', snmp_type='IPADDR')> switch2 Switch: switch2, Результат: <SNMPVariable value='10.160.59.132' (oid='enterprises.37072.302.3.1.1.3.6.0', oid_index='', snmp_type='IPADDR')> switch3 Switch: switch3, результат: ОШИБКА ВРЕМЕНИ [ john.roede]# python3 test2.py

====> Тестовый случай 2 switch3 Switch: switch3, Результат: <SNMPVariable value='10.160.59.133' (oid='enterprises.37072.302.3.1.1.3.6.0', oid_index='', snmp_type='IPADDR')> switch1 Switch: switch1, результат: TIMEOUT ERROR switch2 Switch: switch2, Результат: <SNMPVariable value='10.160.59.132' (oid='enterprises.37072.302.3.1.1.3.6.0', oid_index='', snmp_type='IPADDR' )> [ john.roede]# python3 test2.py

====> Тестовый пример 3 switch2 Switch: switch2, Результат: <SNMPVariable value='10.160.59.132' (oid='enterprises.37072.302.3.1.1.3.6.0', oid_index='', snmp_type='IPADDR')> switch3 Switch: switch3, результат: TIMEOUT ERROR switch1 Switch: switch1, результат: TIMEOUT ERROR [ [email protected][email protected][email protected] john.roede]# python3 test2.py

====> Тестовый пример 4 switch2 Switch: switch2, Результат: <SNMPVariable value='10.160.59.133' (oid='enterprises.37072.302.3.1.1.3.6.0', oid_index='', snmp_type='IPADDR')> switch3 Switch: switch3, Результат: <SNMPVariable value='10.160.59.132' (oid='enterprises.37072.302.3.1.1.3.6.0', oid_index='', snmp_type='IPADDR')> switch1 Switch: switch1, результат: ОШИБКА ТАЙМ-АУТА

Как видите, каждый коммутатор время от времени отвечает, поэтому проблем на уровне коммутатора быть не должно. Чтобы быть на 100% уверенным, я также написал быстрый bash-скрипт, последовательно запрашивающий все 3 переключателя. Это работает:

      ./test.sh
SNMPv2-SMI::enterprises.37072.302.3.1.1.3.6.0 = IpAddress: 10.160.59.131
SNMPv2-SMI::enterprises.37072.302.3.1.1.3.6.0 = IpAddress: 10.160.59.132
SNMPv2-SMI::enterprises.37072.302.3.1.1.3.6.0 = IpAddress: 10.160.59.133

Я действительно не могу понять, что вызывает проблему с easysnmp. Я попытался разделить несколько вызовов SNMP с помощью сна, чтобы исключить слишком быструю последовательность вызовов, но это не решило проблему. Я также просмотрел документацию easysnmp для функции Session.close(), но, похоже, ее нет. Есть упоминание о функции update_session(), которую я не пробовал, поскольку в документации говорится:«Хотя вместо этого рекомендуется создать новый экземпляр Session, этот метод был добавлен для вашего удобства на случай, если он вам действительно понадобится (мы’ мы неправильно набрали строку сообщества ранее на наших интерактивных сессиях и полностью понимаем вашу боль)».

Я был бы очень признателен за помощь в решении этой проблемы и хотел бы заранее поблагодарить вас за уделенное время.

PS. Извините, я не могу правильно отформатировать вывод :-(

1 ответ

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

См . https://github.com/easysnmp/easysnmp/issues/156 для получения дополнительной информации.

Другие вопросы по тегам