规范拓扑管理器 - PTM

PTM 是一种动态布线验证工具,可以检测和消除错误。PTM 在 topology.dot 文件中使用 Graphviz-DOT 指定的网络布线计划,并将其与来自 LLDP 的运行时信息相结合,以验证布线是否与规范匹配。检查发生在网络中每个节点的每个链路转换时。

您可以自定义 topology.dot 文件,以在全局和网络级别以及节点和端口级别控制 PTM 服务 (ptmd)。

支持的功能

  • 使用 LLDP 进行拓扑验证。ptmd 服务创建到 LLDP 服务 (lldpd) 的客户端连接,并检索网络中节点或端口之间的邻居关系,并将其与 topology.dot 文件中指定的规定拓扑进行比较。
  • PTM 仅支持物理接口,例如 swp1 或 eth0。您不能在拓扑文件中指定虚拟接口,例如 bond 或子接口。
  • FRR 集成(PTM 到 FRR 的 BFD 状态通知)。
  • 客户端管理;ptmd 服务在启动时创建一个抽象命名套接字 /var/run/ptmd.socket。其他应用程序可以连接到此套接字以接收通知和发送命令。
  • 事件通知。
  • 使用 topology.dot 文件进行配置;请参见下文

配置 PTM

ptmd 服务根据 DOT 指定的网络图文件 /etc/ptm.d/topology.dot 验证物理网络拓扑。

PTM 支持 无向图

在启动时,ptmd 服务通过 Unix 套接字连接到 lldpd 服务,并检索邻居名称和端口信息。然后,它将检索到的端口信息与从拓扑文件中读取的配置信息进行比较。如果匹配,则为 PASS,否则为 FAIL

PTM 使用 PortID ifname TLV 信息执行其 LLDP 邻居检查。

ptmd 脚本

对于每个经历更改的接口,ptmd 服务在 /etc/ptm.d/if-topo-pass/etc/ptm.d/if-topo-fail 处执行脚本,并在 LLDP 或 BFD 检查通过时运行 if-topo-pass,或在检查失败时运行 if-topo-fails。这些脚本接收一个参数字符串,该字符串是 ptmctl 命令的结果;请参阅 下面的 ptmd 命令

您可以修改这些默认脚本。

配置参数

您可以在拓扑文件中配置 ptmd 参数。这些参数是仅主机参数、全局参数、每端口或节点参数以及模板。

仅主机参数

仅主机参数应用于运行 PTM 的整个主机。您可以包含 hostnametype 仅主机参数,该参数指定 PTM 在图形文件中查找 self-node 时是仅使用主机名 (hostname) 还是完全限定域名 (fqdn)。例如,在下面的图形文件中,PTM 忽略 FQDN,仅查找 switch04,因为那是它正在运行的交换机的主机名

  • 始终将主机名用双引号引起来;例如,"www.example.com" 以防止 ptmd 失败。
  • 为避免启动 ptmd 服务时出错,请确保 /etc/hosts/etc/hostname 都反映您在 topology.dot 文件中使用的主机名。

graph G {
          hostnametype="hostname"
          "cumulus":"swp44" -- "switch04.cumulusnetworks.com":"swp20"
          "cumulus":"swp46" -- "switch04.cumulusnetworks.com":"swp22"
}

在下一个示例中,PTM 使用 FQDN 进行比较,并查找 switch05.cumulusnetworks.com,这是它正在运行的交换机的 FQDN

graph G {
          hostnametype="fqdn"
          "cumulus":"swp44" -- "switch05.cumulusnetworks.com":"swp20"
          "cumulus":"swp46" -- "switch05.cumulusnetworks.com":"swp22"
}

全局参数

全局参数应用于拓扑文件中的每个端口。默认情况下 LLDP 处于启用状态;如果不存在关键字,PTM 将对所有端口使用默认值。

graph G {
          LLDP=""
          "cumulus":"swp44" -- "qct-ly2-04":"swp20"
          "cumulus":"swp46" -- "qct-ly2-04":"swp22"
}

每端口参数

每端口参数在端口级别提供更精细的控制。这些参数会覆盖任何全局或编译的默认值。例如

graph G {
          LLDP=""
          "cumulus":"swp44" -- "qct-ly2-04":"swp20"
          "cumulus":"swp46" -- "qct-ly2-04":"swp22"
}

模板

模板提供灵活性,以便您可以选择不同的参数组合并将它们应用于给定的端口。模板指示 ptmd 引用命名的参数字符串而不是默认字符串。在以下配置中,LLDP1 和 LLDP2 是 LLDP 参数的模板

例如

graph G {
          LLDP=""
          LLDP1="match_type=ifname"
          LLDP2="match_type=portdescr"
          "cumulus":"swp44" -- "qct-ly2-04":"swp20" [LLDP="lldptmpl=LLDP1"]
          "cumulus":"swp46" -- "qct-ly2-04":"swp22" [LLDP="lldptmpl=LLDP2"]
          "cumulus":"swp46" -- "qct-ly2-04":"swp22"
}

支持的 LLDP 参数

