Получите информацию от маршрутизатора Cisco Способом Parsable

Я пытаюсь записать сценарий, который вытянет конфигурационные файлы по SSH от маршрутизаторов Cisco и проанализирует их, таким образом, я смогу удостовериться, чтобы они соответствовали предопределенным стандартам (например, паролем не должна быть "Cisco").

Соединение с маршрутизаторами и выполнение команд программно просты. Барьер, с которым я сталкиваюсь, является тем выполнением show running config возвращает глобальные параметры конфигурации, а также настройки для конкретных интерфейсов.

Моя цель состояла в том, чтобы обработать настройки для интерфейсов по-другому по сравнению с глобальными настройками; например, я могу проигнорировать плохие настройки в интерфейсах, которые отключены.

Есть ли отдельные команды для получения глобальных настроек и получения интерфейсных определений (например. show global settings и a show interface settings тип команд)? С другой стороны, есть ли лучший способ, которым я могу получить эту информацию, которая помогла бы проанализировать?

5
задан 23 July 2014 в 23:11
2 ответа

Автоматический разбор конфигурации Cisco IOS

В качестве альтернативы, есть ли лучший способ получить эту информацию, который упростил бы разбор?

Разбор конфигурации маршрутизатора/коммутатора достаточно сложен из-за уровней иерархии в конфигурациях IOS; по возможности используйте инструмент, который специализируется на разборе для вас. Одним из таких инструментов является ciscoconfparse (докум. здесь) Примечание 1. ciscoconfparse имеет целую батарею модульных тестов, которые гарантируют, что парсинг останется согласованным между версиями утилиты.

Предположим, что конфигурация идет в точном формате , используемом Cisco IOS show run-config или show startup-config, ciscoconfparse автоматически находит конфигурации интерфейсного уровня для вас. Это означает, что вы можете автоматизировать стандартизацию интерфейсных и глобальных конфигураций... Это пример аудита конфигурации интерфейса коммутатора в документации. ciscoconfparse обладает большим функционалом; Вы должны потратить некоторое время на чтение документации.

Есть также несколько специализированных методов, которые делают много специфического разбора значений для Вас; эти методы в настоящее время находятся в бета-версии - и видны только в исходном коде.... например, предположим, что у вас есть конфигурация коммутатора, сохраненная как c6509.conf

!
interface GigabitEthernet2/8
 ip address 192.0.2.1 255.255.255.252
 mtu 9000
 carrier-delay msec 50
!

Вы можете использовать скрипт или питоновый интерпретатор для получения IP адреса и несущей задержки в родных питоновых представлениях. ...

[mpenning@tsunami ~]$ python
Python 2.7.3 (default, Jan  2 2013, 13:56:14)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> from ciscoconfparse import CiscoConfParse
>>> config = CiscoConfParse('c6509.conf', factory=True)
>>>
>>> intfs = config.find_objects('interface GigabitEthernet2/8', exactmatch=True)
>>> intfs
[<IOSIntfLine # 1 'GigabitEthernet2/8' info: '192.0.2.1/30'>]
>>>
>>> intfs[0].ip_addr
'192.0.2.1'
>>>
>>> intfs[0].has_manual_carrierdelay
True
>>>
>>> intfs[0].manual_carrierdelay
0.05
>>>
>>> intfs[0].manual_mtu
9000
>>>

Если вам нужна бета-функциональность, вам нужно разобрать конфигурацию с помощью factory=True, как показано выше...


Native Cisco IOS parsing capabilities

Моей целью было обрабатывать настройки для интерфейсов, отличных от глобальных; например, я могу игнорировать плохие настройки на интерфейсах, которые отключены.

Есть ли отдельные команды для получения глобальных настроек и определений интерфейсов (например, показать глобальные настройки и тип настроек интерфейса)?

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

CORE01.PUB.DAL02#sh runn int gi1/2
Building configuration...

Current configuration : 242 bytes
!
interface GigabitEthernet1/2
 description Link to edge01.pub.dal02
 ip address 192.0.2.46 255.255.255.252
 ip ospf network point-to-point
 media-type rj45
end

CORE01.PUB.DAL02#

В зависимости от запускаемого образа, Cisco IOS разрешает несколько других разделов глобальной конфигурации. ...это из маршрутизатора, запущенного в 12.4...

EDGE01.PUB.DEN#sh running-config ?
  brief       configuration without certificate data
  class-map   Show class-map information
  full        full configuration
  interface   Show interface configuration
  linenum     Display line numbers in output
  map-class   Show map class information
  policy-map  Show policy-map information
  view        View options
  |           Output modifiers
  <cr>

EDGE01.PUB.DEN#

Также можно получить части глобальной конфигурации, используя регулярные выражения IOS из CLI... например...

EDGE01.PUB.DEN#show runn | include ^enable
enable secret 5 $1$mOmQ$sORLRqZQZ/cr7KSyrXUPZ.
EDGE01.PUB.DEN#

FYI, это MD5 хэш для пароля включения "cisco", который вы бы хотели пометить, если бы он был найден в производстве...


Отвечая на этот комментарий:

Есть ли хороший способ определить, когда заканчивается определение интерфейса? Похоже, что все строки интерфейса смещены на один пробел, но я не уверен, является ли это стандартным для всех конфигураций

Да, Cisco IOS всегда снимает отступы с дочерних элементов конфигурации на дополнительный пробел... независимо от того, является ли дочерний элемент оператором конфигурации интерфейса, IP расширенной ACL строкой и т.д...


End Notes

Note 1 Stack Exchange Disclaimer: Я - автор

.
3
ответ дан 3 December 2019 в 01:44

Поскольку в формате есть контекст, следует подумать о его разборе контекстом. Для этого может понадобиться написать больше кода. Рассмотрим вариант использования модели для вашего кода, которая строит объектную модель для глобального состояния, интерфейсов и т.п.

Оперативно, удаление несоответствующих настроек из отключенных интерфейсов может быть хорошей идеей в случае, если кто-то их включит.

.
1
ответ дан 3 December 2019 в 01:44

Теги

Похожие вопросы