首页 > 解决方案 > 有没有办法在 TextFSM 的状态更改中继续使用同一行?

问题描述

我知道我不能将状态转换与 continue 语句结合起来。

我正在尝试使用 ansible 解析网络配置,其中行的唯一明确的结尾是下一个的开头。

例如,我想解析如下配置:

line vty 0 4
 exec-timeout 30 0
 authorization exec MIRADIUS
 accounting connection MIRADIUS
 accounting exec MIRADIUS
 login authentication MIRADIUS
line vty 5 16
 access-class 95 in vrf-also
 exec-timeout 30 0
 authorization exec MIRADIUS
 accounting connection MIRADIUS
 accounting exec MIRADIUS
 login authentication MIRADIUS
 history size 25
 transport input ssh
line vty 15 116
 access-class 95 in
 exec-timeout 30 0
 authorization exec MIRADIUS
 accounting connection MIRADIUS
 accounting exec MIRADIUS
 login authentication MIRADIUS
 history size 25

我正在使用的模板:

Value Required LINE (\d+\s+\d+)
Value vtyAcl (\d+|\w+)
Value aclDir (\w+)
Value vrfAlso (\w+-\w+)

Start
  ^\s+access-class\s+${vtyAcl}\s+${aclDir}\s+${vrfAlso}.*$$
  ^\s+access-class\s+${vtyAcl}\s+${aclDir}.*$$
  ^line vty ${LINE}.*$$ -> Continue.Record

因此,我必须知道我完成vty 0 4的唯一确定方法是vty 5 16启动。

那么,为了保存新的vty,是否可以继续使用该行?目前我的模板正在将上一行的配置保存在下一行中。我无法知道最后一行的可能性。

Current result:
[
    {
        "LINE": "0 4",
        "aclDir": "",
        "vrfAlso": "",
        "vtyAcl": ""
    },
    {
        "LINE": "5 16",
        "aclDir": "",
        "vrfAlso": "",
        "vtyAcl": ""
    },
    {
        "LINE": "15 116",
        "aclDir": "in",
        "vrfAlso": "vrf-also",
        "vtyAcl": "95"
    }
]

Desired Result:
[
    {
        "LINE": "0 4",
        "aclDir": "",
        "vrfAlso": "",
        "vtyAcl": ""
    },
    {
        "LINE": "5 16",
        "aclDir": "in",
        "vrfAlso": "vrf-also",
        "vtyAcl": "95"
    },
    {
        "LINE": "15 116",
        "aclDir": "in",
        "vrfAlso": "",
        "vtyAcl": "95"
    }
]

更新:这里是针对此特定问题的解决方案的更新。谢谢。

Value Required LINE (\d+\s+\d+)
Value vtyAcl (\d+|\w+)
Value aclDir (\w+)
Value vrfAlso (\w+-\w+)

Start
  ^line vty -> Continue.Record
  ^\s+access-class\s+${vtyAcl}\s+${aclDir}\s+${vrfAlso}.*$$
  ^\s+access-class\s+${vtyAcl}\s+${aclDir}.*$$
  ^line vty ${LINE}.*$$ 

标签: pythonnetworkingansibleciscopython-textfsm

解决方案


我一直在寻找同一个问题的答案,但没有找到(只找到你的问题:))。AFAIK:

  1. TextFSM 不支持 Lookahead/Lookbehind 正则表达式功能。
  2. 正如您已经写的那样,TextFSM 不支持 Record+Continue(状态更改),正如他们的文档中所述:“请注意,继续操作不接受状态转换。这确保了状态机是无循环的。”
  3. 如果在“line vty X Y”行之前有一个空字符串(或任何其他信息块的分隔符),我们可以使用 TextFSM 的状态。

我现在使用什么解决方法 - 因此我使用了几个模板,模板提取 VTY 编号和此行的 ONE 参数。然后将结果组合在一起。

但是在您的情况下,每个“line vty X Y”块只有一个“有趣”行,并且该行不是“line vty X Y”块中的最后一行,因此您可以使用正确的正则表达式(我稍微更正了您的模板- vrf 也“可能”或“可能不”存在)和一点 TextFSM 技巧。:)

Value Required LINE (\d+\s+\d+)
Value vtyAcl (\d+|\w+)
Value aclDir (\w+)
Value vrfAlso (\w+-\w+)

Start
  ^line vty ${LINE}.*$$
  ^\s+access-class\s+${vtyAcl}\s+${aclDir}\s*(${vrfAlso})?.*$$ -> Record
  ^.* -> Record

EOF

在这里,我们使用“^.* -> Record”来记录没有“interesting”字符串的行。

你会得到你想要的结果(我想):

LINE    vtyAcl    aclDir    vrfAlso
------  --------  --------  ---------
0 4
5 16    95        in        vrf-also
15 116  95        in

不幸的是,就我而言,我有多个“有趣”的字符串,它们可能是一个块中的最后一个,所以它对我不起作用。:(

更新:我无意中发现了 TextFSM 的展望方式。它让我知道如何为我的任务找到解决方案,这里描述了主要思想:https ://github.com/google/textfsm/issues/22


推荐阅读