シスコは世界中のユーザにそれぞれの言語でサポート コンテンツを提供するために、機械と人による翻訳を組み合わせて、本ドキュメントを翻訳しています。 ただし、最高度の機械翻訳であっても、専門家による翻訳のような正確性は確保されません。 シスコは、これら翻訳の正確性について法的責任を負いません。原典である英語版(リンクからアクセス可能)もあわせて参照することを推奨します。
このドキュメントに関しては個別の要件はありません。
このドキュメントの情報は、次のソフトウェアとハードウェアのバージョンに基づくものです。
switch(config)# feature nxsdk
switch(config)# feature bash-shell
switch(config)# run bash
bash-4.2$ vi /isan/bin/nxsdk-app.py
注: 最良の方法は /isan/bin/ ディレクトリの Python ファイルを作成することです。 Python ファイル必要実行権限動作するために- /bootflash ディレクトリまたはサブディレクトリの何れかに Python ファイルを置かないで下さい。
注: NX-OS によって Python ファイルを作成し、編集することを必要としません。 開発者はローカル環境を使用してアプリケーションを作成し、デバイスに選択のファイル転送プロトコルを使用して完了されたファイルを転送するかもしれません。 ただし、それは NX-OS ユーティリティを使用してスクリプトをデバッグしてトラブルシューティングを行うことは開発者用のより効率的であるかもしれません。
sdkThread 機能
注: NX-SDK v1.5.0 から始まって、本当場合の無効に する 有効に し、偽場合の高度例外を高度例外を第 3 ブール値パラメーターは NxSdk.getSdkInst 方式に渡すことができます。 この方式はここに文書化されています。
いくつかの広く使われたメソッドは下記のものを含んでいます:
注: R_JSON および R_XML データ 形式はコマンドがそれらの形式の出力をサポートする場合その時だけはたらきます。 NX-OS では、コマンドが要求されたデータ 形式ことをへ出力を配管することによって特定のデータ 形式の出力をサポートするかどうか確かめることができます。 配管されたコマンドが有意義な出力を戻す場合、そのデータ 形式はサポートされます。 たとえば、ダイナミック show mac アドレス テーブルを実行する場合 | NX-OS の json は JSON 出力を戻します、そして R_JSON データ 形式は NX-SDK で同様にサポートされます。
有用の場合もあるオプションのメソッドは次のとおりです:
N9K-C93180LC-EX# show Tra?
track Tracking information
Transceiver_DOM.py Returns all interfaces with DOM-capable transceivers inserted
NX-SDK の使用の Python アプリケーションでは、カスタム CLI コマンドは sdkThread 機能の内で作成され、定義されます。 コマンドには 2 つの型があります: Show コマンドおよび Config コマンド。
これら二つのメソッドは show コマンドおよび config コマンドの作成をそれぞれ可能にします:
注: このコマンドありますサブクラスの cliP.newCliCmd (どんなキーワードおよびパラメータがコマンドで使用することができるか cmd_type が CONF_CMD または SHOW_CMD であるところに「cmd_type」、「cmd_name」、「構文」は) (設定されるコマンドの種類によって)、cmd_name はカスタム NX-SDK アプリケーションに内部 コマンドの固有の名前および syntaxdescribes です。 このような理由で、このコマンドのための APIDOCUMENTATION は参照用のより有用であるかもしれません。
注: このコマンドありますサブクラスの cliP.newCliCmd (cmd_type が CONF_CMD または SHOW_CMD (どんなキーワードおよびパラメータがコマンドで使用することができるか設定されるコマンドの種類によって決まりますであるところに「cmd_type」、「cmd_name」、「構文」は))、cmd_name はカスタム NX-SDK アプリケーションに内部 コマンドの固有の名前および syntaxdescribes です。 このような理由で、このコマンドのための APIDOCUMENTATION は参照用のより有用であるかもしれません。
両タイプのコマンドに 2 つの異なるコンポーネントがあります: パラメータおよびキーワード:
1. パラメータはコマンドの結果を変更するのに使用される値です。 たとえば、コマンド show ip route 192.168.1.0 で、IP アドレスを受け入れるパラメータに先行しているルート キーワードがあります、含んでいるルーティングだけ提供された IP アドレス示す必要があること規定 する。
2. キーワードは単独で存在によってコマンドの結果を変更します。 たとえば、ダイナミック コマンド show mac アドレス テーブルでその動的に学習されした MAC アドレスだけ表示されるべきである規定 する ダイナミック キーワードがあります。
コンポーネントは両方とも NX-SDK コマンドの構文で作成されるとき定義されます。 NxCliCmd オブジェクトにおけるメソッドは両方のコンポーネントの特定の実装を修正するためにあります。
よく使われるコマンド コンポーネントのコード例を表示するために、カスタム セクション CLI コマンドこの資料の例を表示します。
カスタム CLI コマンドが作成された後、pyCmdHandler クラスからのオブジェクトはこので以降を NxCliParser オブジェクトのための CLI コールバック ハンドラ オブジェクトとして作成され、設定 される 資料必要性記述しました。 これは次の通り示されます:
cmd_handler = pyCmdHandler()
cliP.setCmdHandler(cmd_handler)
それから、NxCliParser オブジェクトはカスタム CLI コマンドがユーザに目に見えるように NX-OS CLI パーサー ツリーに追加される必要があります。 これは cliPis が sdk.getCliParser ()方式によって NxCliParser オブジェクト戻った cliP.addToParseTree ()コマンドで実行されます。
sdkThread 機能例
以前に説明される機能の使用の典型的な sdkThread 機能の例はここにあります。 この機能は(特に典型的なカスタム NX-SDK Python アプリケーションの内で)スクリプト実行でインスタンス化 されるグローバル変数を利用します。
cliP = "" sdk = "" event_hdlr = "" tmsg = "" def sdkThread(): global cliP, sdk, event_hdlr, tmsg sdk = nx_sdk_py.NxSdk.getSdkInst(len(sys.argv), sys.argv) if not sdk: return sdk.setAppDesc("Returns all interfaces with DOM-capable transceivers inserted") tmsg = sdk.getTracer() tmsg.event("[{}] Started service".format(sdk.getAppName())) cliP = sdk.getCliParser() nxcmd = cliP.newShowCmd("show_port_bw_util_cmd", "port bw utilization [<port>]") nxcmd.updateKeyword("port", "Port Information") nxcmd.updateKeyword("bw", "Port Bandwidth Information") nxcmd.updateKeyword("utilization", "Port BW utilization in (%)") nxcmd.updateParam("<port>", "Optional Filter Port Ex) Ethernet1/1", nx_sdk_py.P_INTERFACE) nxcmd1 = cliP.newConfigCmd("port_bw_threshold_cmd", "port bw threshold <threshold>") nxcmd1.updateKeyword("threshold", "Port BW Threshold in (%)") int_attr = nx_sdk_py.cli_param_type_integer_attr() int_attr.min_val = 1; int_attr.max_val = 100; nxcmd1.updateParam("<threshold>", "Threshold Limit. Default 50%", nx_sdk_py.P_INTEGER, int_attr, len(int_attr)) mycmd = pyCmdHandler() cliP.setCmdHandler(mycmd) cliP.addToParseTree() sdk.startEventLoop() # If sdk.stopEventLoop() is called or application is removed from VSH... tmsg.event("Service Quitting...!") nx_sdk_py.NxSdk.__swig_destroy__(sdk)
pyCmdHandler クラスは nx_sdk_py ライブラリ内の NxCmdHandler クラスから受継がれます。 pyCmdHandler クラスの内で定義される postCliCb (自己、clicmd)方式は時はいつでも NX-SDK アプリケーションから起きる CLI コマンド呼ばれます。 従って、postCliCb (自己、clicmd)方式は sdkThread 機能の内で定義されるカスタム CLI コマンドがデバイスでどのように動作するか定義するところにです。
postCliCb (自己、clicmd)関数の戻り値ブール値。 本当なら場合戻されます、コマンドがうまく実行されたことが推定されます。 コマンドが何らかの理由でうまく実行しなかった場合偽戻されるべきです。
clicmd パラメータは sdkThread 機能で作成されたときにコマンドのために定義された固有の名前を使用します。 たとえば show_xcvr_dom の固有の名前で新しい show コマンドを作成すれば、そして postCliCb (自己、clicmd)機能の同じ名前によってこのコマンドを示すことを推奨します clicmd 引数の名前は show_xcvr_dom が含まれているかどうか確認した後。 それはここに示されます:
def sdkThread(): <snip> sh_xcvr_dom = cliP.newShowCmd("show_xcvr_dom", "dom") sh_xcvr_dom.updateKeyword("dom", "Show all interfaces with transceivers that are DOM-capable") </snip> class pyCmdHandler(nx_sdk_py.NxCmdHandler): def postCliCb(self, clicmd): if "show_xcvr_dom" in clicmd.getCmdName(): get_dom_capable_interfaces()
コマンドが作成される場合、多分 postCliCb (パラメータを利用する自己、clicmd)機能のある時点でそれらのパラメータを使用する必要があります。 これは <parameter> がコマンドパラメータの名前である clicmd.getParamValue (「<parameter>」)方式と山形カッコ(<>)によって閉鎖の値を取得したいことすることができます。 この方式はここに文書化されています。 ただし、値はこのによって必要とする型に変換される機能必要を戻しました。 これはこれらのメソッドとすることができます:
postCliCb (自己、clicmd)機能(かそれに続く機能また)一般的に showコマンド出力がコンソールに印刷されるところです。 これは clicmd.printConsole ()方式とされます。
注: アプリケーションがエラー、処理されない例外、または終了に別の方法で突然出会えば、clicmd.printConsole ()機能からの出力はまったく表示されません。 従って Python アプリケーションをデバッグするとき、最良の方法は sdk.getTracer ()方式によって戻る NxTrace オブジェクトの使用の Syslog にログ デバッグ メッセージまたは使用プリント文にあり、Bash シェルの /isan/bin/python バイナリによってアプリケーションを実行します。
pyCmdHandler クラス例
次のコードは上述されている pyCmdHandler クラスの一例として動作します。 このコードは利用可能な IP 移動 NX-SDK アプリケーションの ip_move.py ファイルからここに奪取 されます。 このアプリケーションの目的は Nexus デバイスのインターフェイスを渡るユーザが定義する IP アドレスの移動をトラッキングすることです。 これをするために、コードは MAC アドレスはデバイスの MAC アドレス表のことを使用に常駐することデバイスの ARPキャッシュ内の <ip> パラメータによって入力される IP アドレスの MAC アドレスを見つけましたりそしてどの VLAN か確認します。 この MAC および VLAN を使用する、show system 内部 l2fm l2dbg macdb アドレス <mac> VLAN <vlan> コマンドはこの組み合せが最近関連付けられてしまった SNMP インターフェイス インデックスのリストを表示したものです。 コードはそれから show interface snmp ifIndex コマンドを人間読みやすいインターフェイス名に最近の SNMP インターフェイス インデックスを変換するのに使用します。
class pyCmdHandler(nx_sdk_py.NxCmdHandler): def postCliCb(self, clicmd): global cli_parser if "show_ip_movement" in clicmd.getCmdName(): target_ip = nx_sdk_py.void_to_string(clicmd.getParamValue("<ip>")) target_mac = get_mac_from_arp(cli_parser, clicmd, target_ip) mac_vlan = "" if target_mac: mac_vlan = get_vlan_from_cam(cli_parser, clicmd, target_mac) if mac_vlan: find_mac_movement(cli_parser, clicmd, target_mac, mac_vlan) else: print("No entires in MAC address table") clicmd.printConsole("No entries in MAC address table for {}".format(target_mac)) else: clicmd.printConsole("No entries in ARP table for {}".format(target_ip)) return True def get_mac_from_arp(cli_parser, clicmd, target_ip): exec_cmd = "show ip arp {}".format(target_ip) arp_cmd = cli_parser.execShowCmd(exec_cmd, nx_sdk_py.R_JSON) if arp_cmd: try: arp_json = json.loads(arp_cmd) except ValueError as exc: return None count = int(arp_json["TABLE_vrf"]["ROW_vrf"]["cnt-total"]) if count: intf = arp_json["TABLE_vrf"]["ROW_vrf"]["TABLE_adj"]["ROW_adj"] if intf.get("ip-addr-out") == target_ip: target_mac = intf["mac"] clicmd.printConsole("{} is currently present in ARP table, MAC address {}\n".format(target_ip, target_mac)) return target_mac else: return None else: return None else: return None def get_vlan_from_cam(cli_parser, clicmd, target_mac): exec_cmd = "show mac address-table address {}".format(target_mac) mac_cmd = cli_parser.execShowCmd(exec_cmd, nx_sdk_py.R_JSON) if mac_cmd: try: cam_json = json.loads(mac_cmd) except ValueError as exc: return None mac_entry = cam_json["TABLE_mac_address"]["ROW_mac_address"] if mac_entry: if mac_entry["disp_mac_addr"] == target_mac: egress_intf = mac_entry["disp_port"] mac_vlan = mac_entry["disp_vlan"] clicmd.printConsole("{} is currently present in MAC address table on interface {}, VLAN {}\n".format(target_mac, egress_intf, mac_vlan)) return mac_vlan else: return None else: return None else: return None def find_mac_movement(cli_parser, clicmd, target_mac, mac_vlan): exec_cmd = "show system internal l2fm l2dbg macdb address {} vlan {}".format(target_mac, mac_vlan) l2fm_cmd = cli_parser.execShowCmd(exec_cmd) if l2fm_cmd: event_re = re.compile(r"^\s+(\w{3}) (\w{3}) (\d+) (\d{2}):(\d{2}):(\d{2}) (\d{4}) (0x\S{8}) (\d+)\s+(\S+) (\d+)\s+(\d+)\s+(\d+)") unique_interfaces = [] l2fm_events = l2fm_cmd.splitlines() for line in l2fm_events: res = re.search(event_re, line) if res: day_name = res.group(1) month = res.group(2) day = res.group(3) hour = res.group(4) minute = res.group(5) second = res.group(6) year = res.group(7) if_index = res.group(8) db = res.group(9) event = res.group(10) src=res.group(11) slot = res.group(12) fe = res.group(13) if "MAC_NOTIF_AM_MOVE" in event: timestamp = "{} {} {} {}:{}:{} {}".format(day_name, month, day, hour, minute, second, year) intf_dict = {"if_index": if_index, "timestamp": timestamp} unique_interfaces.append(intf_dict) if not unique_interfaces: clicmd.printConsole("No entries for {} in L2FM L2DBG\n".format(target_mac)) if len(unique_interfaces) == 1: clicmd.printConsole("{} has not been moving between interfaces\n".format(target_mac)) if len(unique_interfaces) > 1: clicmd.printConsole("{} has been moving between the following interfaces, from most recent to least recent:\n".format(target_mac)) unique_interfaces = get_snmp_intf_index(unique_interfaces) clicmd.printConsole("\t{} - {} (Current interface)\n".format(unique_interfaces[-1]["timestamp"], unique_interfaces[-1]["intf_name"])) for intf in unique_interfaces[-2::-1]: clicmd.printConsole("\t{} - {}\n".format(intf["timestamp"], intf["intf_name"]))
def get_snmp_intf_index(if_index_dict_list): global cli_parser snmp_ifindex = cli_parser.execShowCmd("show interface snmp-ifindex", nx_sdk_py.R_JSON) snmp_ifindex_json = json.loads(snmp_ifindex) snmp_ifindex_list = snmp_ifindex_json["TABLE_interface"]["ROW_interface"] for index_dict in if_index_dict_list: index = index_dict["if_index"] for ifindex_json in snmp_ifindex_list: if index == ifindex_json["snmp-ifindex"]: index_dict["intf_name"] = ifindex_json["interface"] return if_index_dict_list
このセクションは cliP.newShowCmd ()またはクリップが sdk.getCliParser ()方式によって戻る NxCliParser オブジェクトである cliP.newConfigCmd ()メソッドでカスタム CLI コマンドを作成するとき使用される構文パラメータのいくつかの例を展示します。
注: 開始および右かっことの構文のためのサポートは NX-OS リリース 7.0(3)I7(3) に含まれている NX-SDK v1.5.0 で(「(」および「)」)導入されます。 開始および右かっこを利用する構文を含むのこれらの与えられた例従うときユーザが NX-SDK v1.5.0 を利用することが仮定されます。
この show コマンドは単一 キーワード MAC を奪取 し、キーワードに Shows の助手一連をこのデバイスのすべての misprogrammed MAC アドレス入力します。
nx_cmd = cliP.newShowCmd("show_misprogrammed", "mac")
nx_cmd.updateKeyword("mac", "Shows all misprogrammed MAC addresses on this device")
この show コマンドは単一パラメータ <mac> を奪取 します。 ワード MAC のまわりの囲むかぎカッコはこれがパラメータであることを示します。 ミスプログラミングがあるかどうか点検するべき MAC アドレスの助手一連はパラメータに入力されます。 nx_cmd.updateParam ()方式の nx_sdk_py。P_MAC_ADDR パラメータがストリング、整数、または IP アドレスのような別の型のエンドユーザ 入力を、防ぐ MAC アドレスとパラメータの種類を定義するのに使用されています。
nx_cmd = cliP.newShowCmd("show_misprogrammed_mac", "<mac>")
nx_cmd.updateParam("<mac>", "MAC address to check for misprogramming", nx_sdk_py.P_MAC_ADDR)
この show コマンドはオプションで単一 キーワード[MAC]奪取 するかもしれません。 ワード MAC のまわりの囲む角カッコはこのキーワードがオプションであることを示します。 shows の助手一連はキーワードにこのデバイスのすべての misprogrammed MAC アドレス入力されます。
nx_cmd = cliP.newShowCmd( "show_misprogrammed_mac" , "[mac]" )
nx_cmd.updateKeyword( "mac" , "Shows all misprogrammed MAC addresses on this device" )
この show コマンドはオプションで単一パラメータ[<mac>]奪取 するかもしれません。 ワード < MAC > のまわりの囲む角カッコはこのパラメータがオプションであることを示します。 ワード MAC のまわりの囲むかぎカッコはこれがパラメータであることを示します。 ミスプログラミングがあるかどうか点検するべき MAC アドレスの助手一連はパラメータに入力されます。 nx_cmd.updateParam ()方式の nx_sdk_py。P_MAC_ADDR パラメータがストリング、整数、または IP アドレスのような別の型のエンドユーザ 入力を、防ぐ MAC アドレスとパラメータの種類を定義するのに使用されています。
nx_cmd = cliP.newShowCmd("show_misprogrammed_mac", "[<mac>]")
nx_cmd.updateParam("<mac>", "MAC address to check for misprogramming", nx_sdk_py.P_MAC_ADDR)
この show コマンドはすぐにパラメータ <mac-address> に先行している単一 キーワード MAC を奪取 します。 ワード MAC アドレスのまわりの囲むかぎカッコはこれがパラメータであることを示します。 ミスプログラミングのためのチェック MAC アドレスの助手一連はキーワードに入力されます。 ミスプログラミングがあるかどうか点検するべき MAC アドレスの助手一連はパラメータに入力されます。 nx_cmd.updateParam ()方式の nx_sdk_py。P_MAC_ADDR パラメータはストリング、整数、または IP アドレスのような別の型のエンドユーザ 入力を、防ぐ 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)
この show コマンドはそれらに続く 2 つの異なるパラメータがある 2 つのキーワードの 1 つを奪取できます。 最初のキーワード MAC に <mac-address> のパラメータがあり、第 2 キーワード IP に <ip-address> のパラメータがあります。 ワード MAC アドレスおよび IP アドレスのまわりの囲むかぎカッコはパラメータであることを示します。 ミスプログラミングのためのチェック MAC アドレスの助手一連は MAC キーワードに入力されます。 ミスプログラミングがあるかどうか点検するべき MAC アドレスの助手一連は <mac-address> パラメータに入力されます。 nx_cmd.updateParam ()方式の nx_sdk_py。P_MAC_ADDR パラメータがストリング、整数、または IP アドレスのような別の型のエンドユーザ 入力を、防ぐ MAC アドレスと <mac-address> パラメータの種類を定義するのに使用されています。 misprograming のためのチェック IP アドレスの助手一連は IP キーワードに入力されます。 ミスプログラミングがあるかどうか点検するべき IP アドレスの助手一連は <ip-address> パラメータに入力されます。 nx_cmd.updateParam ()方式の nx_sdk_py。P_IP_ADDR パラメータが IP アドレスとストリング、整数、または IP アドレスのような別の型のエンドユーザ 入力を、防ぐ <ip-address> パラメータの種類を定義するのに使用されています。
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)
この show コマンドはそれらに続く 2 つの異なるパラメータがある 2 つのキーワードの 1 つを奪取できます。 最初のキーワード MAC に <mac-address> のパラメータがあり、第 2 キーワード IP に <ip-address> のパラメータがあります。 ワード MAC アドレスおよび IP アドレスのまわりの囲むかぎカッコはパラメータであることを示します。 ミスプログラミングのためのチェック MAC アドレスの助手一連は MAC キーワードに入力されます。 ミスプログラミングがあるかどうか点検するべき MAC アドレスの助手一連は <mac-address> パラメータに入力されます。 nx_cmd.updateParam ()方式の nx_sdk_py。P_MAC_ADDR パラメータがストリング、整数、または IP アドレスのような別の型のエンドユーザ 入力を、防ぐ MAC アドレスと <mac-address> パラメータの種類を定義するのに使用されています。 misprograming のためのチェック IP アドレスの助手一連は IP キーワードに入力されます。 ミスプログラミングがあるかどうか点検するべき IP アドレスの助手一連は <ip-address> パラメータに入力されます。 nx_cmd.updateParam ()方式の nx_sdk_py。P_IP_ADDR パラメータが IP アドレスとストリング、整数、または IP アドレスのような別の型のエンドユーザ 入力を、防ぐ <ip-address> パラメータの種類を定義するのに使用されています。 この show コマンドはオプションでキーワードをかもしれません[クリア]奪取 する。 ストリングが misprogrammed ために検出されるアドレスをクリアする助手はこの Optional キーワードに追加されます。
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")
この show コマンドはそれらに続く 2 つの異なるパラメータがある 2 つのキーワードの 1 つを奪取できます。 最初のキーワード MAC に <mac-address> のパラメータがあり、第 2 キーワード IP に <ip-address> のパラメータがあります。 ワード MAC アドレスおよび IP アドレスのまわりの囲むかぎカッコはパラメータであることを示します。 MAC キーワードに追加される misprogrammingis のためのチェック MAC アドレスの助手一連。 ミスプログラミングがあるかどうか点検するべき MAC アドレスの助手一連は <mac-address> パラメータに入力されます。 nx_cmd.updateParam ()方式の nx_sdk_py。P_MAC_ADDR パラメータがストリング、整数、または IP アドレスのような別の型のエンドユーザ 入力を、防ぐ MAC アドレスと <mac-address> パラメータの種類を定義するのに使用されています。 misprograming のためのチェック IP アドレスの助手一連は IP キーワードに入力されます。 ミスプログラミングがあるかどうか点検するべき IP アドレスの助手一連は <ip-address> パラメータに入力されます。 nx_cmd.updateParam ()方式の nx_sdk_py。P_IP_ADDR パラメータが IP アドレスとストリング、整数、または IP アドレスのような別の型のエンドユーザ 入力を、防ぐ <ip-address> パラメータの種類を定義するのに使用されています。 この show コマンドはオプションでパラメータ[<module>]奪取 するかもしれません。 助手ストリング 指定 モジュールにクリア アドレスだけこの省略可能なパラメーターに追加されます。
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)
NX-SDK Python アプリケーションが作成されたら、頻繁にデバッグされる必要があります。 NX-SDK はコードにシンタックスエラーがあるが、Python ライブラリに C++ ライブラリを変換するのに Python NX-SDK ライブラリががぶ飮みを利用するので知らせますコード 実行の時に見つけられるどの例外でもこれと同じようなアプリケーション コアダンプという結果に終ります:
terminate called after throwing an instance of 'Swig::DirectorMethodException'
what(): SWIG director method error. Error detected when calling 'NxCmdHandler.postCliCb'
Aborted (core dumped)
このエラー メッセージの曖昧な性質が原因で、Python アプリケーションをデバッグする最良の方法は sdk.getTracer ()方式によって戻る NxTrace オブジェクトの使用の Syslog へデバッグ メッセージを記録 することです。 これは次の通り示されます:
#! /isan/bin/python tracer = 0 def evt_thread(): <snip> tracer = sdk.getTracer() tracer.event("[NXSDK-APP][INFO] Started service") <snip> class pyCmdHandler(nx_sdk_py.NxCmdHandler): def postCliCb(self, clicmd): global tracer tracer.event("[NXSDK-APP][DEBUG] Received command: {}".format(clicmd)) if "show_test_command" in clicmd.getCmdName(): tracer.event("[NXSDK-APP][DEBUG] `show_test_command` recognized")
Syslog へのデバッグ メッセージを記録 することはオプションではないです場合、代替方式はプリント文を使用し、Bash シェルの /isan/bin/python バイナリによってアプリケーションを実行することです。 ただし、これらのプリント文からの出力はこのように実行されたとき目に見えますただ-アプリケーションを VSH シェルによって実行して出力を生成 しません。 プリント文を利用する例はここに示されています:
#! /isan/bin/python tracer = 0 def evt_thread(): <snip> print("[NXSDK-APP][INFO] Started service") <snip> class pyCmdHandler(nx_sdk_py.NxCmdHandler): def postCliCb(self, clicmd): print("[NXSDK-APP][DEBUG] Received command: {}".format(clicmd)) if "show_test_command" in clicmd.getCmdName(): print("[NXSDK-APP][DEBUG] `show_test_command` recognized")
Python アプリケーションが Bash シェルで十分にテストされ、配備の準備ができていれば、アプリケーションは VSH による本番にインストールする必要があります。 これはシステム スイッチオーバが二重スーパバイザ シナリオで行われる時アプリケーションが時デバイス読み込みまたは持続するようにします。 アプリケーションを VSH によって展開するために、NX-SDK および ENXOS SDK ビルド環境の使用で RPM パッケージを作成する必要があります。 容易な RPM パッケージ作成を可能にする Cisco DevNet は Docker イメージを提供します。
注: 支援に関しては Docker を特定のオペレーティング システムでインストールするために、Docker のインストール ドキュメントを参照して下さい。
Docker 可能なホストで、docker プル dockercisco/nxsdk の選択のイメージ バージョンを引っ張って下さい: <tag> が選択のイメージ バージョンのタグであるところ、<tag> コマンド。 利用可能なイメージ バージョンおよび対応する タグをここに表示できます。 これはここの v1 タグと示されます:
docker pull dockercisco/nxsdk:v1
このイメージからの nxsdk と指名されるコンテナーを開始し、それに接続して下さい。 選択のタグが異なっている場合、タグの v1 を代わりにして下さい:
docker run -it --name nxsdk dockercisco/nxsdk:v1 /bin/bash
NX-SDK の最新バージョンへのアップデートおよび NX-SDK ディレクトリへの移動は、それから git からの最新のファイルを引っ張ります:
cd /NX-SDK/
git pull
NX-SDK のより古いバージョンを使用する必要がある場合 git クローンとのそれぞれバージョン タグの使用の NX-SDK ブランチをクローンとして作ることができます- <version> が NX-SDK のバージョンである b v<version> https://github.com/CiscoDevNet/NX-SDK.git コマンド、必要とします。 これは NX-SDK v1.0.0 とここに示されます:
cd /
rm -rf /NX-SDK
git clone -b v1.0.0 https://github.com/CiscoDevNet/NX-SDK.git
次に、Docker コンテナーに Python アプリケーションを転送して下さい。 これをする少数のさまざまな方法があります。
root@2dcbe841742a:~# exit
[root@localhost ~]# docker cp /app/python_app.py nxsdk:/root/
[root@localhost ~]# docker start nxsdk
nxsdk
[root@localhost ~]# docker attach nxsdk
root@2dcbe841742a:/# ls /root/
python_app.py
次に、Python アプリケーションからの RPM パッケージを作成するために /NX-SDK/scripts/ にある rpm_gen.py スクリプトを使用して下さい。 このスクリプトに 1 つの要求される引数があり、2 つはスイッチを必要としました:
注: ファイル名は .py のようなファイル拡張子を、含まれている必要はありません。 この例では、ファイル名が python_app.py の代りに python_app、RPM パッケージは問題なしで生成されます。
rpm_gen.py スクリプトの使用はここに示されます。
root@7bfd1714dd2f:~# python /NX-SDK/scripts/rpm_gen.py test_python_app -s /root/ -u #################################################################################################### Generating rpm package... <snip> RPM package has been built #################################################################################################### SPEC file: /NX-SDK/rpm/SPECS/test_python_app.spec RPM file : /NX-SDK/rpm/RPMS/test_python_app-1.0-1.0.0.x86_64.rpm
RPM パッケージへのファイル パスは rpm_gen.py スクリプト出力最終的な行で示されます。 このファイルはホストに Docker コンテナーのアプリケーションを実行したいことそれが Nexus デバイスに転送することができるようにコピーする必要があります。 Docker コンテナーを終了した後、dockercp <container> と容易にすることができます: <container> が NX-SDK Docker コンテナーの名前(この場合、nxsdk)の <container_filepath> <host_filepath> コマンドは、<container_filepath> コンテナーの中の RPM パッケージの完全なファイル パス(この場合、/NX-SDK/rpm/RPMS/test_python_app-1.0-1.0.0.x86_64.rpm)であり、<host_filepath> は RPM パッケージがに転送される Docker ホストの完全なファイル パスです(この場合、/root/)。 このコマンドはここに示されます:
root@7bfd1714dd2f:/# exit [root@localhost ~]# docker cp nxsdk:/NX-SDK/rpm/RPMS/test_python_app-1.0-1.0.0.x86_64.rpm /root/ [root@localhost ~]# ls /root/ anaconda-ks.cfg test_python_app-1.0-1.0.0.x86_64.rpm
ファイル・トランスファーの好まれる方法の使用の Nexus デバイスにこの RPM パッケージを転送して下さい。 RPM パッケージがデバイスにあれば、SMU に同様にインストールされ、アクティブにする必要があります。 これは RPM パッケージがデバイスのブートフラッシュに転送されたと仮定して、次の通り示されます。
N9K-C93180LC-EX# install add bootflash:test_python_app-1.0-1.0.0.x86_64.rpm [####################] 100% Install operation 27 completed successfully at Tue May 8 06:40:13 2018 N9K-C93180LC-EX# install activate test_python_app-1.0-1.0.0.x86_64 [####################] 100% Install operation 28 completed successfully at Tue May 8 06:40:20 2018
注: インストール add コマンドで RPM パッケージをインストールするとき、パッケージの記憶装置および正確なファイル名を入れて下さい。 インストールの後で RPM パッケージをアクティブにするとき、記憶装置およびファイル名を入れないで下さい-パッケージの名前自体を使用して下さい。 非アクティブ コマンド提示インストールのパッケージ名を確認できます。
RPM パッケージがアクティブになれば、<application-name> が rpm_gen.py スクリプトが先に使用されたときに定義された、続いて、アプリケーション)および Python ファイル名の名前である nxsdk サービス <application-name> 構成コマンドで NX-SDK のアプリケーションを開始できます(。 これは次の通り示されます:
N9K-C93180LC-EX# conf Enter configuration commands, one per line. End with CNTL/Z. N9K-C93180LC-EX(config)# nxsdk service-name test_python_app % This could take some time. "show nxsdk internal service" to check if your App is Started & Runnning
アプリケーションがアップ、提示 nxsdk と内部サービス コマンドを実行し始めたことを確認できます:
N9K-C93180LC-EX# show nxsdk internal service NXSDK Started/Temp unavailabe/Max services : 1/0/32 NXSDK Default App Path : /isan/bin/nxsdk NXSDK Supported Versions : 1.0 Service-name Base App Started(PID) Version RPM Package ------------------------- --------------- ----------------- ---------- ------------------------ test_python_app nxsdk_app4 VSH(23195) 1.0 test_python_app-1.0-1.0.0.x86_64
またこのアプリケーションによって作成されるカスタム CLI コマンドが NX-OS でアクセス可能であることを確認できます:
N9K-C93180LC-EX# show test? test_python_app Nexus Sdk Application