python-textFSM разобрать несколько строк конфигурации

У меня есть задача разобрать конфигурацию Cisco ACE. Я использую модуль python textFSM. Этот шаблон должен анализировать "serverfarm " часть конфигурации:

Value Required Serverfarm_name (\S+)
Value load_balance_method (\S+)
Value probe_name (\S+)
Value List rserver_name (\S*)

Start
  ^serverfarm\s+host\s+$Serverfarm_name
  ^\s+predictor\s+$load_balance_method
  ^\s+probe\s+$probe_name
  ^\s+rserver\s+$rserver_name -> RServer

RServer
  ^\s+rserver\s+$rserver_name -> Continue.Record
  ^\s+inservice

Часть конфигурации Cisco ACE:......

serverfarm host SF-TEST1-3.8083
  predictor hash address source
  probe TEST-3.8083
  rserver lala_server438
    inservice
  rserver lala_server439
    inservice
serverfarm host SF-TEST1-4.8084
  predictor hash address source
  probe TEST-4.8084
  rserver lala_server438
    inservice
  rserver lala_server439
    inservice
serverfarm host SF-TEST1-5.8085
  predictor hash address source
  probe TEST-5.8085
  rserver lala_server438
    inservice
  rserver lala_server439
    inservice

......

После запуска сценария ace.py у меня нет желаемого результата в виде таблицы textFSM:

$ ./ace.py
 --- [2018-05-30 16:47:52.892697] --- Start Timestamp ---
 --- [+0.000116 sec] --- Parse: ./textFSM/ace_serverfarm_template.textfsm ---
['Serverfarm_name', 'load_balance_method', 'probe_name', 'rserver_name']
['SF-TEST1-3.8083', 'hash', 'TEST-3.8083', ['lala_server438', 'lala_server439']]
Write 1 records

В чем моя ошибка в файле шаблона? Как изменить это для того, чтобы разобрать каждую серверную ферму. (У меня только первая запись в результате)?

1 ответ

Вот некоторые вещи, которые следует учитывать

  1. Вы должны записывать, когда у вас есть все данные.
  2. Textfsm анализирует каждую строку за раз
  3. Поскольку у вас есть два экземпляра rserver_name, рассмотрите возможность использования параметра List для Value
  4. Что касается поля "Обязательное" - обычно FSM отбрасывает пустые строки при завершении, но здесь опция "Filldown" заполняет столбец "serverfarm", поэтому FSM сохранит непустую строку и сохранит ее, когда FSM завершится.. Чтобы исправить это, я использовал параметр Value - Required. Этот параметр указывает, что значение должно быть сопоставлено, иначе строка не будет сохранена. Здесь он гарантирует, что load_balance_method и probe_name оба содержат значение.
Value Filldown Serverfarm_name (\S+)
Value Required load_balance_method (\S+)
Value Required probe_name (\S+)
Value List rserver_name (\S+)

Start
  ^serverfarm\s+host\s+$Serverfarm_name
  ^\s+predictor\s+$load_balance_method
  ^\s+probe\s+$probe_name
  ^\s+rserver\s+$rserver_name -> RServer1

RServer1
  ^\s+rserver\s+$rserver_name
  ^\s+inservice -> RServer2

RServer2
  ^\s+rserver\s+$rserver_name -> RServer3

RServer3
  ^\s+inservice -> Record Start

Вывод:

[['SF-TEST1-3.8083', 'hash', 'TEST-3.8083', ['lala_server438', 'lala_server439']], ['SF-TEST1-4.8084', 'hash', 'TEST-4.8084', ['lala_server438', 'lala_server439']], ['SF-TEST1-5.8085', 'hash', 'TEST-5.8085', ['lala_server438', 'lala_server439']]]

Я нашел временное решение для этого, но было бы более удобно сделать поля столбцов rserver "Списком" rservers.

Временное решение:

Value Filldown Serverfarm_name (\S+)
Value Filldown load_balance_method (\S+)
Value Filldown probe_name (\S+)
Value Required rserver_name (\S+)

Start
  ^serverfarm\s+host\s+$Serverfarm_name
  ^\s+predictor\s+$load_balance_method
  ^\s+probe\s+$probe_name
  ^\s+rserver\s+$rserver_name -> Record RServer

RServer
  ^\s+rserver\s+$rserver_name
  ^\s+inservice -> Start

Но это даст больше строк в таблице FSM. Если я скажу 4 сервера для одного serverfarm, будет 4 строки.. не один.

Кто-то знает, как изменить шаблон, чтобы получить по одной строке на серверную ферму и список rservers в виде поля в последнем столбце "rserver_name"

Выход:

 --- [2018-05-30 20:07:53.906280] --- Start Timestamp ---
 --- [+0.000106 sec] --- Parse: ./textFSM/ace_serverfarm_template.textfsm ---
['Serverfarm_name', 'load_balance_method', 'probe_name', 'rserver_name']
['SF-TEST1-3.8083', 'hash', 'TEST-3.8083', 'lala_server438']
['SF-TEST1-3.8083', 'hash', 'TEST-3.8083', 'lala_server439']
['SF-TEST1-4.8084', 'hash', 'TEST-4.8084', 'lala_server438']
['SF-TEST1-4.8084', 'hash', 'TEST-4.8084', 'lala_server439']
['SF-TEST1-5.8085', 'hash', 'TEST-5.8085', 'lala_server438']
['SF-TEST1-5.8085', 'hash', 'TEST-5.8085', 'lala_server439']
Другие вопросы по тегам