简介
本文档简要介绍思科IOS® XR中的gNMI,以及如何使用PYANG和检查模型树。
先决条件
要求
Cisco 建议您了解以下主题:
- Cisco IOS XR平台。
- python。
- 网络管理协议。
使用的组件
本文档不限于适用于64位版本(eXR)的特定硬件版本。
本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始(默认)配置。如果您的网络处于活动状态,请确保您了解所有命令的潜在影响。
背景信息
gNMI定义
总的来说,有不同的网络配置协议,包括NETCONF、RESTCONF、gNMI(Google远程过程调用(gRPC)、gRPC网络管理接口)等。这些模型用于配置以管理网络设备,并始终致力于实现流程自动化。
这些协议使用不同的数据模型来允许用户了解网络设备进程,换句话说,它是一个结构化的信息,一个方案,用于规范化信息以及设备(在此例中为路由器)消耗信息的方式。
gNMI监控数据处理,并提供RPC(远程过程调用)来控制网络中的不同设备。
gNMI有四个功能:
- 功能:gNMI向路由器询问安装在路由器中的型号,本文档将对此进行详细说明。
- Get:可以向路由器请求数据树中的每个枝叶组件,此操作将请求所请求的信息。
- 集:枝叶被视为变量,为它们提供更改功能,对此集操作辅助,允许用户更新数据模型中的值。
- 预订:在遥测技术中,此功能有助于从模型中的特定模块提取数据。
gNMI功能
网络管理协议 |
gNMI |
已利用传输 |
HTTP/2 |
支持者 |
供应商中立性 |
编码 |
Proto缓冲区 |
Proto Buff是在两台设备之间对数据进行反序列化和序列化的中性语言、平台方法,其中每个请求都有一个应答。
注意:有关gRCP和Proto Buff的更多详细信息,请点击下一个链接:grpc指南。
思科IOS XR中的gNMI基本配置
接下来是路由器的基本配置:
RP/0/RSP0/CPU0:XR(config)#grpc
RP/0/RSP0/CPU0:XR(config-grpc)#address-family ipv4
RP/0/RSP0/CPU0:XR(config-grpc)#max-request-total 256
RP/0/RSP0/CPU0:XR(config-grpc)#max-request-per-user 32
grpc
address-family ipv4
max-request-total 256
max-request-per-user 32
pYANG作为验证器
pYANG是用python编写的YANG验证器。此python库有助于检查YANG模型并了解它们。
要使此软件以文档(pYANG文档)中的形式运行,建议在计算机中创建虚拟环境。
为使虚拟环境运行venv文档
必须运行:
python -m venv <name of the directory>
例如(在MacOS终端中):
% mkdir test
% cd test
% python3 -m venv virtual_env
% ls
virtual_env
要在此虚拟环境cd中安装pYANG到目录并粘贴下一个:
% cd virual_env
% git clone https://github.com/mbj4668/pyang.git
% cd pyang
% pip install -e .
在本演示中,使用了python3 pip,一旦发出pip install -e,就将激活venv:source <virtual environment directory>/bin/activate(对于MacOS)。
% source virtual_env/bin/activate
% python3 -m pip install pyang
Collecting pyang
Downloading pyang-2.6.0-py2.py3-none-any.whl (594 kB)
|████████████████████████████████| 594 kB 819 kB/s
Collecting lxml
Downloading lxml-5.1.0-cp39-cp39-macosx_11_0_arm64.whl (4.5 MB)
|████████████████████████████████| 4.5 MB 14.2 MB/s
Installing collected packages: lxml, pyang
Successfully installed lxml-5.1.0 pyang-2.6.0
% pyang -h
Usage: pyang [options] [<filename>...]
Validates the YANG module in <filename> (or stdin), and all its dependencies.
Options:
-h, --help Show this help message and exit
-v, --version Show version number and exit
<snip>
安装pYANG并正常工作时,继续下载型号。
在下一个链接中,将显示思科IOS XR运行的所有型号:思科IOS XR型号。
建议git clone this model in the venv directory with the next code link: https://github.com/YangModels/yang.git
注意:激活虚拟环境后不会执行此操作。
% git clone https://github.com/YangModels/yang.git
Cloning into 'yang'...
remote: Enumerating objects: 54289, done.
remote: Counting objects: 100% (1910/1910), done.
remote: Compressing objects: 100% (323/323), done.
remote: Total 54289 (delta 1643), reused 1684 (delta 1586), pack-reused 52379
Receiving objects: 100% (54289/54289), 116.64 MiB | 8.98 MiB/s, done.
Resolving deltas: 100% (42908/42908), done.
Updating files: 100% (112197/112197), done.
再次激活虚拟环境并测试下一个查询:pyang -f tree yang/vendor/cisco/xr/711/Cisco-IOS-XR-ifmgr-cfg.yang。
(virtual_env) % pyang -f tree yang/vendor/cisco/xr/711/Cisco-IOS-XR-ifmgr-cfg.yang
yang/vendor/cisco/xr/711/Cisco-IOS-XR-ifmgr-cfg.yang:5: error: module "Cisco-IOS-XR-types" not found in search path
yang/vendor/cisco/xr/711/Cisco-IOS-XR-ifmgr-cfg.yang:8: error: module "cisco-semver" not found in search path
module: Cisco-IOS-XR-ifmgr-cfg
+--rw global-interface-configuration
| +--rw link-status? Link-status-enum
+--rw interface-configurations
+--rw interface-configuration* [active interface-name]
+--rw dampening
| +--rw args? enumeration
| +--rw half-life? uint32
| +--rw reuse-threshold? uint32
| +--rw suppress-threshold? uint32
| +--rw suppress-time? uint32
| +--rw restart-penalty? uint32
+--rw mtus
| +--rw mtu* [owner]
| +--rw owner xr:Cisco-ios-xr-string
| +--rw mtu uint32
+--rw encapsulation
| +--rw encapsulation? string
| +--rw capsulation-options? uint32
+--rw shutdown? empty
+--rw interface-virtual? empty
+--rw secondary-admin-state? Secondary-admin-state-enum
+--rw interface-mode-non-physical? Interface-mode-enum
+--rw bandwidth? uint32
+--rw link-status? empty
+--rw description? string
+--rw active Interface-active
+--rw interface-name xr:Interface-name
注意:请注意,枝叶的数据格式类似于String、uint32等;而根不会显示此信息。GET和SET等操作专用于提取/更新这些值。
另一个注意是大多数型号都需要增加才能具有完整配置,在CLI输出中提供了基本接口管理配置,如果需要显示IPv4,请使用以下命令:
% pyang -f tree yan2/vendor/cisco/xr/711/Cisco-IOS-XR-ifmgr-cfg.yang yan2/vendor/cisco/xr/711/Cisco-IOS-XR-ipv4-io-cfg.yang --path=yan2/vendor/cisco/xr/711
module: Cisco-IOS-XR-ifmgr-cfg
+--rw global-interface-configuration
| +--rw link-status? Link-status-enum
+--rw interface-configurations
+--rw interface-configuration* [active interface-name]
+--rw dampening
| +--rw args? enumeration
| +--rw half-life? uint32
| +--rw reuse-threshold? uint32
| +--rw suppress-threshold? uint32
| +--rw suppress-time? uint32
| +--rw restart-penalty? uint32
+--rw mtus
| +--rw mtu* [owner]
| +--rw owner xr:Cisco-ios-xr-string
| +--rw mtu uint32
+--rw encapsulation
| +--rw encapsulation? string
| +--rw capsulation-options? uint32
+--rw shutdown? empty
+--rw interface-virtual? empty
+--rw secondary-admin-state? Secondary-admin-state-enum
+--rw interface-mode-non-physical? Interface-mode-enum
+--rw bandwidth? uint32
+--rw link-status? empty
+--rw description? string
+--rw active Interface-active
+--rw interface-name xr:Interface-name
+--rw ipv4-io-cfg:ipv4-network
| +--rw ipv4-io-cfg:bgp-pa
| | +--rw ipv4-io-cfg:input
| | | +--rw ipv4-io-cfg:source-accounting? boolean
| | | +--rw ipv4-io-cfg:destination-accounting? boolean
| | +--rw ipv4-io-cfg:output
| | +--rw ipv4-io-cfg:source-accounting? boolean
| | +--rw ipv4-io-cfg:destination-accounting? boolean
| +--rw ipv4-io-cfg:verify
| | +--rw ipv4-io-cfg:reachable? Ipv4-reachable
| | +--rw ipv4-io-cfg:self-ping? Ipv4-self-ping
| | +--rw ipv4-io-cfg:default-ping? Ipv4-default-ping
| +--rw ipv4-io-cfg:bgp
| | +--rw ipv4-io-cfg:qppb
| | | +--rw ipv4-io-cfg:input
| | | +--rw ipv4-io-cfg:source? Ipv4-interface-qppb
| | | +--rw ipv4-io-cfg:destination? Ipv4-interface-qppb
| | +--rw ipv4-io-cfg:flow-tag
| | +--rw ipv4-io-cfg:flow-tag-input
| | +--rw ipv4-io-cfg:source? boolean
| | +--rw ipv4-io-cfg:destination? boolean
| +--rw ipv4-io-cfg:addresses
| | +--rw ipv4-io-cfg:secondaries
| | | +--rw ipv4-io-cfg:secondary* [address]
| | | +--rw ipv4-io-cfg:address inet:ipv4-address-no-zone
| | | +--rw ipv4-io-cfg:netmask inet:ipv4-address-no-zone
| | | +--rw ipv4-io-cfg:route-tag? uint32
| | +--rw ipv4-io-cfg:primary!
| | | +--rw ipv4-io-cfg:address inet:ipv4-address-no-zone
| | | +--rw ipv4-io-cfg:netmask inet:ipv4-address-no-zone
| | | +--rw ipv4-io-cfg:route-tag? uint32
| | +--rw ipv4-io-cfg:unnumbered? xr:Interface-name
| | +--rw ipv4-io-cfg:dhcp? empty
| +--rw ipv4-io-cfg:helper-addresses
| | +--rw ipv4-io-cfg:helper-address* [address vrf-name]
| | +--rw ipv4-io-cfg:address inet:ipv4-address-no-zone
| | +--rw ipv4-io-cfg:vrf-name xr:Cisco-ios-xr-string
| +--rw ipv4-io-cfg:forwarding-enable? empty
| +--rw ipv4-io-cfg:icmp-mask-reply? empty
| +--rw ipv4-io-cfg:tcp-mss-adjust-enable? empty
| +--rw ipv4-io-cfg:ttl-propagate-disable? empty
| +--rw ipv4-io-cfg:point-to-point? empty
| +--rw ipv4-io-cfg:mtu? uint32
+--rw ipv4-io-cfg:ipv4-network-forwarding
+--rw ipv4-io-cfg:directed-broadcast? empty
+--rw ipv4-io-cfg:unreachables? empty
+--rw ipv4-io-cfg:redirects? empty
在此查询中使用两个模型:Cisco-IOS-XR-ifmgr-cfg.yang和Cisco-IOS-XR-ipv4-io-cfg.yang,现在IPv4地址显示为叶节点。
注意:如果看到以下错误,例如:“yang/vendor/cisco/xr/711/Cisco-IOS-XR-ifmgr-cfg.yang:5: error: module "Cisco-IOS-XR-types" not found in search path”,请在命令中添加—path=。
完成并选中此操作后,任何用户都可以请求有关gNMI操作和更改日期的信息,对于更多示例,请点击以下链接:可编程性配置指南
如果用户想要运行一个简单的API,可以使用以下工具:grpcc。
此API通过NPM安装,这是在《可编程性配置指南》链接中使用的工具,所述链接分享更多示例供用户测试查询和回复。
故障排除:
对于gNMI,在收集任何条目之前需要检查查询,大多数API如:
All,显示路由器生成的错误。
例如:
"cisco-grpc:errors": {
"error": [
{
"error-type": "application",
"error-tag": "operation-failed",
"error-severity": "error",
"error-message": "'YANG framework' detected the 'fatal' condition 'Operation failed'"
}
]
}
}
或者
"error": [
{
"error-type": "application",
"error-tag": "operation-failed",
"error-severity": "error",
"error-path": <path>,
"error-message": "'sysdb' detected the 'warning' condition 'A verifier or EDM callback function returned: 'not found''"
}
]
这些是需要在路由器上检查的平台相关错误。建议检查查询中的命令是否也可以通过CLI在路由器中发出。
对于此类错误,或者任何其他与思科IOS XR平台相关的错误,请与TAC共享以下信息:
{
"Cisco-IOS-XR-ifmgr-cfg:interface-configurations":
{ "interface-configuration": [
{
"active": "act",
"interface-name": "Loopback0",
"description": "LOCAL TERMINATION ADDRESS",
"interface-virtual": [
null
],
"Cisco-IOS-XR-ipv4-io-cfg:ipv4-network": {
"addresses": {
"primary": {
"address": "172.16.255.1",
"netmask": "255.255.255.255"
}
}
}
}
]
}
}
- 显示的错误(以上所示的任何错误)。
- 发出下一条命令:
show grpc trace all
请多次测试该查询并重复“show grpc trace all”命令。
这些错误各不相同,但它们也显示了可能产生问题的组件:
例如:
- "'sysdb'检测到'warning'条件'返回了验证程序或EDEDM回调函数: 'not found'":此错误描述了sysdb,在路由器中为此进程收集show tech命令是必需的。
下一个示例显示了显示错误的show tech for sysdb进程。
show tech-support sysdb
对于此输出,错误显示一个组件,并且错误收集可能与所显示的错误相关的任何show tech-support。
- "'YANG framework'检测到'fatal'条件'Operation failed'":此错误未显示路由器中的进程,这意味着查询在模型中失败,请将此信息共享给TAC以查看可以失败的内容。
收集此信息后,还要添加下一组命令:
在XR VM中:
show tech-support tctcpsr
show tech-support grpcc
show tech-support gsp
show tech-support