てくなべ (tekunabe)

ansible / network / automation / StackStorm

「Ansibleもくもく会 2019.01 ネットワーク編 in 富士通」にメンターとして参加しました

はじめに

2019/01/ に Ansible のハンズオンイベント「Ansibleもくもく会 2019.01 ネットワーク編 in 富士通」が、 富士通ソリューションスクエア PLYで開催されました。

ansible-users.connpass.com

本イベントに、メンターとして参加させていただいたので簡単ににレポートいたします。

■ Ansible もくもく会とは?

Ansible もくもく会とは、Ansible ユーザー会の主催で1ヶ月に1回くらいの頻度で開催されるハンズオンイベントです。 サーバー編、ネットワーク編があります。 イベントの開催情報は、connpass の Ansible ユーザー会 グループのメンバーになると通知されます。 また、 slack の ansiblejp というワークスペースでも情報をキャッチできます。(Joinはこちらから)

自分で用意するのは Wi-Fi 接続できる PC と SSH クライアントくらいです。ハンズオンに必要なAnsibleをインストールしたサーバー、自動化対象のサーバー、ネットワーク機器は、すべてレッドハットさんから提供されます。 参加者ひとりひとりに1セットずつ割り当てられるので、環境は非常に恵まれています。

使用する linklightというコンテンツも用意されていて、日本語版もあります。


■ メンターとは?

もくもく会では、参加者がハンズオンをもくもくしている過程で、つまずいたり疑問に思ったことがあったときに書き込めるオンラインのメモ帳が用意されます。 その質問に対して、一緒に悩んだり、もし答えられれば答えるといった役割を持つのがメンターです。もちろん、口頭でやりとりもします。 もくもく会の参加の枠として、一般参加枠より倍率が低くて当選しやすい「メンター枠」が用意されているのがメリットです。

私も過去数回担当させていただきました。


■ 当日の様子

富士通ソリューションスクエア PLY という素敵な会場で、もくもくやっていきました。

www.fujitsu.com

今回はネットワーク編でした。ネットワーク編は今回で3回目でしたが、今回初めて Networking-v2 という新しいハンズオンコースでコンテンツ、環境での開催でした。


寄せられた質問の例

雰囲気をお伝えするため、参加者から寄せられた質問をいくつか要約して抜粋します。(実施はもっと細かく具体的にやりとりしています)

  • [Q] Exercise 1.2 の Step 1 の「factsの取得を制限したい場合」とは?

    • [A] 制限する目的はコントロールノードのメモリの節約と、情報収集時にかかるターゲットノードへの負荷の軽減。
    • [A] ios_facts モジュールでは、デフォルトでハードウェアやインターフェースに関するfactsを収集するが、 gather_subset オプションで変更できる。
  • [Q] Exercise 1.2 の Step 4[WARNING]: Unable to parse /home/student/lab_inventory/hosts as an inventory source (略) のようなエラーが表示されてしまう。

    • [A] 指定したインベントリファイルが見つからないようです。ansible-playbook コマンドを実行する際のディレクトリをご確認ください。

勇気をもって質問しちゃいましょう

「こんな簡単なこと質問しちゃってもいいのかな?」という内容でも思い切って書いて持ったほうが良いです。結構他の人も同じところでつまずいていたりしますので。


■ 成果共有LT枠 もおすすめ!

もくもくタイムが終わったら、成果共有LTの時間です。成果共有LTといっても 特に資料はつくる必要はなく口頭で

  • どこまでできたか
  • わかったかこと
  • つまずいたところ

などを数分発表するだけ OK です。

この役割の人向けに、申し込み時に「成果共有LT枠」が用意されています。やはり一般参加枠より倍率が低く参加しやすいです。その割にはお手軽なので、とてもオススメです。


■ まとめ

これまでは、恵比寿のレッドハットさんのセミナルームで開催されるてきたのですが、前回は弊社、今回は富士通さんの会場ということで、他の会場での開催の流れができてきました。

今後も定期的に開催されると思いますので、Ansible ユーザー会 グループや、ansiblejp slack をチェックの上、ご参加されてみてはいかがでしょうか。

ネットワークのテスト自動化に利用できそうなツールまとめ

はじめに

サーバーのテスト自動化といえば、 ServerspecTestinfrainfrataster などが有名ですが、ネットワークのテスト自動化については、みんなが口をそろえて名前を出すものがないような印象です。一方で、リスクの観点から設定変更の自動化より先にテストや状態確認の自動化からはじめたいというケースもあるのではないでしょうか。

