この製品のマニュアルセットは、偏向のない言語を使用するように配慮されています。このマニュアルセットでの偏向のない言語とは、年齢、障害、性別、人種的アイデンティティ、民族的アイデンティティ、性的指向、社会経済的地位、およびインターセクショナリティに基づく差別を意味しない言語として定義されています。製品ソフトウェアのユーザーインターフェイスにハードコードされている言語、RFP のドキュメントに基づいて使用されている言語、または参照されているサードパーティ製品で使用されている言語によりドキュメントに例外が存在する場合があります。シスコのインクルーシブランゲージに対する取り組みの詳細は、こちらをご覧ください。
このドキュメントは、米国シスコ発行ドキュメントの参考和訳です。リンク情報につきましては、日本語版掲載時点で、英語版にアップデートがあり、リンク先のページが移動/変更されている場合がありますことをご了承ください。あくまでも参考和訳となりますので、正式な内容については米国サイトのドキュメントを参照ください。
Python は簡単に習得できる強力なプログラミング言語です。効率的で高水準なデータ構造を持ち、オブジェクト指向プログラミングに対してシンプルで効果的なアプローチを取っています。Python は、簡潔な構文、動的な型付け、およびインタープリタ型という性質によって、ほとんどのプラットフォームのさまざまな分野でスクリプティングと高速なアプリケーション開発を実現する理想的な言語です。
Python のインタープリタと広範な標準ライブラリは、Python Web サイトから、すべての主要プラットフォームに対応したソース形式またはバイナリ形式で自由に利用できます。
http://www.python.org/
また、このサイトには、サードパーティが無償で提供している多数の Python モジュール、プログラム、およびツールのディストリビューションとそれらへのリンク、さらに追加のドキュメンテーションが掲載されています。
Cisco Nexus 9000 シリーズ デバイスは、インタラクティブ モードと非インタラクティブ(スクリプト)モードの両方で Python v2.7.5 をサポートし、ゲスト シェルで使用できます。
Python スクリプト機能は、さまざまなタスクを実行するためのデバイスのコマンドライン インターフェイス(CLI)と PowerOn Auto Provisioning(POAP)または Embedded Event Manager(EEM)アクションへのプログラムによるアクセスを提供します。Python は、Bash シェルからもアクセスできます。
Python インタープリタは、Cisco NX-OS ソフトウェア内で使用できます。
ここでは、Python スクリプトの作成と実行の方法について説明します。
Cisco NX-OS で提供される Cisco Python パッケージは、多数のコア ネットワーク デバイス モジュール(インターフェイス、VLAN、VRF、ACL、ルートなど)へのアクセスを可能します。help() コマンドを入力することで、Cisco Python パッケージの詳細を表示できます。モジュール内のクラスとメソッドに関する追加情報を取得するには、特定のモジュールに対して help コマンドを実行します。たとえば、help(cisco.interface) を実行すると、cisco.interface モジュールのプロパティが表示されます。
次の例は、Cisco Python パッケージに関する情報を表示する方法を示しています。
>>> import cisco >>> help(cisco) Help on package cisco: NAME cisco FILE /isan/python/scripts/cisco/__init__.py PACKAGE CONTENTS acl bgp cisco_secret cisco_socket feature interface key line_parser md5sum nxcli ospf routemap routes section_parser ssh system tacacs vrf CLASSES __builtin__.object cisco.cisco_secret.CiscoSecret cisco.interface.Interface cisco.key.Key
Python プログラミング言語は CLI コマンドを実行できる 3 つの API を使用します。これらの API は、Python CLI モジュールから利用できます。
これらの API を次の表に示します。これらの API は、from cli import* コマンドで有効化する必要があります。これらの API の引数は CLI コマンドの文字列です。Python インタープリタ経由で CLI コマンドを実行するには、次の API のいずれかの引数文字列として CLI コマンドを入力します。
API |
説明 |
||
---|---|---|---|
cli() 例: string = cli (“cli-command”) |
制御文字、特殊文字を含む CLI コマンドの未処理の出力を返します。
|
||
clid() 例: json_string = clid (“cli-command”) |
cli-command コマンドに対する XML サポートが存在する場合は、コマンドに対する JSON 出力が返され、それ以外の場合は、例外がスローされます。
|
||
clip() 例: clip (“cli-command”) |
CLI コマンドの出力を直接 stdout に出力し、Python には何も返されません。
|
2 つ以上のコマンドが 個別に実行される場合、状態は 1 つのコマンドから後続のコマンドに続いて 持続されません。
次の例では、 最初のコマンドの状態が 2 番目のコマンドの実行に続いて持続されないため、 2 番目のコマンドが失敗します。
>>> cli("conf t") >>> cli("interface eth4/1")
複数のコマンドが 同時に実行される場合は、1 つのコマンドから後続のコマンドに続いて 状態が持続されます。
次の例では、 2 番目のコマンドは成功しています。これは、2 番目と 3 番目のコマンドで 状態が持続するためです。
>>> cli("conf t ; interface eth4/1 ; shut")
(注) | 例に示されているように、コマンドは「 ; 」によって区切られます(; の前後にそれぞれ 1 つの空白文字が必要です)。 |
次の例は、CLI から Python を呼び出す方法を示しています。
(注) | Python インタープリタのプロンプトは「>>>」または「…」で示されます。 |
switch# python Python 2.7.5 (default, Oct 8 2013, 23:59:43) [GCC 4.6.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from cli import * >>> import json >>> cli('configure terminal ; interface loopback 5 ; no shut') '' >>> intflist=json.loads(clid('show interface brief')) >>> i=0 >>> while i < len(intflist['TABLE_interface']['ROW_interface']): ... intf=intflist['TABLE_interface']['ROW_interface'][i] ... i=i+1 ... if intf['state'] == 'up': ... print intf['interface'] ... mgmt0 Ethernet2/7 Ethernet4/7 loopback0 loopback5 >>>
次の例は、Python API を使用したさまざまな表示形式を示しています。
例 1:
>>> from cli import * >>> cli("conf ; interface loopback 1") '' >>> clip('where detail') mode: username: admin vdc: switch routing-context vrf: default
例 2:
>>> from cli import * >>> cli("conf ; interface loopback 1") '' >>> cli('where detail') ' mode: \n username: admin\n vdc: switch\n routing-context vrf: default\n' >>>
例 3:
>>> from cli import * >>> cli("conf ; interface loopback 1") '' >>> r = cli('where detail') ; print r mode: username: admin vdc: EOR-1 routing-context vrf: default >>>
例 4:
>>> from cli import * >>> import json >>> out=json.loads(clid('show version')) >>> for k in out.keys(): ... print "%30s = %s" % (k, out[k]) ... kern_uptm_secs = 6 kick_file_name = bootflash:///n9000-dk9.6.1.2.I1.1.bin rr_service = None module_id = Supervisor Module kick_tmstmp = 10/21/2013 00:06:10 bios_cmpl_time = 08/17/2013 bootflash_size = 20971520 kickstart_ver_str = 6.1(2)I1(2) [build 6.1(2)I1(2)] [gdb] kick_cmpl_time = 10/20/2013 4:00:00 chassis_id = Nexus9000 C9508 (8 Slot) Chassis proc_board_id = SAL171211LX memory = 16077872 manufacturer = Cisco Systems, Inc. kern_uptm_mins = 26 bios_ver_str = 06.14 cpu_name = Intel(R) Xeon(R) CPU E5-2403 kern_uptm_hrs = 2 rr_usecs = 816550 rr_sys_ver = None rr_reason = Reset Requested by CLI command reload rr_ctime = Mon Oct 21 00:10:24 2013 header_str = Cisco Nexus Operating System (NX-OS) Software TAC support: http://www.cisco.com/tac Documents: http://www.cisco.com/en/US/products/ps9372/tsd_products_support_series_home.html Copyright (c) 2002-2013, Cisco Systems, Inc. All rights reserved. The copyrights to certain works contained herein are owned by other third parties and are used and distributed under license. Some parts of this software are covered under the GNU Public License. A copy of the license is available at http://www.gnu.org/licenses/gpl.html. host_name = switch mem_type = kB kern_uptm_days = 0 >>>
Python スクリプト名を引数として Python CLI コマンドで使用することで、Python スクリプトを非インタラクティブ モードで実行できます。Python スクリプトは、ブートフラッシュまたは一時スキームの下に配置する必要があります。Python CLI コマンドでは、Python スクリプトのコマンド ライン引数を最大 32 個使用できます。
Cisco Nexus 9000 シリーズ デバイスは、Python スクリプトを実行するためのソース CLI コマンドもサポートします。bootflash:scripts ディレクトリは、ソース CLI コマンドのデフォルトのスクリプト ディレクトリです。
次の例は、スクリプトとその実行方法を示しています。
switch# show file bootflash: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) switch# python bootflash:deltaCounters.py Ethernet1/1 1 5 row rx_ucast rx_mcast rx_bcast tx_ucast tx_mcast tx_bcast ========================================================= 0 791 1 0 212739 0 ========================================================= 1 0 0 0 0 26 0 2 0 0 0 0 27 0 3 0 1 0 0 54 0 4 0 1 0 0 55 0 5 0 1 0 0 81 0 switch#
次の例は、ソース コマンドによるコマンドラインの引数の指定方法を示しています。この例では、policy-map は cgrep python スクリプトの引数です。また、この例では、ソース コマンドをパイプ演算子(「|」)の後に配置できることも示しています。
switch# show running-config | source sys/cgrep policy-map policy-map type network-qos nw-pfc policy-map type network-qos no-drop-2 policy-map type network-qos wred-policy policy-map type network-qos pause-policy policy-map type qos foo policy-map type qos classify policy-map type qos cos-based policy-map type qos no-drop-2 policy-map type qos pfc-tor-port
Cisco Nexus 9000 シリーズ デバイスでは、Embedded Event Manager(EEM)ポリシーは Python スクリプトをサポートします。
次の例は、EEM アクションとして Python スクリプトを実行する方法を示しています。
switch# show running-config eem !Command: show running-config eem !Time: Sun May 1 14:40:07 2011 version 6.1(2)I2(1) event manager applet a1 event cli match "show clock" action 1 cli python bootflash:pydate.py action 2 event-default
switch# show file logflash:event_archive_1 | last 33 eem_event_time:05/01/2011,19:40:28 event_type:cli event_id:8 slot:active(1) vdc:1 severity:minor applets:a1 eem_param_info:command = "exshow clock" Starting with policy a1 Python 2011-05-01 19:40:28.644891 Executing the following commands succeeded: python bootflash:pydate.py PC_VSH_CMD_TLV(7679) with q
Cisco Nexus 9000 シリーズ デバイスでは、Python は基盤となる Cisco NX-OS ネットワーク インターフェイスと統合されます。cisco.vrf.set_global_vrf() API を使用してコンテキストをセットアップすることにより、ある仮想ルーティング コンテキストから別の仮想ルーティング コンテキストに切り替えることができます。
次の例は、デバイスの管理インターフェイスを通じて HTML ドキュメントを取得する方法を示しています。目的の仮想ルーティング コンテキストに切り替えることにより、インバンド インターフェイスを通じて外部エンティティへの接続を確立することもできます。
switch# python Python 2.7.5 (default, Oct 8 2013, 23:59:43) [GCC 4.6.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import urllib2 >>> from cisco.vrf import * >>> set_global_vrf('management') >>> page=urllib2.urlopen('http://172.23.40.211:8000/welcome.html') >>> print page.read() Hello Cisco Nexus 9000 >>> >>> import cisco >>> help(cisco.vrf.set_global_vrf) Help on function set global vrf in module cisco.vrf: set global vrf(vrf) Sets the global vrf. Any new sockets that are created (using socket.socket) will automatically get set to this vrf (including sockets used by other python libraries). Arguments: vrf: VRF name (string) or the VRF ID (int). Returns: Nothing >>>
Cisco NX-OS のリソースは、ソフトウェアの Cisco NX-OS サンドボックス レイヤと CLI のロールベース アクセス コントロール(RBAC)によって保護されています。
Cisco NX-OS の network-admin または dev-ops ロールに関連付けられたすべてのユーザは、特権ユーザです。カスタム ロールが付与され、Python へのアクセスが許可されたユーザは、非特権ユーザであると見なされます。非特権ユーザは、Cisco NX-OS リソース(ファイル システム、ゲスト シェル、Bash コマンドなど)へのアクセスが制限されます。特権ユーザは、Cisco NX-OS のすべてのリソースに対して幅広いアクセスが許可されます。
次の例は、特権ユーザがコマンドを実行する方法を示しています。
switch# python Python 2.7.5 (default, Oct 8 2013, 23:59:43) [GCC 4.6.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import os >>> os.system('whoami') admin 0 >>> f=open('/tmp/test','w') >>> f.write('hello from python') >>> f.close() >>> r=open('/tmp/test','r') >>> print r.read() hello from python >>> r.close()
次の例は、アクセスを拒否された非権限ユーザを示しています。
switch# python Python 2.7.5 (default, Oct 8 2013, 23:59:43) [GCC 4.6.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import os >>> os.system('whoami') system(whoami): rejected! -1 >>> f=open('/tmp/test','r') Permission denied. Traceback (most recent call last): File "<stdin>", line 1, in <module> IOError: [Errno 13] Permission denied: '/tmp/test' >>>
RBAC は、ログイン ユーザの権限に基づいて CLI アクセスを制御します。CLI シェルまたは Bash から呼び出された Python にログイン ユーザの識別情報が提供されます。Python は、Python から呼び出されるサブプロセスのすべてにログイン ユーザの識別情報を渡します。
次に、権限ユーザの例を示します。
>>> from cli import * >>> cli('show clock') '11:28:53.845 AM UTC Sun May 08 2011\n' >>> cli('configure terminal ; vrf context myvrf') '' >>> clip('show running-config l3vm') !Command: show running-config l3vm !Time: Sun May 8 11:29:40 2011 version 6.1(2)I2(1) interface Ethernet1/48 vrf member blue interface mgmt0 vrf member management vrf context blue vrf context management vrf context myvrf
次に、非権限 ユーザの例を示します。
>>> from cli import * >>> cli('show clock') '11:18:47.482 AM UTC Sun May 08 2011\n' >>> cli('configure terminal ; vrf context myvrf2') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/isan/python/scripts/cli.py", line 20, in cli raise cmd_exec_error(msg) errors.cmd_exec_error: '% Permission denied for the role\n\nCmd exec error.\n'
次に、RBAC 設定の 例を示します。
switch# show user-account user:admin this user account has no expiry date roles:network-admin user:pyuser this user account has no expiry date roles:network-operator python-role switch# show role name python-role
次の例は、スケジューラ機能を使用してスクリプトを実行する Python スクリプトを示しています。
#!/bin/env python from cli import * from nxos import * import os switchname = cli("show switchname") try: user = os.environ['USER'] except: user = "No user" pass msg = user + " ran " + __file__ + " on : " + switchname print msg py_syslog(1, msg) # Save this script in bootflash:///scripts
switch# conf t Enter configuration commands, one per line. End with CNTL/Z. switch(config)# feature scheduler switch(config)# scheduler job name testplan switch(config-job)# python bootflash:///scripts/testplan.py switch(config-job)# exit switch(config)# scheduler schedule name testplan switch(config-schedule)# job name testplan switch(config-schedule)# time start now repeat 0:0:4 Schedule starts from Mon Mar 14 16:40:03 2011 switch(config-schedule)# end switch# term mon 2011 Mar 14 16:38:03 switch %VSHD-5-VSHD_SYSLOG_CONFIG_I: Configured from vty by admin on 10.19.68.246@pts/2 switch# show scheduler schedule Schedule Name : testplan ------------------------------ User Name : admin Schedule Type : Run every 0 Days 0 Hrs 4 Mins Start Time : Mon Mar 14 16:40:03 2011 Last Execution Time : Yet to be executed ----------------------------------------------- Job Name Last Execution Status ----------------------------------------------- testplan -NA- ============================================================================== switch# switch# 2011 Mar 14 16:40:04 switch %USER-1-SYSTEM_MSG: No user ran /bootflash/scripts/testplan.py on : switch - nxpython 2011 Mar 14 16:44:04 switch last message repeated 1 time switch#