Blog Brocade Japan

BWCでVDXの疎通確認

by Ken Sugai on ‎02-28-2017 12:46 AM - last edited on ‎04-07-2017 01:18 AM by aokuhara (2,059 Views)

自動化したい課題

 

VDXによるネットワーク構築中や検証中にpingによる疎通確認を繰り返し行ないたいときがありますが、何度も複数のVDXにログインしてpingするのは煩わしいものです。BWC(Brocade Workflow Composer/StackSotrm)のワークフローで自動化してみましょう。

 

既存のアクションを使う案

 

VDXパックやNETWORK_ESSENTIALSパックにはpingを打つアクションがありません。NOSのNETCONFやRESTのドキュメントを調べてみるとそもそもAPIがpingを提供していないことがわかります。そこでNOS CLIに任意のコマンドを打ち込むアクションを使うことにします。NETWORK_ESSENTIALS.execute_cli CLICRUD.ops_command ですが、ほぼ同じなので後者を使ってみます。

 

アクションパラメーター

 

VDXにログインするユーザー名・パスワードがアクションのパラメーターになく、パックのコンフィグファイルに書くことになっています(設定方法)。これだと、どのVDXにも同一のユーザー名・パスワードでログインすることになるので実運用ではNETWORK_ESSENTIALS.execute_cli を使った方がいいでしょう(ユーザー名・パスワードがパラメーターになっています)。必要な情報を入れてRUNボタンを押すとVDX上でコマンドを実行します。実行結果のJSONを見ればコマンドの出力がそのまま入っているのでpingの成否を確認することができます。このアクションを複数実行するワークフローを作ってみました。

 

---
version: '2.0'

default.multiPingSample2:
  tasks:
    ping_1_1:
      # [105, 128]
      action: clicrud.ops_command
      input:
        host: "10.20.30.40"
        command: "ping 10.0.0.1 vrf mgmt-vrf count 1 timeout 1"
      publish:
        ok_1_1: <% not task(ping_1_1).result.result =~ '100% packet loss' %>
      on-complete:
        - ping_1_2
    ping_1_2:
      # [105, 230]
      action: clicrud.ops_command
      input:
        host: "10.20.30.40"
        command: "ping 10.0.0.2 vrf mgmt-vrf count 1 timeout 1"
      publish:
        ok_1_2: <% not task(ping_1_2).result.result =~ '100% packet loss' %>

 

自動化はできましたが使ってみるとpingの成否がわかりにくくて不便です。GUIまたはCLIでアクションの result.result を見ればpingコマンドの出力が入っているので確かに成否はわかりますが面倒です。上記のワークフローではYAQLの正規表現マッチで判定し、変数名を付けてpublishしています(変数にtrueまたはfalseの論理値が設定される)が、それでもわかりにくさはあまり変わりません。またping成否によってワークフローを分岐させることもCase文に似た構文でできますが(マニュアルの「Mistral + YAQL」の項を参照)、ワークフローが見にくくなって実用的ではありません。

 

publish

 

自分でPythonアクションを書く案

 

発想を変えてPing成否をアクションの終了ステータスで通知してはどうでしょうか。アクションの終了ステータスはアクションが実行できたかどうかを示すもので、pingが実行できさえすれば疎通してもしなくても終了ステータスは成功とするのが普通の考えです。しかしアクションは運用に便利なように設計した方が絶対いいです。Pingの成否を終了ステータスにすればGUIやCLIで見たとき緑と赤に色分けされて一目でわかりますし、ワークフローを分岐させるのも緑と赤の矢印を使うだけです。

既存のアクションにそのような変則的な動作はできないので、やはり自分でPythonアクションを書きましょう。実はCLICRUDパック以前にclicrudというPythonライブラリーがありSSH経由でVDX・ICX・MLXなどのCLIを操作することができます。これを使ったアクションをパックにしたのがCLICRUDです。パックは使わずにclicrudを使って自分のアクションを書きましょう。

 

remotePing.py

from st2actions.runners.pythonrunner import Action
from clicrud.device.generic import generic

class remotePing(Action):
    def run(self, host, user, password, target, vrf):
        transport = generic(host=host, username=user, password=password, enable=password, method='ssh')
        cmd = 'ping {} vrf {} count 1 timeout 1'.format(target, vrf)
        result = transport.read(cmd, return_type='string')
        print result
        ok = result.find('100% packet loss') < 0
        return (ok, {'src':host, 'dst':target, 'ok': ok})

 

remotePing.yaml

description: 'Run ping on specified VDX'
entry_point: remotePing.py
name: remotePing
runner_type: 'python-script'
parameters:
  host:
    description: 'IP address of VDX to ping from'
    type: 'string'
    required: true
  user:
    description: 'User name to login as'
    type: 'string'
    required: true
  password:
    description: 'Password to login with'
    type: 'string'
    required: true
  target:
    description: 'Target IP address to ping'
    type: 'string'
    required: true
  vrf:
    description: 'VRF'
    type: 'string'
    default: 'mgmt-vrf'

 

requirements.txt

clicrud

 

 実行結果をGUIで確認すると以下のとおりです。

 

 実行結果

 

 

関連リンク

NOS内蔵PythonとBWCの連携

PyNOSを使ってみよう

NOS内蔵Python

 

StackStorm Slack日本語チャネル開設 

日本語でのStackStorm情報交換の場所としてSlackの日本語チャネルを開設しました。
SlackのStackstorm-communityチームに登録されている方はそのまま#community-japanへ参加できます。
まだstackstorm-communityチームに登録されていない方は以下から参加できます

https://stackstorm.typeform.com/to/K76GRP