背景
- Cisco NX-SDK允许开发定制应用程序,这些应用程序可以运行在Nexus 9000和Nexus 3000的NX-OS平台上。NX-SDK为客户提供了创建自己的CLI命令和输出、生成响应特定事件的定制系统日志、流定制遥测等功能。
使用NX-SDK开发Python应用程序
启用NX-SDK
要运行任何NX-SDK应用程序,必须首先在设备上启用NX-SDK功能:
switch(config)#feature nxsdk
创建一个Python文件
- 可以使用NX-OS Bash shell创建和编辑Python文件。为了使用Bash shell,必须首先在设备上启用它:
switch(config)#feature bash-shell
- 输入Bash shell并使用vi文本编辑器创建和编辑Python文件:
switch(config)
#run bash bash-4.2 $ vi /isan/bin/nxsdk-app.py
注意:最佳做法是在/ isan / bin / 目录中创建Python文件。Python文件需要执行权限才能运行 - 不要将Python文件放在/ bootflash 目录或其任何子目录中。
不需要通过NX-OS创建和编辑Python文件。开发人员可以使用他们的本地环境创建应用程序,并使用他们选择的文件传输协议将完成的文件传输到设备。但是,对于开发人员来说,使用NX-OS实用程序对其脚本进行调试和故障排除可能更有效。
实施NX-SDK组件
- 建议从NX-SDK GitHub 开始创建NX-SDK Python应用程序。
- NX-SDK Python应用程序需要四个主要组件:
- 必须通过import nx_sdk_py语句将NX-SDK导入应用程序。
- 一个函数(通常名为sdkThread),用于启动NX-SDK应用程序并修改与应用程序相关的各种选项。
- 创建自定义CLI命令以及sdkThread 函数中自定义CLI命令语法的定义。
- 一个名为pyCmdHandler的类 ,其方法名为postCliCb,它处理由NX-SDK应用程序添加的自定义CLI命令。
sdkThread功能
- (thread线程)
- 功能:用于启动NX-SDK应用程序并修改与应用程序相关的各种选项。
- 所有Python NX-SDK应用程序都要调用nx_sdk_py库中的三个方法:
sdk = nx_sdk_py.NxSdk.getSdkInst(len(sys.argv),sys.argv)
- 这是第一步。
- 返回SDK实例对象,表示NX-SDK应用程序已成功注册NX-OS基础结构。
- 返回None,注册过程发生错误。
sdk.startEventLoop()
- 倒数第二步。
- 启动NX-SDK应用程序,并允许它与NX-OS基础结构进行交互。
nx_sdk_py.NxSdk .__ swig_destroy __(sdk)
- 最后一步。
- 允许NX-SDK应用程序的正常退出。
- 常用的一些方法:
tmsg = sdk.getTracer()
- 返回NxTrace对象,用于生成自定义系统记录,并将事件和错误记录到应用程序的事件历史记录中。
- 自定义系统日志将显示在设备的系统日志中,通过
show logging logfile
命令可见。 - 记录到应用程序事件历史记录的事件可通过
show <application-name> nxsdk event-history events
或show <application-name> nxsdk event-history errors
命令。 - 例如:通过
show Transceiver_DOM.py nxsdk event-history events
和show Transceiver_DOM.py nxsdk event-history errors
查看名为Transceiver_DOM.py的应用程序的事件历史记录。
cliP = sdk.getCliParser()
- 该对象可用于执行存在的CLI命令以及创建自定义CLI命令。
cliP.execShowCmd(“cmd”,return_type)
- exec执行。
cmd
:show命令return_type
有R_TEXT
、R_JSON
或R_XML
。如nx_sdk_py.R_JSON
.- 先确认是否支持JSON和XML,使用
show mac address-table dynamic | json
,如果输出JSON格式,则支持。
- 先确认是否支持JSON和XML,使用
cliP.execConfigCmd(cmd_filename)
cmd_filename
:包含由行分隔的命令的文件的绝对文件路径。- 返回一个字符串,成功“SUCCESS”,失败描述异常。
sdk.setAppDesc('description string')
- 设置一个简短的描述。显示在通过CLI上的问号访问的NX-OS上下文相关帮助菜单中。
-
N9K-C93180LC-EX# show Tra?
track Tracking information
Transceiver_DOM.py Returns all interfaces with DOM-capable transceivers inserted
-
- 设置一个简短的描述。显示在通过CLI上的问号访问的NX-OS上下文相关帮助菜单中。
cliP.addToParseTree()
- 倒数第三步
- 将NxCliParser对象添加到NX-OS CLI解析器树,以便用户可以看到自定义CLI命令。
sdk.getAppName()
- 返回APP名称。
创建自定义CLI命令
- 在使用NX-SDK的Python应用程序中,在sdkThread函数中创建和定义自定义CLI命令。有两种类型的命令:显示命令和配置命令。
- show:命令显示有关设备,其配置或其环境的信息。
- config:命令可更改设备的配置,从而修改设备对周围网络的反应。
import nx_sdk_py
sdk = nx_sdk_py.NxSdk.getSdkInst(len(sys.argv), sys.argv)
# 该对象可用于执行已存在的CLI命令以及创建自定义CLI命令
cliP = sdk.getCliParser()
# 创建show命令:
nxcmd1 = cliP.newShowCmd("cmd_name","syntax")
# 创建config命令:
nxcmd2 = cliP.newConfigCmd("cmd_name","syntax")
-
nxcmd1 = cliP.newShowCmd("cmd_name","syntax")
syntax
:描述了什么关键字和参数可以在命令中使用。- 例如:show ip route 192.168.1.0中的192.168.1.0。show mac address-table dynamic中的dynamic。
- 返回NxCliCmd对象,函数
cliP.newCliCmd(“cmd_type”,“cmd_name”,“syntax”)
的子类。
-
nxcmd1.updateParam("<parameter>","help_str",type)
<parameter>
:命令参数的名称。help_str
:设置自定义命令的帮助字符串,并显示在通过CLI上的问号访问的NX-OS上下文相关帮助菜单中type
参数中指定的参数的有效类型:- P_INTEGER - 指定任何整数
- P_STRING - 指定任何字符串
- P_INTERFACE - 指定任何网络接口
- P_IP_ADDR - 指定任何IP地址
- P_MAC_ADDR - 指定任何MAC地址
- P_VRF - 指定任何虚拟路由和转发(VRF)实例
- 如
nx_sdk_py.P_IP_ADDR)
-nxcmd1.updateKeyword("keyword","help_str",is_key)
keyword
要修改的命令关键字的名称is_key
是一个可选的布尔值,默认为False。如果is_key为True,则使用此关键字的命令创建的唯一配置不会覆盖该命令创建的其他唯一配置。
-
船舰自定义CLI命令后,需要创建
pyCmdHandler
类的对象,并将其设为NxCliParser对象的CLI回调处理程序对象。具体如下:
cmd_handler = pyCmdHandler()
cliP.setCmdHandler(cmd_handler)
pyCmdHandler类
class pyCmdHandler(nx_sdk_py.NxCmdHandler):
def postCliCb(self,clicmd):
:定义了在sdkThread函数中定义的定义CLI命令在设备上的行为。- 返回一个布尔值。True,指该命令已成功执行。
clicmd
:使用在sdkThread函数中创建命令时为该命令定义的惟一名称。例如在sdkThread中创建了一个命令show_xcvr_dom,则clicmd.getCmdName()是这个名字。根据名成定义行为。
def postCliCb(self,clicmd): if "show_port_bw_util_cmd" in clicmd.getCmdName(): port = nx_sdk_py.void_to_string(clicmd.getParamValue("<port>")) if port: clicmd.printConsole("Executed show_port_bw_util_cmd for port: %s" % port) elif "port_bw_threshold_cmd" in clicmd.getCmdName():
nx_sdk_py.void_to_int
将值转换为整数类型。nx_sdk_py.void_to_string
将值转换为字符串类型。
pyCmdHandler类举例
- ip_move:跟踪Cisco Nexus上各接口之间用户指定的IP地址的移动
自定义CLI命令语法示例
关键字
此show命令接受单个关键字mac并添加一个帮助字符串。
nx_cmd = cliP.newShowCmd("show_misprogrammed", "mac")
nx_cmd.updateKeyword("mac", "Shows all misprogrammed MAC addresses on this device")
单参数
此命令使用单个参数< mac >,(<>表示这是一个参数)。参数中添加了一个用于检查错误编程的MAC地址辅助字符串。
nx_sdk_py.P_MAC_ADDR
参数用于将参数的类型定义为MAC地址,从而防止最终用户输入其他类型,例如字符串,整数或IP地址。
nx_cmd = cliP.newShowCmd("show_misprogrammed_mac", "<mac>")
nx_cmd.updateParam("<mac>", "MAC address to check for misprogramming", nx_sdk_py.P_MAC_ADDR)
可选关键字或参数
- 可选加外面加[]。
nx_cmd = cliP.newShowCmd( "show_misprogrammed_mac" , "[mac]" )
nx_cmd = cliP.newShowCmd("show_misprogrammed_mac", "[<mac>]")
单关键字和参数
nx_cmd = cliP.newShowCmd("show_misprogrammed", "mac <mac-address>")
nx_cmd.updateKeyword("mac", "Check MAC address for misprogramming")
nx_cmd.updateParam("<mac-address>", "MAC address to check for misprogramming", nx_sdk_py.P_MAC_ADDR)
多个关键字和参数
nx_cmd = cliP.newShowCmd("show_misprogrammed", "(mac <mac-address> | ip <ip-address>)")
nx_cmd.updateKeyword("mac", "Check MAC address for misprogramming")
nx_cmd.updateParam("<mac-address>", "MAC address to check for misprogramming", nx_sdk_py.P_MAC_ADDR)
nx_cmd.updateKeyword("ip", "Check IP address for misprogramming")
nx_cmd.updateParam("<ip-address>", "IP address to check for misprogramming", nx_sdk_py.P_IP_ADDR)
具有可选关键字的多个关键字和参数
nx_cmd = cliP.newShowCmd("show_misprogrammed", "(mac <mac-address> | ip <ip-address>) [clear]")
nx_cmd.updateKeyword("mac", "Check MAC address for misprogramming")
nx_cmd.updateParam("<mac-address>", "MAC address to check for misprogramming", nx_sdk_py.P_MAC_ADDR)
nx_cmd.updateKeyword("ip", "Check IP address for misprogramming")
nx_cmd.updateParam("<ip-address>", "IP address to check for misprogramming", nx_sdk_py.P_IP_ADDR)
nx_cmd.updateKeyword("clear", "Clears addresses detected to be misprogrammed")
具有可选参数的多个关键字和参数
nx_cmd = cliP.newShowCmd("show_misprogrammed", "(mac <mac-address> | ip <ip-address>) [<module>]")
nx_cmd.updateKeyword("mac", "Check MAC address for misprogramming")
nx_cmd.updateParam("<mac-address>", "MAC address to check for misprogramming", nx_sdk_py.P_MAC_ADDR)
nx_cmd.updateKeyword("ip", "Check IP address for misprogramming")
nx_cmd.updateParam("<ip-address>", "IP address to check for misprogramming", nx_sdk_py.P_IP_ADDR)
nx_cmd.updateParam("<module>", "Clears addresses detected to be misprogrammed", nx_sdk_py.P_INTEGER)