网络工程师往往需要使用自动化的处理工具来减轻负担。其中对CLI的输出进行解析然后获取有效信息就是其中的自动化的关键。
TextFSM是Google发起的开源项目, 它的官方介绍Wiki里面介绍了几个基本使用方式。
这里是英文对网络工程师自动化的一些介绍。也有一些TextFSM的使用案例和介绍。
更多的使用案例在ntc-templates里面
语法介绍
文件后缀名称为 .textfsm
文件最基本的形态
Value name regex
Start
^Rule
其中Value
的格式如下
Value [option,[option...]] name regex
Value 代表的是定义名称,必须的
Options
Filldown
向下保留, 如果Record的时候Value的值为空,那么就取上一个Record中的值Fillup
向上保留, 如果Record的时候Value值为空,那么就取下一个Record中的值Required
表示为必须值,如果没有就不会记录List
代表Value是数组类型Key
没啥用
name 名称使用大写加下划线
regex 要获取的正则表达式
Start
是状态机的起始,必须要有,对应的EOF
是文件的末尾,可以隐藏掉。
Rule
必须以两个空格加一个^
开头作为起始,是对单行的正则表达式的匹配,要匹配的Value值用${name}
的方式包含。
Rule的结尾可以用 -> Action
的方式给出对应的动作,这个在原文中叫做Action in rules
Action
有三种:
L - Line Action
对input输入的动作R - Record Action
对记录的动作S - State Transition
对状态的转行
他们的连接方式是 -> L.R S
Line Action
Line Action 包含两个动作:
Next
这个是默认动作,表示读取读取下一行,并且从此状态机的头部开始重新匹配Continue
这个动作表示依旧保留这一行的读取状态,并且继续下一条Rule的匹配
其实就是Next
从头开始匹配下一行,Continue
是对匹配了的继续往下走
Record Action
Record Action 包含了四个动作
NoRecord
默认动作, 不做记录Record
所有值被记录写入下来,然后进入下一条记录Clear
清理掉除 Filldown 的所有值Clearall
清理掉所有值
State Transition
改变状态机
当匹配到之后,下一条将会到转到对应的状态下,并且在这个状态下重复。
需要注意的是状态不能与 Continue
连用。
Error Action
还有一个特殊的 Error Action,它会停止并且抛出异常textfsm.parser.TextFSMError
语法如下:
^regex -> Error [word|"string"]
常用写法
todo
只有需要单一条目
对于只需要一条记录就可以解决的问题
多条记录
数组记录
TODO
不规则记录
有状态转移,并且是最后一块,状态转移也不是必须的,比如下面的情况:
GigabitEthernet0/0/1 has 1 neighbors:
Neighbor index : 1
Chassis type :macAddress
Chassis ID :f55f-c2c5-e180
MED Device information
SoftwareRev :12.2(55)SE7
Model name :WS-C2960S-48LPS-L
GigabitEthernet0/0/2 has 1 neighbors:
Neighbor index : 1
Chassis type :macAddress
Chassis ID :f55f-c2c5-e180
GigabitEthernet0/0/3 has 1 neighbors:
Neighbor index : 1
Chassis type :macAddress
Chassis ID :f55f-c2c5-e180
MED Device information
SoftwareRev :12.2(55)SE7
Model name :WS-C2960S-48LPS-L
那么可以通过接口那一行来记录,并且Continue
然后再记录下现在的接口名称
Value INTF (\S+)
Value NUM (\d+)
Value MED (\S+)
Start
^.* has \d+ neighbors: -> Continue.Record
^${INTF} has ${NUM}
$MED Device -> Med
Med
^\s+Model name\s+:${MED} -> Start
很巧妙的逆向思维。
转移状态既要记录又要转移
System Power Information (Power 1 - OFFLINE)
----------------------------------------------------------------
System Power Information (Power 2 - ONLINE)
----------------------------------------------------------------
Status: Online
Description:
Work Status: Normal
Power in: Normal
比如这个例子,需要通过状态转移来记录,但是又需要记录状态转移的信息,那么可以通过Continue
来实现
以下textfsm为简化后的示例:
Value POWER_ID (\d+)
Value STATUS (\w+)
Value DESCRIPTION (\S+)
Value WORK_STATUS (\S+)
Value POWER_IN (\S+)
Start
^System\s+Power\s+Information\s+\(Power\s+${POWER_ID}\s+-\s+${STATUS}\) -> Long_Power_Info
Long_Power_Info
^System\s+Power -> Continue.Record
^System\s+Power\s+Information\s+\(Power\s+${POWER_ID}\s+-\s+${STATUS}\)
^\s*Description:\s+${DESCRIPTION}
^\s*Work\s+Status:\s+${WORK_STATUS}
^\s*Power\s+in:\s+${POWER_IN} -> Record Start
通过在状态里面的Continue.Record
来实现
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 365433079@qq.com