JANOGで学んだJupyter NotebookをGNS3で動かしてみた

Arista

先日のJANOG41@広島に参加してきました。BoFSPで自動化の話題がいくつも出てたのに興味をひかれ、特にJupyter NotebookっていうPythonコードを実行できるドキュメント環境が面白そうだったので自分も手を付けようと決めました。

ところがハードルがいくつか。

  • Jupyter Notebookの実行環境を作る手間がかかりそう
  • 実行環境と手持ちのネットワーク機器を繋げるのが難しい(検証環境を変えたくない)
  • さらにいうと手持ちの機器をどうやってPythonで制御できるかが不明

まぁ最後のはAPIC-EMとかみたいなコントローラ使えたらいいんでしょうけど、そこまでやるとまず環境構築が大変だよねっていう。(APIC-EMの要求スペック高すぎるー)

どうしようかなーと考えながらいろいろ触ってると自分の手元にあるGNS3でできるんじゃないかと思い、結果自分のやりたいことができちゃったので、手順メモの意味も含めて公開してみます!

環境や必要なもの

  • Macbook Air(Mid 2013, Core i7, RAM 8GB)
  • macOS High Sierra 10.13.3
  • GNS3 2.1.3
  • GNS3 VM on VMware Fusion
  • gns3/jupyter Dockerイメージ
  • Arista vEOS

GNS3の設定でGNS3 VMのメモリ割り当ては5GB(5120MB)、CPU割当は2コアにしています。
※同じGNS3 VMを使うWindowsなら同じようなことができると思います。

環境作成

gns3/jupyter Dockerイメージの追加

GNS3の設定画面から追加していきます。

1. Prerference>Docker Containterを開く

2. New ボタンをクリックする
3. “Server Type”を”Run this Docker VM on the GNS3 VM”にしてNext

4. “New image”にして、Image nameに「gns3/jupyter」を入力してNext


5. “Name”はそのままでNext

6. “Adapters”を2に変更してNext(理由は後述)

7. “Start command”はそのままでNext(必要な設定があれば何らか適宜入れてくださいね)

8. “Console type”を「http」に変更してNext



9. “Environment”はそのままでFinish!

10. テンプレートが出来たので、「Edit」ボタンをクリック

11. “HTTP port in the containter”を「8888」に変更してOKクリック


Jupyterの動作確認

外部ネットワークに接続できるかの確認も含めてやっていきます。

1. 左のペインで「End Devices」を開き、先程追加した「gns3-jupyter」をトポロジに追加







2. 続いて「NAT」クラウドをトポロジに追加。その際サーバは「GNS3 VM」を選択
3. NATクラウドの nat0 インターフェースと、gns3-jupyter-1ノードの eth0 インターフェースを接続

4. gns3-jupyter-1ノードを右クリックして「Configure」を選択

5. “Network configuration”のEditボタンをクリック

6. 以下のようにeth0のDHCP設定を有効化する

# DHCP config for eth0
# auto eth0
# iface eth0 inet dhcp




# DHCP config for eth0
auto eth0
iface eth0 inet dhcp



7. Save→OKとクリック
8. gns3-jupyter-1ノードを右クリックして”Start”

9. gns3-jupyter-1ノードを右クリックして”Console”

10. ブラウザが開きJupyter Notebookの画面が表示される

11. 画面右上のNew→Python3をクリック

12. 入力フィールドに「!ping -c 4 8.8.8.8」を入力(先頭の!を忘れないこと!)

13. 上のツールバーの再生ボタンをクリックしてpingの結果を確認する(うまくいくはず…)

14. 新たに入力フィールドが表示されるので、以下のコードを入力して再生ボタンをクリック

print("Hello Jupyter!")

「Hello Jupyter!」が表示されたら成功です。

これで、gns3-jupyter-1ノードが外部ネットワークに出られること、Pythonコードが実行できることが確認できました。

Jupyter NotebookからのvEOS制御

Arista EOSにはeAPIというJSON RPCを使ってCLIコマンドを実行できるインターフェースが用意されています。そこで、仮想スイッチであるvEOSを使って、Jupyter Notebookから以下のシナリオで環境設定してみます。

  • Managementセグメントは事前に設定ずみで、Jupyterノードと接続
  • 任意のVLANを作成し、その数字を以降の設定で使いまわす
  • vEOSノード間の接続をトランク接続にする
  • vEOS1のEthernet2にアクセスVLANとして割り当てる
  • SVIを作成する
  • SVIに割り当てたアドレスを使ってiBGPピアを張る
  • ピアリング確認後、192.0.2.0/24を広報させる

GNS3へのvEOSの登録確認

対応しているバージョンとかはドキュメントのApplianceセクションに書いてあります。vEOSについては vEOSのページを見ると書いてあります。
今回は現時点で最新の4.20.1Fを使おうと思いますので、 Aboot-veos-serial-8.0.0.iso と vEOS-lab-4.20.1F.vmdk を入手します。