この記事では、どんなツールや組み合わせがネットワークのテストの自動化に使えそうかをまとめます。

ざっくりとした内容となっていますが、もし誤りや不足などありましたら @akira6592 までご連絡いただけると幸いです。

一覧

名前 タイプ 実機接続 主なテスト内容 言語
NetTester フレームワーク 物理ネットワークの受入テスト Ruby
pyATS フレームワーク 疎通や show コマンド実行結果の妥当性 Python
Ansible + TextFSM + assert モジュール フレームワーク show コマンド実行結果の妥当性 (内部はPython)
Ansible + napalm_validate モジュール フレームワーク show コマンド / traceroute 実行結果の妥当性 (内部はPython)
netmiko + TextFSM ライブラリ show コマンド実行結果の妥当性 Python
NAPALM + napalm_validate ライブラリ show コマンド / traceroute 実行結果の妥当性 Python
batfish エンジン + ライブラリ 不要 コンフィグや、経路、ACLの妥当性 Java (pythonクライアント pybatfish あり)


フレームワーク

NetTester

OpenFlow を利用したネットワーク自動テストツールです。複数機器を接続した状態で障害試験などができます。

pyATS

疎通や show コマンド実行結果の妥当性を検証できるテストフレームワークです。

Ansible + TextFSM + assert モジュール

Ansible のネットワークモジュールで show コマンドを実行し、TextFSMというパーサーを parse_cli_textfsm フィルター経由で呼んでパースし、その結果を assert モジュール で妥当性を判定する組み合わせです。

Ansible + napalm_validate モジュール

Ansible のサードパーティansible-napalm モジュール群があります。 その中に、想定する状態を YAML で定義して、実際の結果と比較 napalm_validate というモジュールがあります。この仕組みを利用して、妥当性を判定する組み合わせです。


■ ライブラリ 系

netmiko + TextFSM

ネットワーク自動化 Python ライブラリ netmiko と、TextFSM というパーサーを利用して、Python の assert メソッドで妥当性を確認する組み合わせです。 unittest や pytest など、ユニットテストツールと組み合わせも面白いかもしれません。

NAPALM + napalm validate

ネットワーク自動化 Python ライブラリ NAPALM の validate 機能です。 想定する状態を YAML で定義して、実際の結果と比較します。napalm というコマンドラインツールから呼び出すこともできます。

batfish

ネットワーク機器のコンフィグの様々な検証ができる ツールです。 実機に接続する必要がなく、コンフィグファイルがあれば検証できるのが特徴です。 エンジン本体は Java で書かれていますが、Python クライアントである pybatfish から扱うことができます。


■ まとめ

ネットワークのテスト自動化にどんなツールや組み合わせが使えそうかをまとめました。ご参考になれば幸いです。

[Ansible] Junos の設定投入後に commit せずに candidate config を取得する

■ はじめに

Ansible は、Juniper Junos のネットワーク機器に対応していて、情報の取得や設定変更ができます。

Junos は設定投入後に commit することによって、実際の動作に反映されます。設定変更の流れの中で、commit 前の candidate config を確認したいこともあるのではないでしょうか。そこでこの記事では、Junos の設定変更後に commit せずに candidate config を取得する方法をご紹介します。

Junos はJuniper のラボサービス vLabs を利用させていただきました。(vmx 17.4R1-S2.2)

実現できるのは Galaxy モジュール

Junos 対応モジュールには、大きく分けて Ansible に標準で組み込まれているモジュールと、Ansible Galaxy 経由で提供されている Galaxy モジュールの 2 種類あります。

commit せずに candidate config を取得といったことができるのは、Galaxy モジュールのほうです。ここでは、juniper_junos_config モジュールを利用します。


■ 環境の準備

必要 Python パッケージのインストール

Galaxy モジュール を利用するためには junos-eznc(PyEZ) をインストールする必要があります。私の環境では、 jxmlease もインストール必要がありましたので合わせてインストールします。

pip install コマンドでインストールします。

$ pip install junos-eznc jxmlease

(参考) インストールしていないと、あとで Playbook 実行時に以下のようなエラーになります。

fatal: [vmx]: FAILED! => {"changed": false, "msg": "junos-eznc (aka PyEZ) >= 2.1.7 is required for this module. However, junos-eznc does not appear to be currently installed. See https://github.com/Juniper/py-junos-eznc#installation for details on installing junos-eznc."}

Galaxy モジュール のインストール

aansible-galaxy install Juniper.junos コマンドで対象の Galaxy モジュールをインストールします。

