この製品のマニュアルセットは、偏向のない言語を使用するように配慮されています。このマニュアルセットでの偏向のない言語とは、年齢、障害、性別、人種的アイデンティティ、民族的アイデンティティ、性的指向、社会経済的地位、およびインターセクショナリティに基づく差別を意味しない言語として定義されています。製品ソフトウェアのユーザーインターフェイスにハードコードされている言語、RFP のドキュメントに基づいて使用されている言語、または参照されているサードパーティ製品で使用されている言語によりドキュメントに例外が存在する場合があります。シスコのインクルーシブランゲージに対する取り組みの詳細は、こちらをご覧ください。
このドキュメントは、米国シスコ発行ドキュメントの参考和訳です。リンク情報につきましては、日本語版掲載時点で、英語版にアップデートがあり、リンク先のページが移動/変更されている場合がありますことをご了承ください。あくまでも参考和訳となりますので、正式な内容については米国サイトのドキュメントを参照ください。
Python は簡単に習得できる強力なプログラミング言語です。効率的で高水準なデータ構造を持ち、オブジェクト指向プログラミングに対してシンプルで効果的なアプローチを取っています。Python は、簡潔な構文、動的な型付け、およびインタープリタ型という性質によって、ほとんどのプラットフォームのさまざまな分野でスクリプティングと高速なアプリケーション開発を実現する理想的な言語です。
Python のインタープリタと広範な標準ライブラリは、Python Web サイトから、すべての主要プラットフォームに対応したソース形式またはバイナリ形式で自由に利用できます。
http://www.python.org/
また、このサイトには、サードパーティが無償で提供している多数の Python モジュール、プログラム、およびツールのディストリビューションとそれらへのリンク、さらに追加のドキュメンテーションが掲載されています。
Cisco Nexus 7000 シリーズ デバイスは、インタラクティブ モードと非インタラクティブ(スクリプト)モードの両方で、Python v2.7.2 をサポートします。
Python スクリプト機能は、さまざまなタスクを実行するためのデバイスのコマンドライン インターフェイス(CLI)と PowerOn Auto Provisioning(POAP)または Embedded Event Manager(EEM)アクションへのプログラムによるアクセスを提供します。Python は、Bash シェルからもアクセスできます。
Python インタープリタは、Cisco NX-OS ソフトウェア内で使用できます。
ここでは、Python スクリプトの作成と実行の方法について説明します。
Cisco NX-OS では、Cisco Python パッケージを利用できます。help() コマンドを入力すると、Cisco Python パッケージの詳細が表示されます。モジュール内のクラスとメソッドに関する追加情報を取得するには、特定のモジュールに対して help コマンドを実行します。たとえば、help(cisco.interface) を実行すると、cisco.interface モジュールのプロパティが表示されます。
次の例は、Cisco Python パッケージに関する情報を表示する方法を示しています。
SWITCH# >>> import cisco SWITCH# >>> help(cisco) Help on module cisco: NAME cisco - commands that integrate with CLI FILE (built-in) FUNCTIONS cli(...) execute a cli command clid(...) execute a cli command, return name/value pairs clip(...) execute a cli command, dont return it, just display it set_vrf(...) specify the vrf name for socket operations SWITCH# >>> SWITCH# >>> help(cisco.set_vrf) Help on built-in function set_vrf in module cisco: set_vrf(...) specify the vrf name for socket operations SWITCH# >>>
Python プログラミング言語は CLI コマンドを実行できる 3 つの API を使用します。これらの APIは、Python CLI モジュールから利用できます。
これらの API を次の表に示します。これらの API の引数は CLI コマンドの文字列です。Python インタープリタ経由で CLI コマンドを実行するには、次の API のいずれかの引数文字列として CLI コマンドを入力します。
API |
説明 |
||
---|---|---|---|
cli() 例: string = cli (“cli-command”) |
制御文字、特殊文字を含む CLI コマンドの未処理の出力を返します。
|
||
clid() 例: dictionary = clid(“cli-command”) |
clid():d は「dictionary」を意味し、XML をサポートする CLI コマンドの属性名/値のディクショナリが返されます。
この API は、show コマンドの出力の検索時に使用すると便利な場合があります。 |
||
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# >>> cli('conf term ; interface loopback 1') '' SWITCH(config-if)# >>> cli('ip address 1.1.1.1/24') '' SWITCH(config-if)# >>> cli('exit') '' SWITCH(config)# >>> cli('exit') '' SWITCH# >>> SWITCH# >>> a=clid('sh mod') SWITCH# >>> a.keys() ['TABLE_modmacinfo/serialnum/4', 'TABLE_modinfo/modinf/1', 'TABLE_modmacinfo/serialnum/2', 'TABLE_modmacinfo/modmac/2', 'TABLE_modmacinfo/serialnum/1', 'TABLE_modinfo/ports/4', 'TABLE_modmacinfo/mac/2', 'TABLE_moddiaginfo/diagstatus/4', 'TABLE_modinfo/ports/1', 'TABLE_modinfo/ports/2', 'TABLE_modinfo/ports/3', 'TABLE_modwwninfo/modwwn/4', 'TABLE_xbarinfo/xbarports/1', 'TABLE_xbarinfo/xbarmodel/1', 'TABLE_modmacinfo/serialnum/3', 'TABLE_modwwninfo/hw/1', 'TABLE_modwwninfo/hw/3', 'TABLE_modwwninfo/hw/2', 'TABLE_moddiaginfo/diagstatus/3', 'TABLE_modwwninfo/hw/4', 'TABLE_modinfo/modinf/2', 'TABLE_modinfo/modinf/3', 'TABLE_modwwninfo/modwwn/1', 'TABLE_xbarwwninfo/xbarhw/1', 'TABLE_modinfo/modinf/4', 'TABLE_moddiaginfo/mod/3', 'TABLE_moddiaginfo/mod/2', 'TABLE_moddiaginfo/mod/1', 'TABLE_xbarinfo/xbartype/1', 'TABLE_xbarmacinfo/xbarmacaddr/1', 'TABLE_moddiaginfo/mod/4', 'TABLE_modinfo/status/4', 'TABLE_xbarwwninfo/xbarwwn/1', 'TABLE_modinfo/status/1', 'TABLE_modinfo/status/3', 'TABLE_modinfo/status/2', 'TABLE_modmacinfo/mac/1', 'TABLE_xbarwwninfo/xbarsw/1', 'TABLE_moddiaginfo/diagstatus/2', 'TABLE_modmacinfo/mac/3', 'TABLE_modinfo/modtype/2', 'TABLE_modinfo/modtype/3', 'TABLE_moddiaginfo/diagstatus/1', 'TABLE_modinfo/modtype/1', 'TABLE_modmacinfo/modmac/1', 'TABLE_modinfo/modtype/4', 'TABLE_modmacinfo/modmac/3', 'TABLE_xbarmacinfo/xbarserialnum/1', 'TABLE_xbarmacinfo/xbarmac/1', 'TABLE_xbarinfo/xbarinf/1', 'TABLE_modmacinfo/mac/4', 'TABLE_modwwninfo/sw/4', 'TABLE_modmacinfo/modmac/4', 'TABLE_modwwninfo/sw/1', 'TABLE_modwwninfo/sw/2', 'TABLE_modwwninfo/sw/3', 'TABLE_xbarinfo/xbarstatus/1', 'TABLE_modwwninfo/modwwn/2', 'TABLE_modinfo/model/4', 'TABLE_modinfo/model/3', 'TABLE_modinfo/model/2', 'TABLE_modinfo/model/1', 'TABLE_modwwninfo/modwwn/3'] SWITCH# >>> a["TABLE_modinfo/model/2"] 'N7K-SUP1' SWITCH# >>>
次の例は、Python API を使用したさまざまな表示形式を示しています。
例 1:
SWITCH# >>> cli("conf ; interface loopback 1") '' SWITCH(config-if)# >>> clip('where detail') mode: conf interface loopback1 username: admin vdc: SWITCH routing-context vrf: default SWITCH(config-if)# >>>
例 2:
SWITCH# >>> cli("conf ; interface loopback 1") '' SWITCH(config-if)# >>>cli('where detail') ' mode: conf\n interface loopback1\n username: admin\n vdc: SWITCH\n routing-context vrf: default\n' SWITCH(config-if)# >>>
例 3:
SWITCH# >>> cli("conf ; interface loopback 1") '' SWITCH(config-if)# >>> r = cli('where detail') ; print r mode: conf interface loopback1 username: admin vdc: SWITCH routing-context vrf: default SWITCH(config-if)# >>>
例 4:
SWITCH# >>> r = clid('show version') SWITCH# >>> for k in r.keys(): SWITCH# ... print "%30s" % k, " = %s" % r[k] SWITCH# ... kern_uptm_secs = 58 kick_file_name = bootflash:///n7000-s1-kickstart.7.2.0.D1.1.gbin rr_service = module_id = Supervisor Module-1X slot0_size = 2044854 kick_tmstmp = 06/14/2015 13:57:44 isan_file_name = bootflash:///n7000-s1-dk9.7.2.0.D1.1.gbin sys_ver_str = 7.2(0)D1(1) [gdb] bootflash_size = 2000880 kickstart_ver_str = 7.2(0)D1(1) [gdb] kick_cmpl_time = 5/19/2015 11:00:00 chassis_id = Nexus7000 C7010 (10 Slot) Chassis proc_board_id = JAF1417DKEN memory = 4115196 manufacturer = Cisco Systems, Inc. kern_uptm_mins = 39 bios_ver_str = 3.22.0 cpu_name = Intel(R) Xeon(R) CPU bios_cmpl_time = 02/20/10 kern_uptm_hrs = 20 rr_usecs = 228613 isan_tmstmp = 06/14/2015 15:44:55 rr_sys_ver = 7.3(0)ZD(0.114) rr_reason = Reset Requested by CLI command reload rr_ctime = Fri Mar 15 20:41:38 2002 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-2015, Cisco Systems, Inc. All rights reserved. The copyrights to certain works contained in this software are owned by other third parties and used and distributed under license. Certain components of this software are licensed under the GNU General Public License (GPL) version 2.0 or the GNU Lesser General Public License (LGPL) Version 2.1. A copy of each such license is available at http://www.opensource.org/licenses/gpl-2.0.php and http://www.opensource.org/licenses/lgpl-2.1.php isan_cmpl_time = 5/19/2015 11:00:00 host_name = SWITCH mem_type = kB kern_uptm_days = 0 SWITCH# >>>
Python スクリプト名を引数として Python CLI コマンドで使用することで、Python スクリプトを非インタラクティブ モードで実行できます。Python スクリプトは、デフォルト vdc の場合、bootflash/scripts ディレクトリに配置する必要があります。デフォルト以外の vdc (x) の場合は、/bootflash/vdc_x/scripts ディレクトリに配置する必要があります。
Cisco Nexus 7000 シリーズ デバイスは、Python スクリプトを実行するためのソース CLI コマンドもサポートします。bootflash:scripts ディレクトリは、ソース CLI コマンドのデフォルトのスクリプト ディレクトリです。
次の例は、スクリプトとその実行方法を示しています。
SWITCH# sh file bootflash:scripts/test1.py #!/bin/env python import os import syslog switchname = cli("show switchname") try: user = os.environ['USER'] except: user = "No user" pass msg = user + " ran " + __file__ + " on : " + switchname print msg syslog.syslog(1,msg) SWITCH# SWITCH# source test1.py No user ran /bootflash/scripts/test1.py on : SWITCH SWITCH# 2002 Mar 15 17:43:29 SWITCH %$ VDC-1 %$ %USER-1-SYSTEM_MSG: No user ran /bootflash/scripts/test1.py on : SWITCH - test1.py
次の例は、 ソース コマンドによるコマンドラインの引数の指定方法を示しています。この例では、 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 7000 シリーズ デバイスでは、Embedded Event Manager(EEM)ポリシーは Python スクリプトをサポートします。
次の例は、EEM アクションとして Python スクリプトを実行する方法を示しています。
switch# show running-config eem !Command: show running-config eem !Time: Sat Mar 16 09:11:32 2002 version 7.2(0)D1(1) event manager applet a2 event cli match "show clock" action 1 cli command "source pydate.py" action 2 event-default action 3 syslog priority critical msg "$_cli_result"
SWITCH# show clock Time source is NTP 08:58:59.595 PST Sat Mar 16 2002 SWITCH# 2002 Mar 16 08:59:02 SWITCH %$ VDC-1 %$ eem_policy_dir: %eem_policy_dir-2-LOG: a2: Time source is NTP^M 2002 Mar 16 08:59:02 SWITCH %$ VDC-1 %$ eem_policy_dir: 08:59:02.269 PST Sat Mar 16 2002^M 2002 Mar 16 08:59:02 SWITCH %$ VDC-1 %$ eem_policy_dir: <Sat Mar 16 08:59:02 2002> <1> The System Manager library is unloading for PID 1985.^M 2002 Mar 16 08:59:02 SWITCH %$ VDC-1 %$ eem_policy_dir: ^M
Cisco Nexus 7000 シリーズ デバイスでは、Python は基盤となる Cisco NX-OS ネットワーク インターフェイスと統合されます。set_vrf() API を使用してコンテキストをセットアップすることにより、ある仮想ルーティング コンテキストから別の仮想ルーティング コンテキストに切り替えることができます。
次の例は、デバイスの管理インターフェイスを通じて HTML ドキュメントを取得する方法を示しています。目的の仮想ルーティング コンテキストに切り替えることにより、インバンド インターフェイスを通じて外部エンティティへの接続を確立することもできます。
SWITCH# >>> import urllib2 SWITCH# >>> set_vrf('management') SWITCH# >>> page=urllib2.urlopen('http://172.23.40.211:8000/welcome.html') SWITCH# >>> print page.read() Hello Cisco Nexus 7000 >>> SWITCH# >>> import cisco SWITCH# >>> help(cisco.set_vrf) Help on built-in function set_vrf in module cisco: set_vrf(...) specify the vrf name for socket operations SWITCH# >>>
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 switch# >>> from os import system switch# >>> system("ls /isan/bin/") -1 switch# >>> f=open("/bootflash/alias", "r") switch# >>> f=open("/isan/bin/vsh", "r") IOError: [Errno 1] Operation not permitted: '/isan/bin/vsh'
RBAC は、ログイン ユーザの権限に基づいて CLI アクセスを制御します。CLI シェルまたは Bash から呼び出された Python にログイン ユーザの識別情報が提供されます。Python は、Python から呼び出されるサブプロセスのすべてにログイン ユーザの識別情報を渡します。
次に、権限ユーザの例を示します。
SWITCH# python Copyright (c) 2001-2012 Python Software Foundation; All Rights Reserved SWITCH# >>> cli('show clock') 'Time source is NTP\n15:49:21.791 PST Fri Mar 15 2002\n' SWITCH# >>>
次に、非権限ユーザの例を示します。
User Access Verification SWITCH login: name1 Password: SWITCH# python Copyright (c) 2001-2012 Python Software Foundation; All Rights Reserved SWITCH# >>> cli('sh clock') Traceback (most recent call last): File "<stdin>", line 1, in <module> cisco.cli_execution_error: % Permission denied for the role SWITCH# >>>
次に、RBAC 設定の例を示します。
SWITCH(config-role)# show role name role-test Role: role-test Description: new role Vlan policy: permit (default) Interface policy: permit (default) Vrf policy: permit (default) ------------------------------------------------------------------- Rule Perm Type Scope Entity ------------------------------------------------------------------- 3 permit command python 2 deny command sh running-config l3vm 1 deny command show clock SWITCH(config-role)# exit SWITCH(config)#
次の例は、スケジューラ機能を使用してスクリプトを実行する Python スクリプトを示しています。
#!/bin/env python import os import syslog switchname = cli("show switchname") try: user = os.environ['USER'] except: user = "No user" pass msg = user + " ran " + __file__ + " on : " + switchname print msg syslog.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 test-plan SWITCH(config-job)# source test1.py SWITCH(config-job)# exit SWITCH(config)# scheduler schedule name test-plan SWITCH(config-schedule)# job name test-plan SWITCH(config-schedule)# time start now repeat 0:0:1 Schedule starts from Fri Mar 15 13:43:27 2002 SWITCH(config-schedule)# end SWITCH# 2002 Mar 15 13:41:34 SWITCH %$ VDC-1 %$ %VSHD-5-VSHD_SYSLOG_CONFIG_I: Configured from vty by admin on console0 SWITCH# term mon Console already monitors SWITCH# show scheduler schedule Schedule Name : test-plan ------------------------------- User Name : admin Schedule Type : Run every 0 Days 0 Hrs 1 Mins Start Time : Fri Mar 15 13:43:27 2002 Last Execution Time : Yet to be executed ----------------------------------------------- Job Name Last Execution Status ----------------------------------------------- test-plan -NA- ============================================================================== SWITCH# 2002 Mar 15 13:43:27 SWITCH %$ VDC-1 %$ %USER-1-SYSTEM_MSG: No user ran /bootflash/scripts/test1.py on : SWITCH - test1.py SWITCH# show scheduler schedule Schedule Name : test-plan ------------------------------- User Name : admin Schedule Type : Run every 0 Days 0 Hrs 1 Mins Start Time : Fri Mar 15 13:43:27 2002 Last Execution Time : Fri Mar 15 13:43:27 2002 Last Completion Time: Fri Mar 15 13:43:27 2002 Execution count : 1 ----------------------------------------------- Job Name Last Execution Status ----------------------------------------------- test-plan Success (0) ============================================================================== SWITCH#