python-textFSM解析多行配置

时间:2018-05-30 15:04:20

标签: python 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

模板文件中的错误是什么?如何更改它以解析每个服务器群。 (我结果只是第一次记录)?

2 个答案:

答案 0 :(得分:0)

我找到了临时解决方案,但是将rserver列字段作为" List"更方便。 of 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台服务器就会有4行......而不是1行。

有人知道如何更改模板,以便在每个服务器农场获得一行,并将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']

答案 1 :(得分:0)

这是您应该考虑的一些事情

  1. 所有数据都应记录。
  2. Textfsm会同时解析每一行
  3. 由于您有两个rserver_name实例,请考虑对值使用List选项
  4. 关于“必填”字段-通常,FSM在终止时将丢弃空行,但此处的“ Filldown”选项将填充“ serverfarm”列,因此FSM将保留一个非空行并将其保存FSM终止。为了解决此问题,我使用了“值”选项-必需。此选项指定必须匹配值,否则将不保存行。在这里,它确保“ 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']]]