$ ansible-galaxy install Juniper.junos
- downloading role 'junos', owned by Juniper
- downloading role from https://github.com/Juniper/ansible-junos-stdlib/archive/2.1.0.tar.gz
- extracting Juniper.junos to /home/vagrant/.ansible/roles/Juniper.junos
- Juniper.junos (2.1.0) was installed successfully


■ Playbook の作成と実行

インベントリファイル

対象ホストの定義です。今回は1台を vlabs というグループで囲っています。

  • inventory
[vlabs]
vmx ansible_host=172.16.0.1

Playbook

投入したいコマンドを指定した Playbook を作成します。 コミットしないという commit: no と、candidate config を取得する retrieve: candidate オプションがポイントです。

  • junos_get_candidate.yml
- hosts: vlabs
  gather_facts: no
  roles:
    - Juniper.junos     # ロールの読み込み

  tasks:
    - name: set config and get candidate config
      juniper_junos_config:
        lines:                     # 投入コマンド
          - set system ntp server 10.0.0.123
        load: merge
        format: set                # set 形式で扱う
        commit: no                 # コミットしない
        retrieve: candidate        # candidate config 取得
        host: "{{ ansible_host }}" # 対象ホスト
      register: res
    
    - name: save file            # ファイルへの保存タスク
      copy:
        content: "{{ res.config }}"    # 改行入りコンフィグの文字列を指定
        dest: "{{ inventory_hostname }}_changed_candidate_config.txt" 

  vars:  # 説明簡略化のため、Playbook 内に変数定義
    ansible_connection: netconf
    ansible_port: 35000                # 環境の都合上指定、デフォルトは netconf の場合 830
    ansible_user: testuser
    ansible_password: testpass9999

host オプションのデフォルトは {{ inventory_hostname }} です。そのため今回のインベントリファイルでいうと、vmx になりますが、これは便宜上付けた名前であり名前解決できないので、{{ ansible_host }} (今回の場合 172.16.0.1) を指定しています。

なお、Junos 側に ntp server の設定が何もない状態からはじめることを想定しています。

実行と確認

playbook の実行

今回は、安全のため Playbook 側に チェックモード相当の commit: no を指定をしていいます。そのため、 ansible-playbook コマンドとしては --check オプションは不要ですが、ここでは意図を明確にするために --check をつけて実行しています。

$ ansible-playbook -i inventory junos_commit.yml --check
PLAY [vlabs] ****************************************************************

TASK [set config and get candidate config] **********************************
changed: [vmx]

TASK [save file] ************************************************************
ok: [vmx]

PLAY RECAP ******************************************************************
vmx                        : ok=2    changed=1    unreachable=0    failed=0

changed になりますが、あくまでコミットはしません。

取得した candidate config の確認

candidate config がファイルとして保存され、set system server 10.0.0.123 コマンドに相当するコンフィグが あること を確認します。

set version 17.4R1-S2.2
(...略...)
set system ntp server 10.0.0.123            # ある(想定通り)
set chassis fpc 0 pic 0 number-of-ports 8
set chassis fpc 0 lite-mode
set interfaces fxp0 unit 0 fami

Junos 側の確認

Junos 機器側には、set system server 10.0.0.123 コマンドに相当するコンフィグが ないこと (commitしていいないため)を確認します。

jcluser@vMX-0> show configuration system ntp
                # ない(想定通り)
jcluser@vMX-0>


■ まとめ

Ansibleで、Junos の設定投入後に commit せずに candidate config を取得する方法をご紹介しました。

投入しようとしている部分的なコンフィグが、文法エラーなどによってはじかれてしまうのではないか、という不安を解消するには、机上チェックではなかなか難しいです。

実機に投入後、commit せずに canndidate config を取得すれば、その不安を解消できると思います。また、candidate config には想定する作業後の全行のコンフィグが含まれています。これを例えば、さらに Batfish に読み込ませて、実機反映前に事前検証するといった用途が考えられます。

参考にしていただければ幸いです。

Visual Studio Code の拡張をはじめて作ったときの流れ

■ はじめに

Visual Studio Code の拡張をはじめて作りました。(自分向け) marketplace.visualstudio.com

この記事では、経緯や作る過程などをまとめます。


■ 経緯

このブログもそうなのですが、Markdown を書くことがよくあります。1つ個人的な悩みがあるのが表の書き方です。どうも横に長くなりがちなので苦手です。

|Header 1|Header 2|Header 3|
|:------|:------|:------|
|Column 1-1|Column 1-2|Column 1-3|
|Column 2-1|Column 2-2|Column 2-3|

以下のような HTML を書いていたこともあり、表の見た目の再現性よりも縦長に書くほうが慣れていました。

