有没有办法在 TextFSM 的状态更改中继续使用同一行?

Is there a way to Continue with the same line in State changes in 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"
    }
]

UPDATE:此处更新包含针对此特定问题的解决方案。谢谢

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}.*$$ 

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

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

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

但在您的情况下,每个“line vty X Y”块只有一个“有趣”行,并且该行不是“line vty X Y”块中的最后一行,因此您可以使用正确的 REGEX (我稍微更正了您的模板 - vrfAlso“可能”或“可能不”存在)和一些 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

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

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

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

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

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