ネットワーク自動化開発実践 準備編 - Cisco VIRL

# はじめに

この記事はシスコの同志による Advent Calendar の一部として投稿しています
https://qiita.com/advent-calendar/2017/cisco

ネットワーク自動化開発に関する記事をいくつか投稿していこうと考えていますが、第1回の今回は、その準備として、私が普段使うネットワークシミュレータの記事を書こうと思います

連載の内容は以下のように考えていますが、気が変わったら内容を変更するかもしれません。なお、内容は初級〜中級レベルを念頭においています。

- [目次](https://qiita.com/radiantmarch/items/9df086002ee3f4f334d2)
- 第1回(本記事): ネットワーク自動化開発実践 準備編 - Cisco VIRL
- [第2回: ネットワーク自動化開発実践 - Python でルータを操作](https://qiita.com/radiantmarch/items/936b43f32210e4689179)
- 第3回: ネットワーク自動化開発実践 - Jupyter Notebook で Cool なデモをしよう
- 第4回: ネットワーク自動化開発実践 - デバイスのモデル化のご利益を感じよう - Cisco NSO を使う

# なぜシミュレータが必要なのか？
なぜ自動化の話をするのにシミュレータの話をするのでしょうか？

ネットワーク自動化に取り組むにあたっては、エンジニアとしてはオーケストレーションツールの操作やコーディングに注力したいものです。自動化の開発段階では OS の API が重要な一方で、物理的な特性は重要でないことが多いでしょう。物理的な機器のマウントや配線・OS のロード・疎通確認用の PC の配置などの作業をすることなくネットワークトポロジを作成したいはずです。

そんなときに Cisco Virtual Internet Routing Lab (VIRL；ヴァール) はこのニーズに答えてくれるツールです
[2] https://learningnetworkstore.cisco.com/virtual-internet-routing-lab-virl/cisco-personal-edition-pe-20-nodes-virl-20

<div align="center">
<img width="600" border="1" alt="Screenshot 2017-12-09 23.35.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/a9925b30-4504-707d-e1ac-4f3486c9480e.png">
</div>

なお、VIRL の商用版 (サポートあり) として Cisco Modeling Labs (CML) という製品もあります。
[3] https://www.cisco.com/c/ja_jp/products/cloud-systems-management/modeling-labs/index.html


# VIRL とは？
VIRL はシスコのネットワークシミュレータです。シミュレータといっても、シスコの OS (Cisco IOS, IOS-XE, IOS-XR, NX-OS, ASAv) の動作を模擬するだけのものではなく、実際にそれら本物の OS の仮想版が動いています。さらに監視やトラフィック疎通試験などに利用できる Linux OS のイメージも用意されています

- IOSv and IOSvL2
- NX-OSv and NX-OS 9000v
- IOS XRv and IOS XRv 9000
- IOS XE (CSR1000v)
- ASAv

- Ubuntu LXC
- iPerf LXC
- Routem LXC
- Ostinato-drone

VIRL についてはシスコエンジニアの生田さんがすでにブログで紹介されていますので、概要を理解したい方はぜひこちらを参照していただきたいと思います
[4] https://gblogs.cisco.com/jp/2016/08/virtual-internet-routing-lab-virl/

ところが VIRL のインストールや初歩的な動作までを画像付きで説明した記事はあまり無いようです。そこでこの記事では、VIRL のインストールとトポロジのデザイン、シミュレーションの実行までをご紹介して、ネットワーク自動化実践の準備ができるところまでを目指そうと思います

なお、公式のインストールガイドは[こちら](http://virl-dev-innovate.cisco.com/vs.client.php)です（英語）。詳細な設定の解説などはこちらを参照ください


# 環境
この記事は以下の環境をもとに書いています

- Server: VIRL 1.3.296 running on VMware ESXi 6.0u3
- Client: Mac OS Sierra 10.12.6

VIRL は PC/Mac 上の VMware Fusion のほか Intel サーバ上の VMware ESXi などにインストール可能です。詳細はハードウェア要件を参照してみてください
[5] https://learningnetworkstore.cisco.com/virlfaq/hardware

# VIRL のインストール
今回は VMware ESXi 上に OVA ファイルをデプロイしました

<img width="480" alt="Screenshot 2017-12-09 11.47.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/2567b73c-4438-76d9-de71-ce1b8a1d4289.png">

デプロイ自体は OVA を展開するだけです。1点戸惑うかもしれないのは OVA ウィザードでネットワークを指定される画面です。VIRL では外部との通信のために複数のネットワークを利用することができ、そのマッピングを指定することができます

<img width="480" alt="Screenshot 2017-12-09 11.48.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/4a7e2b0b-3386-0d74-a8c6-2805f6049c8f.png">

細かいカスタマイズはさておき、ひとまずは以下の2つを指定するだけで事足ります。

- VM Network: VIRL シミュレータ本体の管理アクセスに使うポート。**DHCP が有効な**マネジメントネットワークを割り当ててください。
- Flat: VIRL 上に起動する仮想マシンの管理ポートと外部が通信するためのネットワーク。デフォルトではサブネットが 172.16.1.0/24 に固定されています。新しく適当なポートグループ (VLAN) を作って割り当てておいてください。

なお、ポート割当はあとから VM 編集画面で変更できるので、そこまで気にせずデプロイを進めてしまって大丈夫です

# VIRL サーバの起動
VIRL のデプロイが終わったら早速、起動しましょう。VM のコンソールを開きます。管理ポートで DHCP が有効な場合、下のように Web アクセス用の IP アドレスが表示されるはずです

<img width="480" alt="Screenshot 2017-12-09 11.57.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/7adc55be-e5ae-aac4-dccb-379daec7baab.png">

静的 IP を使いたい場合もあると思いますが、可能です。ただ、ここでは紹介しきれないのでインストールガイドを参照して試してみてください
[5] http://virl-dev-innovate.cisco.com/vs.client.php

# VIRL 管理 Web UI へのアクセス
コンソールで表示された URL (http://{VIRLのIPアドレス}) にアクセスし、デフォルトのクレデンシャル uwmadmin / password でログインします

ここでまず VIRL をアクティベーションする必要があります。が、その前に自身の環境はインターネットに疎通できるか確認してください。もしプロキシ経由でないとインターネットにでれない場合は、先にプロキシを設定します.

## DNS とプロキシの設定
ログイン後左のメニューから VIRL Server > System Configuration > System と進みましょう。下の方に Proxy 設定があります。また DNS 設定も必要に応じて自身の環境から使えるものに変更してください。

<img width="480" alt="Screenshot 2017-12-09 12.10.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/397c0a86-fe24-d1b8-dd53-dad8c4f7014a.png">

変更後、画面右上の Apply Changes をクリックしたあと、数ステップ進んで変更を完了します

## アクティベーション
インターネットに疎通する準備ができたら、VIRL のアクティベーションを実行します。まず手元に、VIRL を購入したあと送付されてきたライセンスファイルを **解凍して** 準備しておいてください

メニューから VIRL Server > Salt Configuration and Status に進み、'Reset Keys and ID' をクリックします。

<img width="480" alt="Screenshot 2017-12-09 12.19.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/df314739-4f93-e208-9da7-86288ae9ed6e.png">

次に 'Load config file' をクリックして手元のライセンスファイル (解凍済みのもの) をアップロードします。
あとは以下のように選択しましょう

- 'List of Cisco Salt Masters' : US
- 'Master Sign Public Key': eft.pub (Regular use)

その後 'Reset' ボタンを押すとアクティベーションが開始されます

アクティベーションの完了までには時間がかかります。時々 Check status now ボタンを押して状態を確認してください。最終的に以下のようにすべてのステータスが Green 表示されたら OK です

<img width="480" alt="Screenshot 2017-12-09 12.24.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/45b7f424-a81f-a462-f796-48ca1539add0.png">

# VIRL クライアントのインストール
ここまでで VIRL シミュレーションエンジン本体のデプロイとアクティベーションが終わりました。実際にシミュレーションを開始するには、操作用の PC/Mac クライアントが必要です

これは Web UI のメニューの VIRL Sever > Download からダウンロードできます

<img width="480" alt="Screenshot 2017-12-09 12.26.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/c4044ebb-e75c-7d86-f260-7be6292e9207.png">

自身の端末の環境に合わせてインストーラを選んでダウンロードし、インストールを実行してください。私は Mac を利用しているので VMMaestro-dev-1.3.0-xxx.dmg を使いました。このインストール自体は簡単ですので、解説は省略します

## VIRL クライアントの起動と設定
インストールしたクライアントを起動します。クライアントの名前は "VM Maestro" (マエストロ；指揮者) です。

最初に利用条件の同意などが求められますので OK して先に進みましょう。また、VIRL サーバへの接続設定のウィンドウが出るかもしれませんが一旦キャンセルしておきます

VM Maestro の画面は以下のようになっています

<img width="600" alt="Screenshot 2017-12-09 12.33.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/5a1985de-af48-0863-b014-f7333b2060f5.png">

## VIRL サーバへの接続
まずクライアントを VIRL サーバに接続します。画面右下に鍵ボタンが見つかると思うのでクリックします。

<img width="120" alt="Screenshot 2017-12-09 12.37.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/4b98260d-bfbc-0faa-d678-6b683f06b29a.png">

Active Profile の右の + 印をクリックします. 適当な Profile Name を付けたあと、Base URL の中の IP アドレスを、VIRL サーバの IP アドレスに変更してください

<img width="360" alt="Screenshot 2017-12-09 12.38.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/fdaece29-f443-c247-1752-dbdb7ce0d306.png">
<img width="360" alt="Screenshot 2017-12-09 12.39.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/28a49b6d-fbfb-d76a-578c-a66d50ed1bdd.png">

その後 Master Credentials の右の Change をクリックし、クレデンシャルとして guest/guest を入力します

<img width="360" alt="Screenshot 2017-12-09 12.40.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/fdfbacfe-e196-23ca-2386-18acb3cbca8b.png">

Web Services の表示がすべて Compatible と表示されれば OK です

## VIRL サーバから仮想ノードリストを同期
VM Maestro からシミュレーションを開始するには、VIRL サーバ上にある、起動可能な仮想ノード (VM) のリストをローカルに取ってきておく必要があります。

VM Maestro の設定画面を開き、Node Subtypes の画面に移ります. 画面下のほうにスクロールして、Fetch From Server ボタンを押します。クライアントの仮想ノードリストが更新されます。

<img width="180" alt="Screenshot 2017-12-09 12.44.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/69744e30-ec13-9ef2-978f-b23654a6f921.png">
<img width="480" alt="Screenshot 2017-12-09 12.45.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/5ccf66cf-b42f-cbd4-a68d-e9eb19e6b8e9.png">

これでシミュレーションを開始する準備ができました！

# VIRL シミュレーションの開始
## ネットワークトポロジーのデザイン
まずは簡単なトポロジを作って試してみましょう。画面左のパレットから CSR1000v を選択し、そのまま中央のキャンバスでマウスクリックすることでノードを配置できます。この例では3つのノードを追加してみました。

<img width="480" alt="Screenshot 2017-12-09 12.54.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/cb3b79d2-dff3-7393-8707-b3c2225d1eba.png">

次にこのノード同士をリンクで接続します。

パレットの Tools から Connect を選びます。そのまま、リンクをつなぎたいノードを順番にクリックします（ドラッグはしなくて大丈夫です）。これで2つのノードが接続できました

<img width="480" alt="Screenshot 2017-12-09 12.56.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/a8bfaa1e-9591-eb23-03ca-148b21d9435c.png">

これを繰り返して三角形のトポロジを作ります

<img width="480" alt="Screenshot 2017-12-09 23.07.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/33f14454-916a-d24e-0732-bcb770cae9c0.png">

これでいったん完成として、このトポロジを「プロジェクト」として保存しましょう。

左上の Save アイコンを押すと、保存場所を選択する画面が出てきます。今回は Sample Topology フォルダを選んで、デフォルトの topology.virl という名前で保存します。ちなみにファイル名は必ず .virl で終わる必要があります

<img width="480" alt="Screenshot 2017-12-09 13.01.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/1b94dbc1-b05f-5311-941d-554a555e4894.png">


## 仮想ノードのプロパティの設定
キャンバス上のノードをクリックすると、画面下部に Properties が登場し、シミュレーション時のいろんな設定をすることができるようになっています

VIRL にはルータコンフィグを自動生成する機能である "AutoNetKit" という機能が備わっています。これを使うと、自分であとからコンフィグを投入しなくても IGP や BGP のピアリングまで完了した状態でシミュレーションを開始する、といったことが実現できる優れものです。

<img width="600" alt="Screenshot 2017-12-09 13.08.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/b1eea396-f934-2c72-a555-ae7c5b1a7a84.png">
図: Properties の領域を見やすく広げました

ただ、この AutoNetKit の活用については別の機会に紹介することにします。今回はこれをオフにしましょう。オフにすると、各ノードは初期コンフィグ無しの状態で起動します。

ノードをクリックし、下の Properties の中の、AutoNetKit タブを選択します。

デフォルトでは一番上部のチェックボックスが ON になっているので、このチェックを外してオフにします
<img width="480" alt="Screenshot 2017-12-09 13.08.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/5dd53609-7488-72d2-f0ab-479325520623.png">

これをすべてのノードで繰り返して、最後に Save アイコンを押してプロジェクトを保存しておきます

## シミュレーションの開始
いよいよシミュレーションを開始します

画面上部のメニューから、シミュレーション開始のアイコンをクリックします
<img width="120" alt="Screenshot 2017-12-09 13.12.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/6b37bbbf-b34c-57f9-8b9f-70cb48c759da.png">

いくつか質問画面がポップアップしますが、すべてキャンセルして問題ありません。

その後、画面全体のモードを Simulation に切り替えます。画面の右上から、Simulation タブを押します
<img width="240" alt="Screenshot 2017-12-09 13.13.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/f1a8859d-5852-393e-7283-31b9ade39a64.png">

すると、画面がシミュレーションモードに切り替わります。先ほどの Design モードと違い、この画面では起動したシミュレーションのノードやリンク、トポロジーに対する操作を行うことになります

<img width="480" alt="Screenshot 2017-12-09 13.15.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/5b3aa63c-0706-20a5-1316-7a7a80482379.png">

画面を観察していると、右側のペインにノードのリストが表示され、起動状況が色付きのアイコンで表示されることがわかります。これが緑色になると VM の電源ON が完了し、OS のブートプロセスに入ったことを示します

<img width="480" alt="Screenshot 2017-12-09 13.17.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/51fafba6-1b6c-98f3-de92-1804664a884d.png">

この例では3台の VM が起動し (ACTIVE), 管理アドレスにアクセスできる状態 (REACHABLE) であることがわかります。その下の ~lxc-flat や ~mgmt-lxc の表示は管理アクセス用のものですが、今回は説明を省略します

# VM へのアクセス
物理ルータを起動したときと同じように、VM ノードのコンソールポートにアクセスしてみましょう。

中央キャンバスのノードを右クリックし、Telnet > Console を選択します
<img width="480" alt="Screenshot 2017-12-09 13.18.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/2b257ac4-f85d-de4b-e53f-40ff9164e7c6.png">

画面下部にコンソール画面のタブが開き、キーストロークするとルータのプロンプトが表示されました！
<img width="480" alt="Screenshot 2017-12-09 13.21.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/c8f2a084-8a91-9f98-6493-cc9f1bfa4e16.png">

これでこのノードのコンフィグを自由に操作できるようになりました。

適当にコマンドを試しておきましょう。Cisco IOS-XE のコマンドが実行できることがわかります。

<img width="480" alt="Screenshot 2017-12-09 13.22.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/45e723ce-2d10-3b39-22fe-3304e2ed83f6.png">

もちろんルーティングプロトコルや ACL など各種設定をすることもできます。今回は VIRL のシミュレーションの開始までが目標なので、ルータのコンフィグはここまでにしておきます

# コンフィグの保存とシミュレーションの停止
シミュレーションを停止すると、VM 上の NVRAM も含めて削除されてしまいます。このため、CLI で copy run start をしただけではコンフィグは保存されません

コンフィグを次回以降のシミュレーションでも維持しておくには、シミュレーションの名前を右クリックして Extract Configurations を実行する必要があります

<img width="480" alt="Screenshot 2017-12-09 22.18.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/08d7b419-795e-491b-c309-df153dbee2ab.png">

このあと、シミュレーションを停止します。同じようにシミュレーションの名前を右クリックし、Stop Simulation を選びましょう。

<img width="480" alt="Screenshot 2017-12-09 22.20.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/175796/c8228145-9792-c988-f58c-4969cde6fda2.png">

VM を停止する処理のあと、シミュレーションのリストが画面右側のペインから消えたら停止完了です
お疲れ様でした！

# 今回のまとめ
今回の記事では、VIRL を使って自由にネットワークトポロジーを作成し、VM（仮想ルータ）のコンフィグを変更できるようになるところまでを解説しました。

これだけでもネットワークエンジニアとしては楽しい環境ができましたが、まだ自動化開発実践の準備段階です。次回以降の記事では、こうして作ったネットワークトポロジーを使って、自動化をどう実装していくかを解説したいと思っています

- 前回: [目次](https://qiita.com/radiantmarch/items/9df086002ee3f4f334d2)
- 次回: 第2回: ネットワーク自動化開発実践 - Python でルータを操作

# 免責事項
> 本サイトおよび対応するコメントにおいて表明される意見は、投稿者本人の個人的意見であり、シスコの意見ではありません。本サイトの内容は、情報の提供のみを目的として掲載されており、シスコや他の関係者による推奨や表明を目的としたものではありません。各利用者は、本Webサイトへの掲載により、投稿、リンクその他の方法でアップロードした全ての情報の内容に対して全責任を負い、本Web サイトの利用に関するあらゆる責任からシスコを免責することに同意したものとします。