<table>
  <tr>
    <th>Header 1</th>
    <th>Header 2</th>
    <th>Header 3</th>
  </tr>
  <tr>
    <td>Column 1-1</td>
    <td>Column 1-2</td>
    <td>Column 1-3</td>
  </tr>
  <tr>
    <td>Column 2-1</td>
    <td>Column 2-2</td>
    <td>Column 2-3</td>
  </tr>

そこで、以下のようにネストしたリストを書くと表の形式に変換できたらいいなと思いました。

- 
  - Header 1
  - Header 2
  - Header 3
- 
  - Column 1-1
  - Column 1-2
  - Column 1-3
- 
  - Column 2-1
  - Column 2-2
  - Column 2-3

VS Code を普段使っていますが、既存の Markdown 関係の拡張機能を調べてみても該当の機能を持つものがなかったので、作ることにしました。 もしかしたら既存であったかもしれませんが、 VSCode の拡張はいままで作ったことがなかったので勉強のためにもやることにしました。


■ 開発から公開までの全体の流れを知る

こちらを参考の記事をにさせていただきました。

yoshinorin.net


■ 開発〜公開

Hello World で雰囲気をつかむ

https://code.visualstudio.com/api/get-started/your-first-extension

このページに、Hello World を表示させるだけの簡単なチュートリアルがあります。 こちらを元にして少し修正してみたりして、雰囲気をつかみました。

サンプル一式のリポジトリは、Microsoft/vscode-extension-samples です。

実装

API リファレンスや、既存の拡張機能のソースを読んだりしながら、やりたいことを実装していきました。 TypeScript 自身が初めてだったのですが、VS Code で開発するとデバッグがしやすかったです。

Markdown のリストを読み込む部分は、おそらく VS Code 自身が持っている機能を利用したかったのですが、やり方が分からなかったので、ちょっとしたパース処理を書くことにしました。

テストコード

Hello Worldチュートリアルで生成するプロジェクトに、簡単なテストコードも含まれていました。そのテストコードを参考にして書いていきました。 Mocha というテストフレームワークと使っているようです。

リリース準備

拡張機能の名前やバージョン番号、作成者などの情報を package.json というファイル名のマニフェストファイルに書いていきます。 Marketplace 上の説明ページなどにも利用されます。 各項目の説明は Extension Manifest に書かれています。 マニフェストファイルもやはり、既存の拡張機能のものをお手本にさせていただきました。

リリース

Publishing Extension というページに従いました。


■ 感想とまとめ

いつかなにか作ってみたいなと思っていたのですが、ようやく重い腰をあげることができまいした。やってみると思ったよりは簡単にできました。 ただ、まだまだ API リファレンス の見方になれていないため「あのプロパティはどこで拾えるんだろう?」などを調べるのが少し時間かかりました。 今回でいうと、選択中の文字列の取得や、エディタとして設定されている改行コードです。

モノや環境としてはまだまだ改善点があったり、引き続きちょっとずつ取り組んでみたいと思います。

ネットワーク自動化ツールの選定ポイント(Ansible、Netmiko、NAPALM、Nornir)

はじめに

近年、ネットワーク機器への作業を自動化するOSS のツールやライブラリが増えてきています。この記事では、こんな観点でツールを検討するのが良いのでは、という自分の案をまとめてみます。

例示するツールとしては、Python で実装されている AnsibleNetmikoNAPALMNornir を取り上げています。標準で利用できる機能を想定しています。

※ 2019/01/08 時点のバージョン、Ansible 2.7.5、Netmiko 2.3.0、NAPALM 2.3.3、Nornir 2.0.0 を対象


■ 検討ポイント

[1] 対象プラットフォームに対応しているか

まず気になるのが、そのツールが操作対象のプラットフォーム(Cisco IOS、Juniper Junos、Arista EOS など)に対応しているか、ということだと思います。

各ツールの対応状況が分かるリンクを掲載します。

Ansible の対応数は中くらい

https://docs.ansible.com/ansible/latest/modules/list_of_network_modules.html

Netmiko は多め

https://github.com/ktbyers/netmiko#supports

NAPALM は少なめ

https://napalm.readthedocs.io/en/latest/support/index.html

Nornir は他に依存

実際の接続部分に netmiko、NAPALM のどちらを選択するかに依存します。


[2] コードを書くか、書かないか

仕組みを作る人、使う人、メンテナンスする人のスキルセットなどによって、コード(プログラム)を書くか書かないかという方針も変わってくると思います。

