この製品のマニュアルセットは、偏向のない言語を使用するように配慮されています。このマニュアルセットでの偏向のない言語とは、年齢、障害、性別、人種的アイデンティティ、民族的アイデンティティ、性的指向、社会経済的地位、およびインターセクショナリティに基づく差別を意味しない言語として定義されています。製品ソフトウェアのユーザーインターフェイスにハードコードされている言語、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#