Я работаю с шаблонами Ansible и TextFSM (Python), чтобы динамически извлекать информацию LLDP из сетевых устройств, а затем применять вывод LLDP к тем же описаниям интерфейса устройств. В настоящее время у меня есть рабочая модель, однако мне нужно настроить то, что записано в описании интерфейса, чтобы соответствовать нашему соглашению об именах (hostname-interface), где имя хоста не может включать полное доменное имя, а интерфейс должен быть первыми тремя буквами интерфейса в нижнем case (в данном случае «eth») сразу же следует номер интерфейса (24). Конечный результат будет выглядеть как «lab-fr-sw01-eth24»
Я могу получить соответствующий штраф с (\ S +) для каждой переменной в шаблоне:
Value NEIGHBOR (\S+)
Value LOCAL_INTERFACE (\S+)
Value NEIGHBOR_INTERFACE (\S+)
Пример вывода CLI:
Et1 lab-fr-sw01.test.local Ethernet24 120
Единственная проблема с этим состоит в том, что иногда коммутатор вытягивает полное доменное имя для переменной «NEIGHBOR», как описано выше, а иногда нет. Прямо сейчас я пытаюсь написать определенный оператор регулярного выражения (шаблоны TextFSM используют только регулярное выражение) для каждой переменной. Для переменной соседа я пытаюсь сопоставить вторые непробельные символы до "." если это существует. До сих пор я был в состоянии точно захватить только локальный интерфейс (Et1) с помощью (^ \ S +), а затем, когда я пытаюсь получить только имя хоста с помощью ^ [^.] +, Я также включаю вывод локального интерфейса "Et1". Чтобы соответствовать, я использовал https://regex101.com
Et1 lab-fr-sw01.test.local Ethernet24 120
Where LOCAL_INTERFACE = Et1, --> (^\S+)
NEIGHBOR = lab-ew-sw01.test.local and --> ^[^.]+
NEIGHBOR_INTERFACE = Ethernet24 --> ?
Желаемый конечный результат, который будет записан в описание интерфейса устройства, будет выглядеть примерно как «lab-fr-sw01-eth24». Однако, поскольку у нас есть несколько сайтов, и каждое имя сайта включено в имя хоста, я не могу полагаться на попытку сопоставить имя хоста буква за буквой.