コードを書くという場合は、netmiko、NAPALM、Nornir といった、Python ライブラリとして提供されてものが利用できます(Ansible も Python API あり)。

一方で、コードを書かないという場合は、 Ansible のような YAML で構成を定義していくタイプが候補に挙げられます。


[3] シンプルか、高機能か

シンプルなツールは、それに特化して覚えることが少ないですが、自前で処理を作る部分が多くなります。 高機能なツールは逆に、覚えることが多いですが、自前処理は少なります。

Python ライブラリでは、シンプルな順に netmiko、NAPARLM、Nornir ではないかと思います。


[4] すでに利用しているツールがあるか

例えば、すでにサーバーチームが Ansible を利用している、といった状況であれば、相乗りで導入しやすくなるのではないでしょうか。 他にも、既存のスクリプトがあるのであれば、同じツールを利用すると統一感がとれます。


[5] どのくらい操作を抽象化したいか

TeraTerm マクロのように show run 等のコマンドをそのまま実行するタイプに対して、get_config のような関数を介してコマンドを実行することをここでは抽象化と呼びます。抽象化は、コマンドやベンダー意識しなくてよい(程度はものによります)、パラメータ化しやすいといったメリットがあります。

Ansible

コマンドそのまま実行する、ios_commmandios_config のようなモジュールのほかに、ios_system のような、コマンドを抽象化したモジュールもあります。プラットフォームによって、まちまちです。

Netmiko

コマンドそのまま実行するタイプです。抽象化したい場合は、テンプレート化などで対応する必要があります。

NAPALM

get_configget_interfaces などのコマンドを抽象化した関数があります。コマンドそのまま実行することもできます。

Nornir

実際の接続部分に Netmiko、NAPALM のどちらを選択するかに依存します。


[6] インベントリ・変数管理機能が必要か

ツールによっては操作対象の機器をグループ定義して管理したり、それらが利用する変数を定義したりする機能が、あらかじめ備わっているものがあります。

Ansible

接続対象を管理する Inventory や、ホストやグループ単位で変数を管理する仕組みがあります。

netmiko

特に接続対象や変数を管理する仕組みはありません。

NAPALM

特に接続対象や変数を管理する仕組みはありません。

Nornir

接続対象を管理する Inventoryや、ホストやグループ単位で変数を管理する仕組みがあります。


■ まとめ

ポイント Ansible Netmiko NAPALM Nornir
[1] 対応プラットフォーム数 多い 少ない 接続部分に依存
[2] コード? YAML Python Python Python
[3] シンプル/高機能 高機能 シンプル 高機能 高機能
[4] すでに利用しているか - - - -
[5] 抽象化レベル × 接続部分に依存
[6] インベントリ・変数管理機能 × ×

どんな観点でネットワーク自動化のツールを検討するのという案をまとめました。考え方や状況によって選び方は変わってくると思います。参考になれば幸いです。

なにかご意見ございましたら @akira66592 までご連絡いただければと思います。

参考

www.slideshare.net tekunabe.hatenablog.jp tekunabe.hatenablog.jp

Juniper 機器が検証できるリモートラボサービス「Juniper vLabs」の利用方法

■ はじめに: Juniper vLabs とは

Juniper vLabs とは、Juniper の仮想ネットワーク機器を検証用途でリモートから利用できる、無料のラボサービス(現在BETA版)です。非常にありがたいサービスです。

用意されたトポロジの中から、利用したトポロジを予約すると自分用に割り当てらます。割り当てられると、各機器にコンソールに入って操作できます。各機器にはグローバル IP アドレスが割り振られるため、手元の PC の SSH クライアントからも接続できます。

f:id:akira6592:20190101205402p:plain:w400
Juniper vLabsトポロジ表示画面

類似のサービスとしては、Cisco DevNet の Sandbox があります(参考: 日本語ブログ)。

この記事では、Juniper vLabs で利用できるトポロジや、各機器へのログイン(ブラウザ・SSH クライアント)までの簡単な利用手順をご紹介します。

(補足) 公式ドキュメント

英語ですが、公式ドキュメントに手順などがしっかり掲載されています。

動画

※ 本記事執筆時点では BETA サービスのため、大きな仕様変更などがされる場合があります。




■ 利用できるトポロジ

Juniper vLabs では、現在、以下のトポロジを利用できます。1台だけのトポロジもあれば、複数台組み上がったトポロジもあります。

Standalone

  • Standalone vMX
  • Standalone vSRX
  • Standalone vQFX Light
  • Standalone vRR

