Я пытаюсь написать сценарий, который будет извлекать файлы конфигурации через SSH из маршрутизаторов Cisco и анализировать их, чтобы я мог убедиться, что они соответствуют предопределенным стандартам (например, пароль не должен быть "cisco").
Подключиться к маршрутизаторам и запустить команды программно просто. Барьер, с которым я сталкиваюсь, - это бег show running config
возвращает глобальные настройки конфигурации, а также настройки для определенных интерфейсов.
Моя цель состояла в том, чтобы управлять настройками интерфейсов иначе, чем глобальными настройками; например, я могу игнорировать плохие настройки на отключенных интерфейсах.
Существуют ли отдельные команды для получения глобальных настроек и определения интерфейсов (например, show global settings
и show interface settings
тип команд)? В качестве альтернативы, есть ли лучший способ получить эту информацию, который упростил бы анализ?
В качестве альтернативы, есть ли лучший способ получить эту информацию, который упростил бы анализ?
Разбор конфигураций маршрутизатора / коммутатора довольно сложен из-за уровней иерархии в конфигурациях IOS; по возможности используйте инструмент, который специализируется на синтаксическом анализе. Одним из таких инструментов является ciscoconfparse (документы Вот) Примечание 1. ciscoconfparse имеет целую батарею модульных тестов, которые гарантируют, что синтаксический анализ остается согласованным между версиями инструмента.
Предполагая, что конфигурация входит в точный формат используется Cisco IOS show running-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
!
Вы можете использовать скрипт или интерпретатор python чтобы получить IP-адрес и carrier-delay
в собственных представлениях Python ...
[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
, как показано выше ...
Моя цель состояла в том, чтобы управлять настройками интерфейсов иначе, чем глобальными настройками; например, я могу игнорировать плохие настройки на отключенных интерфейсах.
Существуют ли отдельные команды для получения глобальных настроек и определений интерфейса (например, команды show global settings и show interface settings type)?
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 из интерфейса командной строки ... например ...
EDGE01.PUB.DEN#show runn | include ^enable
enable secret 5 $1$mOmQ$sORLRqZQZ/cr7KSyrXUPZ.
EDGE01.PUB.DEN#
К вашему сведению, это хеш MD5 для пароля включения "cisco", который вы хотите отметить, если он будет найден в производстве ...
В ответ на этот комментарий:
Есть ли хороший способ определить, когда заканчивается определение интерфейса? Похоже, что все строки интерфейса имеют отступ одним пробелом, но я не уверен, что это стандартно для конфигураций.
Да, Cisco IOS всегда отступает от дочерних элементов конфигурации дополнительным пробелом ... независимо от того, является ли дочерний элемент оператором конфигурации интерфейса, расширенной линией ACL IP и т. Д.
Конечные заметки
Примечание 1 Заявление об отказе от ответственности Stack Exchange: Я автор.
Поскольку в формате есть контекст, вам следует рассмотреть возможность его контекстного анализа. Для этого вам может потребоваться написать больше кода. Рассмотрите возможность использования модели для вашего кода, которая создает объектную модель для глобального состояния, интерфейсов и т. Д.
С эксплуатационной точки зрения, удаление несовместимых настроек с отключенных интерфейсов может быть хорошей идеей, если кто-то их включит.