vEOSの入手

1. Aristaの公式サイトにてSoftware Downloadへ行きます。アカウントが必要なのでない人は作りましょう。
2. 以下の2つのファイルをダウンロードします。

vEOSの登録

1. 左のペインで「Switches」を開き、「Available Appliance」を選択

2. “Arista vEOS”をトポロジにドロップすると、”Add Appliance”ウィザードが起動するので、そのままNext

3. “Server Type”を”Run this Docker VM on the GNS3 VM (recommended)”にしてNext

4. 問題なければ以下のように「requirements is OK」となるのでNext
※vEOSの動作にGNS3 VMがkvm有効と認識する必要があるので、VirtualBoxではだめです。VMwareを使いましょう。

5. Missingとなっているファイルにフォーカスを当ててImportボタンをクリックし、ダウンロードしたファイルを指定します。今回の場合、vEOS 4.20.1Fが「Ready to install」となったら選択してNext→Yes


6. “Qemu Setting”ではそのままNext

7. “Summary”ではそのままNext

8. “Usage”はサラッと読んでFinish!


9. 「Available Appliance」を「Installed Appliance」にすると、以下のように”Arista vEOS 4.20.1F”が追加されています。

vEOSのトポロジへの追加とJupyterノードとの接続

1. vEOSをトポロジへドロップします(このとき、Shiftキーを押しっぱなしでドロップすると同時に登録するノード数を指定できます。べんりー)

2. Jupyterノードと通信するためにEthernet Switchも追加。その際サーバは「GNS3 VM」を選択
3. Jupyterノードのeth1と、vEOSノードのManagement1をEthernet Switchに接続
4. vEOSノードのEthernet1同士を接続

トポロジは以下のようになります。vEOSなのにイメージがciscoなのはどこにもアイコンが見つからなかったためです。
※Arista公式サイトにも見当たらなかったんだよなぁ…

5. gns3-jupyter-1ノードを右クリックして「Configure」を選択
6. “Network configuration”のEditボタンをクリック
7. 以下のようにeth1のIPアドレスを設定する

# Static config for eth1
#auto eth1
#iface eth1 inet static
# address 192.168.1.2
# netmask 255.255.255.0

# gateway 192.168.1.1
# up echo nameserver 192.168.1.1 > /etc/resolv.conf



# Static config for eth1
auto eth1
iface eth1 inet static
address 192.168.0.10
netmask 255.255.255.0

# gateway 192.168.1.1
# up echo nameserver 192.168.1.1 > /etc/resolv.conf


7. Save→OKとクリック。自動的にeth1にアドレスが設定されます。
8. 2つのvEOSをStartして、Consoleを開いときます。操作はJupyterノードと同じなので説明省略!

Jupyter Notebook動かしてみよう!

1. GitHubにサンプルファイルとして AristaEOS-eAPI_test.ipynb を置いていますので、ダウンロードしてきます。
2. Jupyterのコンソールで”Upload”をクリックし、ダウンロードしたファイルを指定します

3. 追加されているファイルの「Upload」をクリック

4. 追加したNotebookをクリック
5. 表示される冒頭の事前設定をそれぞれのvEOSスイッチに対して実施

Switch1:

Switching rootfs

Welcome to Arista Networks EOS 4.20.1F
New seat seat0.
RTNETLINK answers: No such process
[  OK  ] ConnMgr: Starting TimeAgent: [  OK  ]
Cannot find initial response [FAILED]
Starting ProcMgr: [  OK  ]
Starting EOS initialization stage 1: [  OK  ]
Starting NorCal initialization: [  OK  ]
Starting EOS initialization stage 2: [  OK  ]
Starting Power On Self Test (POST): [  OK  ]
Completing EOS initialization (press ESC to skip): [  OK  ]
Model and Serial Number: unknown
System RAM: 2017260 kB
Flash Memory size:  3.7G

localhost login: admin ← ユーザ名adminでパスワード無しで入れる
localhost>enable
localhost#configure
localhost(config)#hostname vEOS1
vEOS1(config)#username apitest priv 15 secret password
vEOS1(config)#int ma1
vEOS1(config-if-Ma1)#ip address 192.168.0.1/24
vEOS1(config-if-Ma1)#no shut
vEOS1(config-if-Ma1)#management api http
vEOS1(config-mgmt-api-http-cmds)#protocol http
vEOS1(config-mgmt-api-http-cmds)#no shut
vEOS1(config-mgmt-api-http-cmds)#end
vEOS1#

Switch2:

Switching rootfs