Routing

  • OSPF - Single-area
  • OSPF - Multi-area
  • IS-IS - Single-area
  • IS-IS - Multi-level/area
  • BGP - Multi-AS
  • BGP - Multi-AS with Route Reflection

Security

Automation

  • JET for Junos - Automation and Programmability Network Management, Telemetry, and Analytics

Network Management, Telemetry, and Analytics

  • Contrail HealthBot




■ 利用手順

Juniper vLabs サービスへのログイン

https://jlabs.juniper.net/vlabs/ から Juniper User ID でログインします。 アカウントがない場合は、このページを参照してください。


トポロジの選択・予約

ログインするとトポロジ一覧が表示されます。利用したトポロジの画像、または Launch をクリックします。 ここでは例として、OSPF - Single-area をクリックします。

トポロジ図のページが表示されます。この状態ではまだ予約されていません。

f:id:akira6592:20190101205402p:plain:w400
Juniper vLabsトポロジ表示画面

予約するために、ページ右上の Reverve ボタンをクリックします。

f:id:akira6592:20190101205643p:plain
RESERVE ボタンで予約開始
予約処理が開始されると Your Juniper vLab "OSPF - Single area" is being created のようなタイトルのメールが届きます。

スケジュールなどの項目を必要に応じて変更し、Reserve ボタンをクリックします。

f:id:akira6592:20190101205901p:plain
予約の詳細指定画面

予約処理中は、トポロジ画面右上が以下のような表示になります。予約処理完了までの残り時間目安が分かります。

f:id:akira6592:20190101205924p:plain
予約処理実行中
予約処理が完了すると以下のような表示になります。

f:id:akira6592:20190101205953p:plain
予約処理完了(利用可能状態)

同時に Your Juniper vLab "OSPF - Single area" is now available のようなタイトルの予約完了メールが届きます。本文には各機器へログインするユーザー名とパスワードが記載されています。

機器へのログイン

機器へログインする方法は、ブラウザ、SSHクライアントの2通りあります。

ブラウザでログイン

ログインしたい機器のアイコンにカーソルを近づけたときに表示される をクリックして SSH を選択します。

f:id:akira6592:20190101210125p:plain
ブラウザでログイン

別タブでブラウザ用のコンソール画面が jcluser ユーザーでログインされた状態で開きます。

f:id:akira6592:20190101210159p:plain
ブラウザでログインした状態

SSH クライアントでログイン

準備: 許可アクセス元 IP アドレスの設定

デフォルトでは外部からのアクセスは許可されていません。 そのため、手元の SSH クライアントでログインするには、まず許可アクセス元 IP アドレスの設定をする必要があります。

トポロジ画面上部の COMMANDS ボタンをクリックします。

f:id:akira6592:20190101210304p:plain:w300
COMMANDS ボタン

トポロジ画面右の Add Allowed Network Prefixes> ボタンをクリックします。

f:id:akira6592:20190101210413p:plain
許可アクセス元IPアドレスの設定 その1

つづいて、画面右側に表示される xxx で 許可したい IP アドレス(プレフィックス指定も可)を入力して、Runボタンをクリックします。

f:id:akira6592:20190101210512p:plain
許可アクセス元IPアドレスの設定 その2

なお、外部から見たときの、手元の PC のグローバル IP アドレスは ipconfig.io などで調べられます。

許可アクセス元 IP アドレスの設定が Running 状態を経て完了すると、以下のようにCompleted になります。

f:id:akira6592:20190101210634p:plain
完了

これで、手元の SSH クライアントでログインする準備ができました。

アクセス先 IP アドレス・ポートの確認とログイン

アクセス先 IP アドレス・ポート

アクセスしたい機器のアイコン付近の緑色の マークにカーソルを乗せると、SSH でアクセスするためのグローバル IP アドレスとポートが表示されます。(NETCONFなどのほかの方法の情報も表示されます。)

ユーザー名とパスワード

デフォルトで設定されているユーザー名とパスワードは、トポロジ予約処理完了時に送られる Your Juniper vLab "OSPF - Single area" is now available のようなタイトルののメール内に記載されています。

これらの情報を元にして、SSH クライアントでログインします。

終了

予約の時間がすぎると自動で環境が終了(シャットダウン)しますが、明示的に終了させることもできます。

f:id:akira6592:20190101211628p:plain
終了



■ まとめ

Juniper vLabs で利用できるトポロジや、各機器へのログイン(ブラウザ・SSH クライアント)までの簡単な利用手順をご紹介しました。

