はじめに
本ドキュメントでは、NXOS で使用できる Python API について説明します。
Python API は Cisco NX-OS リリース9.3(5)以降、Python3がサポートしており、Python2.7は引き続きサポートされます。これから新しい script を作成する場合は python3 の使用を念頭に作成することをお勧めします。
Cisco Nexus 9000シリーズスイッチは、インタラクティブモードと非インタラクティブ(スクリプト)モードの両方でPython v2.7.11およびv3.7.3をサポートし、ゲストシェルで使用できます。
Pythonスクリプト機能により、デバイスのコマンドラインインターフェイス(CLI)にプログラムでアクセスして、さまざまなタスクやPower On Auto Provisioning(POAP)またはEmbedded Event Manager(EEM)アクションを実行できます。
CiscoPythonパッケージ
Cisco NX-OSは、インターフェイス、VLAN、VRF、ACL、ルートなど、多くのコアネットワークデバイスモジュールへのアクセスを可能にするCiscoPythonパッケージを提供します。help() コマンドを入力すると、CiscoPythonパッケージの詳細を表示できます。モジュール内のクラスとメソッドに関する追加情報を取得するには、特定のモジュールに対してhelpコマンドを実行できます。たとえば、help(cisco.interface)はcisco.interfaceモジュールのプロパティを表示します。
以下は、CiscoPythonパッケージに関する情報を表示する方法の例です。
N9K-C93240YC-FX2# python
Warning: Python 2.7 is End of Support, and future NXOS software will deprecate
python 2.7 support. It is recommended for new scripts to use 'python3' instead.
Type "python3" to use the new shell.
Python 2.7.11 (default, Jun 4 2020, 09:48:24)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cisco
>>> help(cisco)
Help on package cisco:
NAME
cisco
FILE
/isan/python/scripts/cisco/__init__.py
PACKAGE CONTENTS
acl
bgp
buffer_depth_monitor
以下略
CLI コマンド API の使用
from cli import * コマンドを使用して API を有効にした上で、以下のようなコマンドを入力した場合、E4/1 が shutdown されます。
>>> cli("conf t ; interface eth4/1 ; shut")
cli コマンドAPI は3つ存在しており、cli() / clid() / clip () が使用できます。
cli() は、制御文字または特殊文字を含む CLI コマンドの生の出力を返します。
clid() は、コマンドに XML サポートが存在する場合は、cli-command の JSON 出力を返します。
clip() は、CLI コマンドの出力を直接 stdout に出力し、Pythonには何も返しません。
非-インタラクティブ Python の使用
Python スクリプトは、Python CLI コマンドの引数として Python スクリプト名を指定することにより、非対話型モードで実行できます。Python スクリプトは、bootflash または volatile 配下に保存する必要があります。
以下は、第一引数で指定したインターフェイスのカウンターを、第二引数で指定した秒数毎に、第三引数で指定した回数分表示するサンプルコード deltaCounters.py です。
# deltaCounters.py
#!/isan/bin/python
from cli import *
import sys, time
ifName = sys.argv[1]
delay = float(sys.argv[2])
count = int(sys.argv[3])
cmd = 'show interface ' + ifName + ' counters'
out = json.loads(clid(cmd))
rxuc = int(out['TABLE_rx_counters']['ROW_rx_counters'][0]['eth_inucast'])
rxmc = int(out['TABLE_rx_counters']['ROW_rx_counters'][1]['eth_inmcast'])
rxbc = int(out['TABLE_rx_counters']['ROW_rx_counters'][1]['eth_inbcast'])
txuc = int(out['TABLE_tx_counters']['ROW_tx_counters'][0]['eth_outucast'])
txmc = int(out['TABLE_tx_counters']['ROW_tx_counters'][1]['eth_outmcast'])
txbc = int(out['TABLE_tx_counters']['ROW_tx_counters'][1]['eth_outbcast'])
print 'row rx_ucast rx_mcast rx_bcast tx_ucast tx_mcast tx_bcast'
print '========================================================='
print ' %8d %8d %8d %8d %8d %8d' % (rxuc, rxmc, rxbc, txuc, txmc, txbc)
print '========================================================='
i = 0
while (i < count):
time.sleep(delay)
out = json.loads(clid(cmd))
rxucNew = int(out['TABLE_rx_counters']['ROW_rx_counters'][0]['eth_inucast'])
rxmcNew = int(out['TABLE_rx_counters']['ROW_rx_counters'][1]['eth_inmcast'])
rxbcNew = int(out['TABLE_rx_counters']['ROW_rx_counters'][1]['eth_inbcast'])
txucNew = int(out['TABLE_tx_counters']['ROW_tx_counters'][0]['eth_outucast'])
txmcNew = int(out['TABLE_tx_counters']['ROW_tx_counters'][1]['eth_outmcast'])
txbcNew = int(out['TABLE_tx_counters']['ROW_tx_counters'][1]['eth_outbcast'])
i += 1
print '%-3d %8d %8d %8d %8d %8d %8d' % \
(i, rxucNew - rxuc, rxmcNew - rxmc, rxbcNew - rxbc, txucNew - txuc, txmcNew - txmc, txbcNew - txbc)
使用した場合は、以下となります。
なお、deltaCounters.py は、bootflash 配下の scripts フォルダに保存しています。
N9K-C93240YC-FX2# python bootflash:scripts/deltaCounters.py Ethernet1/1 1 5
row rx_ucast rx_mcast rx_bcast tx_ucast tx_mcast tx_bcast
=========================================================
135 41295 0 163 3754 0
=========================================================
1 0 0 0 0 0 0
2 0 1 0 0 0 0
3 0 2 0 0 0 0
4 0 3 0 0 0 0
5 0 4 0 0 0 0
N9K-C93240YC-FX2#
この他にも、サンプルコードが、developer.cisco.com 等にも記載がありますので、確認してみてください。
参考情報
Cisco Nexus 9000 Series NX-OS Programmability Guide, Release 9.3(x)
Cisco Nexus 9000 Series NX-OS Programmability Guide, Release 7.x
About the Python Programming Language