Welcome to Arista Networks EOS 4.20.1F
New seat seat0.
RTNETLINK answers: No such process
[  OK  ] ConnMgr: Starting TimeAgent: [  OK  ]
Cannot find initial response [FAILED]
Starting ProcMgr: [  OK  ]
Starting EOS initialization stage 1: [  OK  ]
Starting NorCal initialization: [  OK  ]
Starting EOS initialization stage 2: [  OK  ]
Starting Power On Self Test (POST): [  OK  ]
Completing EOS initialization (press ESC to skip): [  OK  ]
Model and Serial Number: unknown
System RAM: 2017260 kB
Flash Memory size:  3.7G

localhost login: admin ← ユーザ名adminでパスワード無しで入れる
localhost>enable
localhost#configure
localhost(config)#hostname vEOS2
vEOS2(config)#username apitest priv 15 secret password
vEOS2(config)#int ma1
vEOS2(config-if-Ma1)#ip address 192.168.0.2/24
vEOS2(config-if-Ma1)#no shut
vEOS2(config-if-Ma1)#management api http
vEOS2(config-mgmt-api-http-cmds)#protocol http
vEOS2(config-mgmt-api-http-cmds)#no shut
vEOS2(config-mgmt-api-http-cmds)#end
vEOS2#


6. メニューの”Cell->Run All”を実行!

ずっと見てるとコードが順に実行されていって、最終的にBGPで経路情報が広告されていることも確認できます。

vEOSのコンソールでshow running-configとったりすると、実行する前後でちゃんとコンフィグが追加されていることが確認できます。

vEOS1:

vEOS1#show running-config diff
--- flash:/startup-config
+++ system:/running-config
@@ -12,9 +12,13 @@
 !
 username apitest privilege 15 secret sha512 $6$FMIU6yGt5e4N297m$mCCEZuwHz5chtn6ork8kg48TIJV1ktFrUVC8wso4Gc46DoidXSSdUlYYiKkBRpUEENjOKfut4t/Ej8NL6TjcL0
 !
+vlan 10
+!
 interface Ethernet1
+   switchport mode trunk
 !
 interface Ethernet2
+   switchport access vlan 10
 !
 interface Ethernet3
 !
@@ -39,7 +43,18 @@
 interface Management1
    ip address 192.168.0.1/24
 !
-no ip routing
+interface Vlan10
+   ip address 10.1.10.1/24
+!
+ip routing
+!
+router bgp 10
+   neighbor 10.1.10.2 remote-as 10
+   neighbor 10.1.10.2 route-reflector-client
+   neighbor 10.1.10.2 maximum-routes 12000
+   neighbor 10.1.10.10 remote-as 10
 !
 management api http-commands
    protocol http

vEOS2:

vEOS2#show running-config diff
--- flash:/startup-config
+++ system:/running-config
@@ -12,7 +12,10 @@
 !
 username apitest privilege 15 secret sha512 $6$wIzAQBeu7n4JX0rH$6lCRp8jVYaJKyAdqdk7vY9v.Vq7LzP1oWBPO/wpydNLHOqkoCx1WluNzcJcu6/R2dCL2PKf4h4GWMwwf0aFwQ0
 !
+vlan 10
+!
 interface Ethernet1
+   switchport mode trunk
 !
 interface Ethernet2
 !
@@ -36,10 +39,21 @@
 !
 interface Ethernet12
 !
+interface Loopback0
+   ip address 192.0.2.1/24
+!
 interface Management1
    ip address 192.168.0.2/24
 !
-no ip routing
+interface Vlan10
+   ip address 10.1.10.2/24
+!
+ip routing
+!
+router bgp 10
+   neighbor 10.1.10.1 remote-as 10
+   neighbor 10.1.10.1 maximum-routes 12000
+   network 192.0.2.0/24
 !
 management api http-commands
    protocol http

vEOSノードの設定を初期化してもう一度実行したい場合は、config replace startup-configってやると保存済み(事前設定直後)の状態に戻せるので、その上でJupyter Notebook側を修正してRun Allとかやってみてください。

その他にも、インストールすればpexpect使うパターンでもいけそうですし、その他のライブラリ使ったりしたらIOSやIOS-XR、Junosなんかでも同じようなことができそうですね。

最後に

どうだったでしょう?GNS3っていうとCisco試験のための学習用ってイメージがあるかもしれませんが、2系になってからは多数の仮想OSに対応するようになり、またDocker対応もされたので手軽に検証環境を作ることもできるようになっています。
また、今回のようにNATクラウドを使うことで、GNS3が動作するPCから到達可能な範囲はJupyter Notebookによる自動化の手が届く範囲になります。つまり、事前にGNS3上の仮想ネットワークで動作確認できたコードを、(アドレスだけ変えるなどした上で)そのまま実環境に向けて実行できるというわけです。

プログラム(Python3)の実行環境構築やネットワーク機器との接続を考えないでも自由に試せるので、自動化の学習や検証にはとてもいいと思います。ぜひチャレンジしてみてください!

あと、Jupyter NotebookはPython3の実行環境ですので、ネットワーク関係なくPythonのお勉強にも使えるのでおすすめですよ!

コメント

タイトルとURLをコピーしました