ネットワーク作業の自動化の検証をしたいときに、ネックになりやすいのがネットワーク機器の準備です。今回ご紹介した、Juniper vLabs や、Cisco DevNet の Sandboxなどのサービスでは、気軽に仮想ネットワーク機器の環境を用意できるので、活用できるのではないでしょうか。

netmiko と TextFSM を利用してネットワーク機器の show コマンド結果をパースする

■ はじめに

ネットワーク自動化 Python ライブラリ netmiko では、状態表示のための show コマンドや、設定変更のコマンドを実行できます。

TextFSM というパーサー連携して、 show コマンド結果を パース して扱う事ができます。

f:id:akira6592:20181231134801p:plain:w500
パースされた Junos の show version 結果例

TextFSM では、特定の show コマンドに対して専用のテンプレート(正規表現によるパターン化)を用意して、パースさせます。 テンプレートは自作することもできますが、ntc-templates にあるものを利用するのが便利です。

Juniper Junos、Arista EOS、Cisco IOS/IOS-XR/NX OS などの代表的なコマンドに対応するテンプレートが、現在 250 以上あります。

もし、機器側が NETCONF や REST API に対応していれば、その方法でパースされた情報を取得するほうがスマートでしょうが、対応していないケースも多いと思います。

この記事では、ntc-templates に最近追加された Juniper の show vesrion コマンドに対応するものを利用して、このコマンド結果をパースしてみます。

参考

kooshin.hateblo.jp

想定環境

■ 環境の準備

  • netmiko のインストール
$ pip install netmiko
  • ntc-templates の TextFSM テンプレートをダウンロード
$ cd ~
$ git clone https://github.com/networktocode/ntc-templates.git

このパスにしておくことで、netmiko が自動的に TextFSM テンプレートを探しに行ってくれます。

■ Junos の show version をパースするサンプル

  • junos_version.py
from netmiko import Netmiko
import pprint

junos = {
    "host": "172.16.0.1",
    "username": "testuser",
    "password": "testpass9999",
    "device_type": "juniper_junos",
    "port": 38005   # デフォルトは 22
}

net_connect = Netmiko(**junos)  # 接続

output = net_connect.send_command("show version", use_textfsm=True) # TextFSMを利用するオプションを True に指定

pprint.pprint(output)  # 表示

net_connect.disconnect()  # 切断
  • 実行結果

以下のように、パースされ、key/value 形式になっていることが確認できます。

$ python junos_version.py
[{'appid_services': '20180316.180938_builder_junos_174_r1_s2',
  'base_os_boot': '',
  'base_os_software_suite': '',
  'border_gateway_function_package': '',
  'crypto_software_suite': '',
  'hostname': 'vMX1',
  'idp_services': '20180316.180938_builder_junos_174_r1_s2',
  'junos_version': '17.4R1-S2.2',
  'kernel_software_suite': '',
  'lab_package': '',
  'model': 'vmx',
  'online_documentation': '20180316.180938_builder_junos_174_r1_s2',
  'other_device_properties': ['OS Kernel 64-bit  ',
                              'OS libs ',
                              'OS runtime ',
                              'OS time zone information ',
                              'network stack and utilities ',
                              'libs ',
                              'OS libs compat32 ',
                              'OS 32-bit compatibility ',
                              'libs compat32 ',
                              'runtime ',
                              'Packet Forwarding Engine Simulation Package ',
                              'py extensions ',
                              'py base ',
                              'OS vmguest ',
                              'OS crypto ',
                              'mx libs compat32 ',
                              'mx runtime ',
                              'common platform support ',
                              'mtx network modules ',
                              'modules ',
                              'mx modules ',
                              'mx libs ',
                              'mtx Data Plane Crypto Support ',
                              'daemons ',
                              'mx daemons ',
                              'Services URL Filter package ',
                              'Services TLB Service PIC package ',
                              'Services SOFTWIRE ',
                              'Services PCEF package ',
                              'Services Logging Report Framework package ',
                              'Services Deep Packet Inspection package ',
                              'Services IDS ',
                              'Services COS ',
                              'Extension Toolkit ',
                              'jfirmware ',
                              'jail runtime '],
  'other_properties_versions': ['20180127.fdc8dfc_builder_stable_11',
                                '20180127.fdc8dfc_builder_stable_11',
                                '20180127.fdc8dfc_builder_stable_11',
                                '20180127.fdc8dfc_builder_stable_11',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180127.fdc8dfc_builder_stable_11',
                                '20180127.fdc8dfc_builder_stable_11',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180127.fdc8dfc_builder_stable_11',
                                '20180127.fdc8dfc_builder_stable_11',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180316.180938_builder_junos_174_r1_s2',
                                '20180127.fdc8dfc_builder_stable_11'],
  'packet_forwarding_engine_support_m_t_ex_common': '',
  'packet_forwarding_engine_support_mx_common': '',
  'platform_software_suite': '',
  'py_base_i386': '',
  'qfabric_system_id': '',
  'routing_software_suite': '',
  'runtime_software_suite': '',
  'serial_number': '',
  'services_aacl_container_package': '20180316.180938_builder_junos_174_r1_s2',
  'services_application_level_gateways': '20180316.180938_builder_junos_174_r1_s2',
  'services_captive_portal_content_delivery_package': '20180316.180938_builder_junos_174_r1_s2',
  'services_crypto': '20180316.180938_builder_junos_174_r1_s2',
  'services_http_content_management_package': '20180316.180938_builder_junos_174_r1_s2',
  'services_ipsec': '20180316.180938_builder_junos_174_r1_s2',
  'services_jflow_container_package': '20180316.180938_builder_junos_174_r1_s2',
  'services_ll_pdf_container_package': '20180316.180938_builder_junos_174_r1_s2',
  'services_mobile_subscriber_service_package': '20180316.180938_builder_junos_174_r1_s2',
  'services_mobilenext_software_package': '20180316.180938_builder_junos_174_r1_s2',
  'services_nat': '20180316.180938_builder_junos_174_r1_s2',
  'services_ptsp_container_package': '20180316.180938_builder_junos_174_r1_s2',
  'services_rpm': '20180316.180938_builder_junos_174_r1_s2',
  'services_ssl': '20180316.180938_builder_junos_174_r1_s2',
  'services_stateful_firewall': '20180316.180938_builder_junos_174_r1_s2',
  'voice_services_container_package': ''}]