ptmd 支持以下 LLDP 参数

  • match_type,默认为接口名称 (ifname),但如果您希望 lldpd 将拓扑与端口描述而不是接口名称进行比较,则可以接受端口描述 (portdescr)。您可以全局或在每端口级别设置此参数。
  • match_hostname,默认为主机名 (hostname),但允许 PTM 使用 LLDP 提供的完全限定域名 (fqdn) 匹配拓扑。

以下是端口级别具有 LLDP 的拓扑示例

graph G {
          "cumulus-1":"swp44" -- "cumulus-2":"swp20" [LLDP="match_hostname=fqdn"]
          "cumulus-1":"swp46" -- "cumulus-2":"swp22" [LLDP="match_type=portdescr"]
}

当您指定 match_hostname=fqdn 时,PTM 会匹配整个 FQDN(在下面的示例中为 cumulus-2.domain.com)。如果您未指定 match_hostname 的值,PTM 将仅基于主机名(下面的 cumulus-3)进行匹配,并忽略 URL 的其余部分

graph G {
          "cumulus-1":"swp44" -- "cumulus-2.domain.com":"swp20" [LLDP="match_hostname=fqdn"]
          "cumulus-1":"swp46" -- "cumulus-3":"swp22" [LLDP="match_type=portdescr"]
}

BFD

BFD 提供低开销和快速检测两个网络设备之间路径中的故障。PTM 提供了一种统一的机制,用于检测所有介质和协议层上的链路,并与 FRR 集成以启用 BFD。使用 BFD 检测任何两个网络设备之间 IPv4 和 IPv6 单跳或多跳路径的故障,包括单向路径故障检测。有关配置 BFD 的信息,请参阅 BFD

您可以启用 PTM 以执行其他检查,以确保路由邻接关系仅在具有连通性且符合 PTM 定义的规范的链路上形成。

您只需要启用 PTM 来检查链路状态。您无需启用 PTM 来确定 BFD 状态。

cumulus@switch:~$ nv set router ptm enable
cumulus@switch:~$ nv config apply

要禁用检查链路状态

cumulus@switch:~$ nv unset router ptm enable
cumulus@switch:~$ nv config apply
cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# ptm-enable
switch(config)# end
switch# write memory
switch# exit
cumulus@switch:~$

要禁用检查链路状态,请设置 no ptm-enable 参数

cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# no ptm-enable
switch(config)# end
switch# write memory
switch# exit
cumulus@switch:~$

要检查接口上的 PTM 状态,请运行 vtysh show interface <interface> 命令。

cumulus@switch:~$ show interface swp51
Interface swp51 is up, line protocol is up
  Link ups:       0    last: (never)
  Link downs:     0    last: (never)
  PTM status: disabled
...

ptmd 服务命令

PTM 以 CSV 格式发送客户端通知。

要启动 ptmd 服务,请运行 sudo systemctl start ptmd.service 命令。topology.dot 文件必须存在才能启动服务。

cumulus@switch:~$ sudo systemctl start ptmd.service

要重启 ptmd 服务,请运行 sudo systemctl restart ptmd.service 命令

cumulus@switch:~$ sudo systemctl restart ptmd.service

要指示 ptmd 服务再次读取 topology.dot 文件以将新配置应用于运行状态而不重启,请运行 sudo systemctl reload ptmd.service 命令

cumulus@switch:~$ sudo systemctl reload ptmd.service

要停止 ptmd 服务,请运行 sudo systemctl stop ptmd.service 命令

cumulus@switch:~$ sudo systemctl stop ptmd.service

要检索 ptmd 服务的当前运行状态,请运行 sudo systemctl status ptmd.service 命令

cumulus@switch:~$ sudo systemctl status ptmd.service

ptmctl 命令

ptmctlptmd 服务的客户端,它检索交换机上配置的端口的操作状态以及来自 ptmd 的 BFD 会话信息。ptmctl 解析 ptmd 发送的 CSV 通知。有关更多信息,请参阅 man ptmctl

ptmctl 示例

以下示例包含 cbl status 列输出中的以下关键字

cbl 状态关键字定义
pass拓扑文件定义了接口,接口接收 LLDP 信息,并且接口的 LLDP 信息与拓扑文件中的信息匹配。
fail拓扑文件定义了接口,接口接收 LLDP 信息,并且接口的 LLDP 信息与拓扑文件中的信息不匹配。
N/A拓扑文件定义了接口,但接口未接收到 LLDP 信息。接口可能已关闭或断开连接,或者邻居未发送 LLDP 数据包。
N/Afail 状态可能指示需要调查的布线问题。
当您将 -l 选项与 ptmctl 一起使用时,不会显示 N/A 状态;输出仅显示正在接收 LLDP 信息的接口。

对于基本输出,请使用不带任何选项的 ptmctl

当您通过与 FRR 集成配置 BFD 时,PTM show 命令输出会显示 BFD 状态。

cumulus@switch:~$ sudo ptmctl

-------------------------------------------------------------
port  cbl     BFD     BFD                  BFD    BFD
      status  status  peer                 local  type
