Blog Brocade Japan

NOS内蔵Python

by Ken Sugai on ‎11-09-2016 07:26 AM - last edited on ‎02-26-2017 07:15 PM by aokuhara (1,368 Views)

 

概要

 

NOS CLIから python とタイプすればPythonインタープリターが起動します。

 

# python
Python 3.3.2 (default, Jun  5 2013, 11:04:06) 
[GCC 4.3.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

>>>」はプロンプトです。Pythonコードをいろいろ試したいときはここに直接タイプします。

スクリプトを実行したいときはコマンドpythonの引数にスクリプトファイル名を与えます。

 

# python sample.py
!Command: show version
!Time: Tue Oct  4 16:25:16 2016

Network Operating System Software
Network Operating System Version: 6.0.2
Copyright (c) 1995-2015 Brocade Communications Systems, Inc.
Firmware name:      6.0.2a
(略)

上記の例で実行したsample.pyの内容は以下のとおりです。

 

from CLI import CLI
CLI('show version')

 

CLIクラス

 

 CLI('コマンド') はコマンドの文字列を引数としてCLIクラスのコンストラクターを呼び出しています。コンストラクターはオブジェクトを作った後でコマンドを実行します。コマンドのコンソール出力はコンソールに表示されるだけでなくオブジェクトにも保存され、get_output メソッドによっていつでも取り出すことができます。パターンマッチを掛けて結果を判定したり情報を切り出すことができます。またrerunメソッドによって同じコマンドを再実行できます。

 

cmd_ping = CLI('ping 10.20.30.40 count 1 timeout 1')
ping_succeed = ' '.join(cmd_ping.get_output()).find('100% packet loss') < 0
cmd_ping.rerun()

 

コマンド出力は複数行なのでget_outputは文字列のリストを返します。だからまずjoinしてからfindre.searchするといいです。

 

NOSコマンドのバッチファイル

 

 NOSコマンドをバッチファイルにできると便利な場合があります。これまではバッチ機能がなかったのでTeraTermマクロなどで一連のコマンドを流し込むしかありませんでした。一連のコマンドを順番に実行したいだけならスクリプトの書き方は至って簡単です。

 

from CLI import CLI
CLI('コマンド1')
CLI('コマンド2')
...
CLI('コマンドn')

 

ただし conf など、コマンドの階層に入る場合は、セミコロンで区切って1個のCLI()の中で実行してください。

例: CLI('conf ; interface ... ; ...')

各CLI()はかならずトップ階層でコマンドを実行する(コンテキストを保存しない)からです。

 

イベントをトリガーにスクリプトを起動

 

 Event-handlerを設定すると、特定のRASlogが発生したときにスクリプトを実行することができます。うまく使えばVDXが自律的に障害に対処するとか、ログを取る、外部に通知するなどの仕組みを作ることができるでしょう。

 

ブート時にスクリプトを起動してずっと実行

 

 Event-handlerで使えるトリガーにはRASlog以外にswitch-ready-for-configurationというのがあります。NOSブート完了時にスクリプトを起動するので、無限ループするスクリプトを動かしておいて一定間隔で監視などをさせることができます。たとえばゲートウェイへのpingが落ちたらルートを変更するというようなことができます。以下にスクリプトのテンプレートを示すので、いろいろ応用してみてください。

 

import time
from CLI import CLI

nexthop = '10.20.30.40'
cmd_ping = CLI('ping ' + nexthop + ' count 1 timeout 1')
interval = 3

while True:
    ping_succeed = ' '.join(cmd_ping.get_output()).find('100% packet loss') < 0
    if not ping_succeed:
        ## やりたいことをここに書く
    time.sleep(interval)
    cmd_ping.rerun()

 

マニュアル

 

NOS内蔵Pythonを使うにはまずNOS Admin GuideのPython Event-Management and Scriptingの章を読んでください。

さらにCommand Referenceで以下のコマンドの詳細を確認してください。

 

  • event-handler
  • action python-script
  • trigger
  • trigger-function
  • trigger-mode
  • python
  • CLI()
  • copy
  • show file

 

関連リンク

PyNOSを使ってみよう

NOS内蔵PythonとBWCの連携