MAC に Free NSO を入れて Network 自動化の心の準備をしてみる

##はじめに
最近ではネットワーク業界でも通信機器をソフトウェアから制御する流れがあります。

一方で、個人的にはあまりこの辺の技術を実際に触る機会を持てずにおりました。(言い訳)

そんな折、Cisco NSO (Network Services Orchestrator) という製品の無料評価版がリリースされました。

Cisco NSO って何ができるの？というお話はこちらに[素晴らしい記事](https://qiita.com/akiraiwamoto/items/0816f523d24a21917d51)がありますので説明はお任せ致しまするとして、本稿では Free download 可能な Cisco NSO を MacOS 上にインストールしみることで、どこまでの Network 自動化の検証をすることができるかを実際に動かしてみた記録を書きたいと思います。

## NSO Download
Downloadは[こちら](https://developer.cisco.com/docs/nso/#!getting-nso/getting-nso)から。


なお、このCisco NSO評価版について[日本語で丁寧な説明](https://gblogs.cisco.com/jp/2018/11/getting-nso/)がでなされております。こちらも参考にして下さい。


ということで、Get NSO for evaluation (Mac) から MacOS版をダウンロードします。

## インストールを始める前に
以下、[Getting NSO](https://gblogs.cisco.com/jp/2018/11/getting-nso/) に説明のある環境要件です。

<img width="1055" alt="Pre-Requirement.png" src="https://qiita-image-store.s3.amazonaws.com/0/316032/502cb975-9070-5a40-21f7-81f1ca74b28b.png">

私の場合、勇み足で進みすぎてちゃんとドキュメント読まず、ここの要件を満たさずに進んでしまいました。案の定、インストール後色々と正しく動きません。

NSO を正しく動作させるために、`JDK` と `Ant` のインストールも必要です。

インストール方法はインターネット上のエキスパートの方々の記事におまかせしますが、ご注意下さい。

## いざ、インストール
まずはUnpack。

	MyMAC:nso-4.7.darwin.x86_64 tkasakak$ sh nso-4.7.darwin.x86_64.signed.bin
	Unpacking...
	Verifying signature...
	Downloading CA certificate from http://www.cisco.com/security/pki/certs/crcam2.cer ...
	Successfully downloaded and verified crcam2.cer.
	Downloading SubCA certificate from http://www.cisco.com/security/pki/certs/innerspace.cer ...
	Successfully downloaded and verified innerspace.cer.
	Successfully verified root, subca and end-entity certificate chain.
	Successfully fetched a public key from tailf.cer.
	Successfully verified the signature of nso-4.7.darwin.x86_64.installer.bin using tailf.cer

続いてInstall。

	MyMAC:nso-4.7.darwin.x86_64 tkasakak$ sh nso-4.7.darwin.x86_64.installer.bin $HOME/ncs-4.7
	INFO  Using temporary directory /var/folders/lp/w1lg3d217mqgwzkn_l_9lz700000gn/T//ncs_installer.5336 to stage NCS installation bundle
	INFO  Unpacked ncs-4.7 in /Users/tkasakak/ncs-4.7
	INFO  Found and unpacked corresponding DOCUMENTATION_PACKAGE
	INFO  Found and unpacked corresponding EXAMPLE_PACKAGE
	INFO  Generating default SSH hostkey (this may take some time)
	INFO  SSH hostkey generated
	INFO  Environment set-up generated in /Users/tkasakak/ncs-4.7/ncsrc
	INFO  NCS installation script finished
	INFO  Found and unpacked corresponding NETSIM_PACKAGE
	INFO  NCS installation complete

ここまでくると NSO home directory 配下に(上記の場合 ncs-4.7 配下に)、NSOのファイルが展開されます。

	MyMAC:ncs-4.7 tkasakak$ ls
	CHANGES		bin		examples.ncs	man		packages	var
	LICENSE		doc		include		ncsrc		scripts
	README		erlang		java		ncsrc.tcsh	src
	VERSION		etc		lib		netsim		support


初めて NSO をいじるにあたり、以下が参考になりました。 

- `doc` : 配下にGetting Started Guide や User Guide 等の情報があります。
- `examples.ncs` : 配下に初学者向けのテストシナリオ等があります。

以下では、`examples.ncs/getting-started/using-ncs` にあるシナリオに従ってNSOに実際のルーターを登録してみたいと思います。

	MyMAC:using-ncs tkasakak$ pwd
	/Users/tkasakak/ncs-4.7/examples.ncs/getting-started/using-ncs
	TKASAKAK-M-31YZ:using-ncs tkasakak$ ls -l
	total 8
	drwxr-xr-x   3 tkasakak  staff   96  6 21 16:15 0-hello-world
	drwxr-xr-x  19 tkasakak  staff  608 12  1 18:11 1-simulated-cisco-ios
	drwxr-xr-x  16 tkasakak  staff  512 12  1 21:54 2-real-device-cisco-ios
	drwxr-xr-x   4 tkasakak  staff  128  6 21 16:15 3-real-device-juniper
	drwxr-xr-x   4 tkasakak  staff  128  6 21 16:15 4-netconf-device
	drwxr-xr-x   3 tkasakak  staff   96  6 21 16:15 5-snmp-alarm-northbound
	drwxr-xr-x  13 tkasakak  staff  416  6 21 16:15 6-access-lists
	drwxr-xr-x   9 tkasakak  staff  288  6 21 16:15 7-scripting
	drwxr-xr-x   6 tkasakak  staff  192  6 21 16:15 8-ssh-keys
	-rw-r--r--   1 tkasakak  staff  692  6 21 16:15 README

`1-simulated-cisco-ios`は同梱される仮想IOSルーター３台を起動させるシミュレーターを用いたシナリオとなりますが、以下では`2-real-device-cisco-ios`のREADMEにある手順に従って、実際のIOS XEルーターをNSOから管理できるようにするまでを試してみます。(2から始める場合も、`0-hello-world`, `1-simulated-cisco-ios`にあるREADMEから読み進めるとよりわかりやすいです。)

NSO では NED (Network Element Driver) と呼ばれるドライバーによりシスコ以外の様々な機器も扱うことが可能です。

以下では評価版に同梱される CLI NED により Cisco IOS XE device の連携を目指しました。

>補足：
実際のネットワーク機器でサポートされる様々な機能をNSOから扱うことができるかどうかはこのNEDで対応されているかどうかに依存します。このため、新しい機能についてはこのNEDでも対応が必要になる、ということです。

>一方で、NSO では Netconf/Yang により Device 制御を行うことも可能です。この Yang model ベースの制御ではネットワーク機器側が新しい機能についても Yang model でサポートしていれば、そのモデルに基づいて機器制御が(理論上は)可能となります。

>[こちらの記事](https://community.cisco.com/t5/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%83%81%E3%83%A3-%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88/nso-%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E6%A9%9F%E5%99%A8%E3%83%99%E3%83%B3%E3%83%80%E3%83%BC%E3%81%8C%E6%8F%90%E4%BE%9B%E3%81%99%E3%82%8Byang%E3%82%92%E5%85%83%E3%81%ABnetconf-ned-%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/ta-p/3320121)ではネットワークベンダーが提供する Yang model から Netconf NED を作成する手順を説明してくれております。シスコのオフィシャルサポートには制限がありますが、評価版として試して頂くには良いかと思います。ぜひ試してみて下さい。(個人的には次回への宿題とさせて下さい。)

ここまでで、その他 Getting NSO 等に説明のある PATH設定やsourceコマンド等は実施を済ませておきましょう。

## NSO の起動
それでは`2-real-device-cisco-ios`のREADMEに従い、NSOを起動していきます。

設定ファイルを作成。NEDも指定します。

	MyMAC:2-real-device-cisco-ios tkasakak$ ncs-setup --dest . --ned-package cisco-ios

NSOの起動。

	MyMAC:2-real-device-cisco-ios tkasakak$ ncs

NSOが起動すると、NSOのコマンドラインに入ることができるようになります。

	MyMAC:2-real-device-cisco-ios tkasakak$ ncs_cli -u admin

	admin connected from 127.0.0.1 using console on MyMAC

NSOのコマンドラインは Cisco like (option: -C) と Juniper like (option: -J (*Default))がありますが、Getting Started 系の資料は Juniper like での説明になっているので、以下でも Default の設定で試してみました。

まずはNEDが正しく認識されているか確認します。

	admin@ncs> show packages package package-version
	           PACKAGE
	NAME       VERSION
	--------------------
	cisco-ios  3.0.0.3
	
	[ok][2018-12-02 00:38:03]
	admin@ncs>

続いて、Configuration モードへ移行。Deviceの登録を進めます。

	admin@ncs> configure
	Entering configuration mode private

認証の設定。

	admin@ncs% edit devices authgroups group mygroup
	admin@ncs% set default-map remote-name cisco
	admin@ncs% set default-map remote-password cisco
	admin@ncs% top

デバイスの設定。

	admin@ncs% edit devices device csr1kv
	admin@ncs% set address 10.71.158.3
	admin@ncs% set port 22
	admin@ncs% set authgroup mygroup
	admin@ncs% set device-type cli ned-id cisco-ios
	admin@ncs% set state admin-state unlocked (*このコマンドで device を有効化するようですが、Guideに記載が無いので注意!!)
	
以下のコマンドでssh host key を対象デバイスからとってこられれば接続の基本設定は完了です。

	admin@ncs% request ssh fetch-host-keys
	result updated
	fingerprint {
	    algorithm ssh-rsa
	    value e1:b8:93:b6:3a:3c:e4:31:9a:00:04:1f:ca:d7:e4:86
	}
	[ok][2018-12-01 20:43:45]

	[edit devices device csr1kv]

変更した設定を反映させるため、commit コマンドを忘れずに。

	admin@ncs% commit
	Commit complete.
	[ok][2018-12-01 20:39:17]
	
	[edit devices authgroups group mygroup]
	admin@ncs% top

以下のコマンドで再度接続を確認。

	admin@ncs> request devices connect
	connect-result {
	    device csr1kv
	    result true
	    info (admin) Connected to csr1kv - 10.71.158.3:22
	}
	[ok][2018-12-02 00:45:42]
	admin@ncs>

以下では機器設定をNSOへ同期します。

	admin@ncs> request devices sync-from
	sync-result {
	    device csr1kv
	    result true
	}
	[ok][2018-12-01 20:57:02]

以下で設定を表示できれば、NSO側への設定同期は完了です！

	admin@ncs> show configuration devices device csr1kv config
	ios:version 15.5;
	ios:service {
	(省略,設定が表示されます)

まだまだ色々といじりがいがありますが、今回はこれにて。

以下参考までに NSO からの制御を受け入れる為に入れた IOS-XE device 側の最小設定です。

	csr1kv#show run
	Building configuration...
	
	Current configuration : 1297 bytes
	!
	! Last configuration change at 10:31:35 UTC Sat Dec 1 2018 by cisco
	!
	version 15.5
	!
	hostname csr1kv
	!
	enable password cisco
	!
	ip domain name cisco.com
	!
	username cisco privilege 15 password 0 cisco
	!
	interface GigabitEthernet1
	 ip address dhcp
	 negotiation auto
	!
	ip ssh version 2
	!
	line vty 0 4
	 login local
	!
	end
	
*(config)# crypto key generate rsa exportable により鍵生成をしてますが、running-configには反映されないため念の為。

##参考
今回のようなことを試すにあたって、制御する対象のルーターが無いよ、という人向け。
(商用ではなく)個人使用していただけるフリーの素材としては、Cisco が提供する VIRL と呼ばれるエミュレータがあります。VIRLでは仮想ルーターを立ち上げて、VIRL 上でそれらルーター間のプロトコルの学習や簡単なテストなどに使用いただけるものとなっています。ぜひチャレンジしてみて下さい。
[参考記事1](https://www.itbook.info/network/virl.html)
[参考記事2](https://qiita.com/radiantmarch/items/a3c0685d8a4c7468e878)

tkasakak@2018/12/04