-------------------------------------------------------------
swp1  pass    pass    11.0.0.2             N/A    singlehop
swp2  pass    N/A     N/A                  N/A    N/A
swp3  pass    N/A     N/A                  N/A    N/A

要获得更详细的输出,请使用 -d 选项

cumulus@switch:~$ sudo ptmctl -d

--------------------------------------------------------------------------------------
port  cbl    exp     act      sysname  portID  portDescr  match  last    BFD   BFD
      status nbr     nbr                                  on     upd     Type  state
--------------------------------------------------------------------------------------
swp45 pass   h1:swp1 h1:swp1  h1       swp1    swp1       IfName 5m: 5s  N/A   N/A
swp46 fail   h2:swp1 h2:swp1  h2       swp1    swp1       IfName 5m: 5s  N/A   N/A

#continuation of the output
-------------------------------------------------------------------------------------------------
BFD   BFD       det_mult  tx_timeout  rx_timeout  echo_tx_timeout  echo_rx_timeout  max_hop_cnt
peer  DownDiag
-------------------------------------------------------------------------------------------------
N/A   N/A       N/A       N/A         N/A         N/A              N/A              N/A
N/A   N/A       N/A       N/A         N/A         N/A              N/A              N/A

要显示 ptmd 服务正在跟踪的活动 BFD 会话的信息,请使用 -b 选项

cumulus@switch:~$ sudo ptmctl -b

----------------------------------------------------------
port  peer        state  local         type       diag

----------------------------------------------------------
swp1  11.0.0.2    Up     N/A           singlehop  N/A
N/A   12.12.12.1  Up     12.12.12.4    multihop   N/A

要显示 LLDP 信息,请使用 -l 选项。输出仅显示 ptmd 服务正在跟踪的活动邻居。

cumulus@switch:~$ sudo ptmctl -l

---------------------------------------------
port  sysname  portID  port   match  last
                       descr  on     upd
---------------------------------------------
swp45 h1       swp1    swp1   IfName 5m:59s
swp46 h2       swp1    swp1   IfName 5m:59s

要显示 ptmd 服务正在跟踪的活动 BFD 会话的详细信息,请使用 -b-d 选项

cumulus@switch:~$ sudo ptmctl -b -d

----------------------------------------------------------------------------------------
port  peer                 state  local  type       diag  det   tx_timeout  rx_timeout
                                                          mult
----------------------------------------------------------------------------------------
swp1  fe80::202:ff:fe00:1  Up     N/A    singlehop  N/A   3     300         900
swp1  3101:abc:bcad::2     Up     N/A    singlehop  N/A   3     300         900

#continuation of output
---------------------------------------------------------------------
echo        echo        max      rx_ctrl  tx_ctrl  rx_echo  tx_echo
tx_timeout  rx_timeout  hop_cnt
---------------------------------------------------------------------
0           0           N/A      187172   185986   0        0
0           0           N/A      501      533      0        0

ptmctl 错误输出

如果拓扑文件中存在错误或没有会话,PTM 将返回相应的输出。典型的错误字符串是

Topology file error [/etc/ptm.d/topology.dot] [cannot find node cumulus] -
please check /var/log/ptmd.log for more info

Topology file error [/etc/ptm.d/topology.dot] [cannot open file (errno 2)] -
please check /var/log/ptmd.log for more info

No Hostname/MgmtIP found [Check LLDPD daemon status] -
please check /var/log/ptmd.log for more info

No BFD sessions . Check connections

No LLDP ports detected. Check connections

Unsupported command

例如

cumulus@switch:~$ sudo ptmctl
-------------------------------------------------------------------------
cmd         error
-------------------------------------------------------------------------
get-status  Topology file error [/etc/ptm.d/topology.dot]
            [cannot open file (errno 2)] - please check /var/log/ptmd.log
            for more info

如果您遇到 topology.dot 文件错误,可以使用 dot(包含在 Graphviz 包中)来验证拓扑文件的语法。

使用 Graphviz 打开拓扑文件,以确保该文件可读且文件格式正确。

如果您从 Windows 系统编辑 topology.dot 文件,请务必仔细检查文件格式;可能存在额外的字符,导致图形无法正常工作。

基本拓扑示例

以下示例显示了一个基本 DOT 文件及其对应的拓扑图。在所有交换机上使用相同的 topology.dot 文件,并且不要为每个设备拆分文件,以便通过在每个设备上使用完全相同的文件来实现轻松自动化。

graph G {
    "spine1":"swp1" -- "leaf1":"swp1";
    "spine1":"swp2" -- "leaf2":"swp1";
    "spine2":"swp1" -- "leaf1":"swp2";
    "spine2":"swp2" -- "leaf2":"swp2";
    "leaf1":"swp3" -- "leaf2":"swp3";
    "leaf1":"swp4" -- "leaf2":"swp4";
    "leaf1":"swp5s0" -- "server1":"eth1";
    "leaf2":"swp5s0" -- "server2":"eth1";
}

注意事项

端口描述中的逗号

如果 LLDP 邻居通告包含逗号的 PortDescr,则 ptmctl -d 会在逗号上拆分字符串,并将其组件错误地放置在其他列中。请勿在端口描述中使用逗号。