補足

なお、以下のように TextFSM を利用しないように指定することもできます。

output = net_connect.send_command("show version", use_textfsm=False)

実行結果は、普通にターミナルでコマンドを実行したときと同じような形式になります。(key/valueにはならない)

パースしない実行結果(クリックして表示)

$ python junos_version.py
('\n'
 'Hostname: vMX1\n'
 'Model: vmx\n'
 'Junos: 17.4R1-S2.2\n'
 'JUNOS OS Kernel 64-bit  [20180127.fdc8dfc_builder_stable_11]\n'
 'JUNOS OS libs [20180127.fdc8dfc_builder_stable_11]\n'
 'JUNOS OS runtime [20180127.fdc8dfc_builder_stable_11]\n'
 'JUNOS OS time zone information [20180127.fdc8dfc_builder_stable_11]\n'
 'JUNOS network stack and utilities [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS libs [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS OS libs compat32 [20180127.fdc8dfc_builder_stable_11]\n'
 'JUNOS OS 32-bit compatibility [20180127.fdc8dfc_builder_stable_11]\n'
 'JUNOS libs compat32 [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS runtime [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Packet Forwarding Engine Simulation Package '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS py extensions [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS py base [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS OS vmguest [20180127.fdc8dfc_builder_stable_11]\n'
 'JUNOS OS crypto [20180127.fdc8dfc_builder_stable_11]\n'
 'JUNOS mx libs compat32 [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS mx runtime [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS common platform support [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS mtx network modules [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS modules [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS mx modules [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS mx libs [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS mtx Data Plane Crypto Support '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS daemons [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS mx daemons [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services URL Filter package [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services TLB Service PIC package '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services SSL [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services SOFTWIRE [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services Stateful Firewall [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services RPM [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services PTSP Container package '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services PCEF package [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services NAT [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services Mobile Subscriber Service Container package '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services MobileNext Software package '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services Logging Report Framework package '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services LL-PDF Container package '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services Jflow Container package '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services Deep Packet Inspection package '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services IPSec [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services IDS [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS IDP Services [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services HTTP Content Management package '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services Crypto [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services Captive Portal and Content Delivery Container package '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services COS [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS AppId Services [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services Application Level Gateways '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Services AACL Container package '
 '[20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Extension Toolkit [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS jfirmware [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS Online Documentation [20180316.180938_builder_junos_174_r1_s2]\n'
 'JUNOS jail runtime [20180127.fdc8dfc_builder_stable_11]\n')


■ まとめ

ネットワーク自動化 Python ライブラリ netmiko と TextFSM を利用して、Junos の show version コマンドの結果をパースしてみました。

[ntc-templates には他にも250以上のテンプレート]https://github.com/networktocode/ntc-templates/tree/master/templatesがありますので、利用したいものがあるか探しててはいかがでしょうか。

github.com