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

Python 有没有办法在TextFSM中继续使用同一行的状态更改?,python,networking,ansible,cisco,python-textfsm,Python,Networking,Ansible,Cisco,Python 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-c

我知道我不能将状态转换与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
因此,我必须知道的唯一确定的方法是,我已经完成了vty04,例如,vty516启动

因此,可以继续使用该行以保存新的vty? 当前我的模板正在nextone中保存前一行的配置。我没有办法知道哪条线是最后的可能

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

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

  • TextFSM不支持前向/后向正则表达式功能
  • 正如您已经写过的,TextFSM不支持记录+继续(状态更改),正如他们在文档中所述:“注意,继续操作不接受状态转换。这确保了状态机是无循环的。”
  • 如果在“line vty X Y”行之前有一个空字符串(或信息块的任何其他分隔符),我们可以使用TextFSM的states
  • 我现在使用的解决方法是什么?因此,我使用了几个模板,一个模板提取VTY编号和一个用于此行的参数。然后将结果组合在一起

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

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

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

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


    更新:我无意中发现了TextFSM的前瞻性方法。它让我知道了如何为我的任务找到解决方案,主要思想如下所述:

    谢谢,你的更新中的前瞻性解决方案确实是我一直在寻找的:D.将我的解决方案留在帖子中。
    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