NETCONF NED Builder で NETCONF デバイスを手軽に設定しよう！


この記事はシスコの有志による Cisco Systems Japan Advent Calendar 2020 (2枚目) の 7 日目として投稿しています。
2017年版: https://qiita.com/advent-calendar/2017/cisco
2018年版: https://qiita.com/advent-calendar/2018/cisco
2019年版: https://qiita.com/advent-calendar/2019/cisco
2020年版: https://qiita.com/advent-calendar/2020/cisco
2020年版(2枚目): https://qiita.com/advent-calendar/2020/cisco2 (これ)

## はじめに
近年、注目度が高くなっている NETCONF ですが、手軽に使うにはまだまだ難しい点があります。Cisco NSO (Network Services Orchestrator) では NETCONF NED Builder という機能が NSO 5.2 から実装されており、NSO の NETCONF NED （Network Element Drvier; NSO のドライバ）を自動で生成できるようになったため、NETCONF デバイスをより簡単に使えるようになりました。

この記事では、無償の NSO を使って（無償は非商用利用に限ります）、NETCONF デバイスを GUI で操作する方法を紹介します。

![Screen Shot 2020-12-04 at 13.26.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156216/9363d7aa-ed35-641b-0e45-9e0747d2d731.png)


## 環境準備
はじめに、無償版の NSO を入手する必要があります。入手方法ならびにインストールについては、下記をご参照ください。

https://gblogs.cisco.com/jp/2020/02/lets-evaluate-cisco-nso-2020/

NSO の CLI にログインできたら、NED をコンパイルできるだけの最低限の環境を整える必要があります。環境が整っているかは、下記のようにして確認できます（ここでは nso-5.3.linux.x86_64.signed.bin を前提に記述します）。

```shell
$cd $NCS_DIR/packages/neds/cisco-ios-cli-3.8/src
$ make
（略）
BUILD SUCCESSFUL
```

BUILD SUCCESSFUL と表示されれば大丈夫です。こうならない場合、前述の Blog を参考に、make、ant、JDK などをインストールし、開発環境を事前に整えてください。

## デバイスの準備
NETCONF で操作するデバイスを、NSO にあらかじめ登録しておきます。ここでは XRv を使います。
IOS-XR で NETCONF を使うには、最低限以下の設定をしておく必要があります。

```
RP/0/0/CPU0:NR-XRv-4#
RP/0/0/CPU0:NR-XRv-4#configure terminal 
RP/0/0/CPU0:NR-XRv-4(config)#ssh server v2
RP/0/0/CPU0:NR-XRv-4(config)#ssh server netconf 
RP/0/0/CPU0:NR-XRv-4(config)#netconf agent tty 
RP/0/0/CPU0:NR-XRv-4(config-netconf-tty)#exit
RP/0/0/CPU0:NR-XRv-4(config)#netconf-yang agent ssh
RP/0/0/CPU0:NR-XRv-4(config)#commit
RP/0/0/CPU0:NR-XRv-4(config)#end
RP/0/0/CPU0:NR-XRv-4#
```

上記設定後、通常モードで下記を実行し、RSA key を生成しておきます。

```
RP/0/0/CPU0:NR-XRv-4#crypto key generate rsa
```

NETCONF で接続ができるか、あらかじめ確認しておきます。このためには Linux ターミナルから、下記のように実行します。NETCONF Capability のやりとりが行われれば、デバイス側で NETCONF が使える準備ができています。


```
cisco@ubuntuserver1910:~$ ssh -s admin@10.171.1.105 -p 830 netconf
Password:
<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">                                                                                                   
 <capabilities>                                                                                                                                           
  <capability>urn:ietf:params:netconf:base:1.1</capability>                                                                                               
  <capability>urn:ietf:params:netconf:capability:candidate:1.0</capability>                                                                               
  <capability>urn:ietf:params:netconf:capability:rollback-on-error:1.0</capability>                                                                       
  <capability>urn:ietf:params:netconf:capability:validate:1.1</capability>                                                                                
  <capability>urn:ietf:params:netconf:capability:confirmed-commit:1.1</capability>         
  （略）
```



次は NSO にこのデバイスを登録します。この時 NED はまだないので、 NED の種類は "netconf" にしておきます。

```
admin@ncs# 
admin@ncs# config terminal
admin@ncs(config)# devices device xrv4 address 10.171.1.105 device-type netconf ned-id netconf 
admin@ncs(config-device-xrv4)# top
admin@ncs(config)# devices authgroups group admin umap admin remote-name admin remote-password admin remote-secondary-password admin
admin@ncs(config-umap-admin)# top
admin@ncs(config)# devices device xrv4 authgroup admin 
admin@ncs(config-device-xrv4)# top
admin@ncs(config)# devices device xrv4 state admin-state unlocked 
admin@ncs(config-device-xrv4)# top
admin@ncs(config)# commit
Commit complete.
admin@ncs(config)# end
admin@ncs# 
```

NETCONF で接続できるか、動作確認をします。

```
admin@ncs# devices fetch-ssh-host-keys 
fetch-result {
    device xrv4
    result updated
    fingerprint {
        algorithm ssh-rsa
        value ff:54:14:40:15:22:73:4c:a8:4e:bb:13:f2:36:0e:af
    }
}
admin@ncs# show devices list 
NAME  ADDRESS        DESCRIPTION  NED ID   ADMIN STATE  
------------------------------------------------------
xrv4  10.171.1.105  -            netconf  unlocked     
admin@ncs# devices sync-from 
sync-result {
    device xrv4
    result true
}
admin@ncs# 
```

この時点で、NSO の GUI からデバイスを確認してみます。NSO の GUI にログイン後、右下にある "Device manager" をクリックします。

![Screen Shot 2020-12-03 at 18.59.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156216/b2f84789-146e-c5e1-d60a-e09a3851a68d.png)

するとデバイス一覧が現れますので、デバイス名（ここでは xrv4）をクリックします。

![Screen Shot 2020-12-03 at 18.59.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156216/c978943d-20fd-2899-1707-545618e2cc15.png)

デバイスは登録されていますが、NED がないので一切コンフィグなどは見えません。

![qiita2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156216/84a551a2-7e48-3800-0ed2-2e34fe6c53f5.png)


## NETCONF NED の作成
ここからが本記事のメインです。NSO にはすでに NETCONF デバイスが登録されているので、このデバイス用の NETCONF NED を生成します。まず、下記のようにして開発ツールを有効にします。

``` NSO
admin@ncs# devtools true
```

その後、下記の手順で NETCONF NED を作って行きます。
まず NETCONF NED を作るためのプロジェクトを定義します。ここでは下記のように定義しています。
- プロジェクト名: ios-xr
- バージョン: 7.1.1
- ベンダ： cisco
- デバイス: xrv4 （すでに登録してあるデバイス名）
- local-user: admin （xrv4 へのログインユーザ名）
プロジェクト名とバージョン名が、NED の名前になります。

```
admin@ncs# 
admin@ncs# config terminal
admin@ncs(config)# netconf-ned-builder project ios-xr 7.1.1 vendor cisco device xrv4 local-user admin
admin@ncs(config-project-ios-xr/7.1.1)# commit
Commit complete.
admin@ncs(config-project-ios-xr/7.1.1)# end
admin@ncs# 
```

次に下記 fetch コマンドで NETCONF モジュールを取得します。

```
admin@ncs# netconf-ned-builder project ios-xr 7.1.1 fetch-module-list 
```

次にどの NETCONF モジュールを使うか指定し、モジュールをデバイスから取得します。

```
admin@ncs# netconf-ned-builder project ios-xr 7.1.1 module Cisco-IOS-XR-aaa-aaacore-cfg 2018-09-04 select 
```

ここでは aaa モジュールを選択していますが、複数指定することもできます。すべてのモジュールを選択する場合は次のようにします。この場合、全てのモジュールをデバイスからダウンロードしてきますので、実行完了まで非常に時間がかかる場合があるのでご注意ください。

```
admin@ncs# netconf-ned-builder project ios-xr 7.1.1 module * * select 
```

モジュールを選んだら、Build します。その後 export コマンドで NETCONF NED を packages に export します。
export で　permission エラーになる場合は、Linux 上で packages フォルダに permission を設定してください。また Build でエラーになる場合は、個別にモジュールを指定し、動くモジュールから進めて行くと良いと思います。


```
admin@ncs# netconf-ned-builder project ios-xr 7.1.1 build-ned                                            
admin@ncs# show netconf-ned-builder project ios-xr 7.1.1 build-status 
build-status success
admin@ncs# 
admin@ncs# netconf-ned-builder project ios-xr 7.1.1 export-ned to-directory packages             
tar-file /home/cisco/ncsrc/packages/ncs-5.3-ios-xr-nc-7.1.1.tar.gz
admin@ncs# 
```

これで、NED が　packages に入りました。

## NED の読み込みと付け替え
登録された XRv デバイスは、仮の "netconf" にしていたため、上記で作成した NED に付け替えます。
packages reload で、生成した NETCONF NED を読み込んだ後、登録デバイスの設定をアップデートします。

```
admin@ncs# packages reload 

>>> System upgrade is starting.
>>> Sessions in configure mode must exit to operational mode.
>>> No configuration changes can be performed until upgrade has completed.
>>> System upgrade has completed successfully.
reload-result {
    package ios-xr-nc-7.1.1
    result true
}
admin@ncs# 
admin@ncs# show devices list                                                                                                                              
NAME  ADDRESS        DESCRIPTION  NED ID   ADMIN STATE                                                                                                    
------------------------------------------------------                                                                                                    
xrv4  10.171.1.105  -            netconf  unlocked                                                                                                       
admin@ncs#
admin@ncs# config t
admin@ncs(config)# devices device xrv4 device-type netconf ned-id ios-xr-nc-7.1.1 
admin@ncs(config-device-xrv4)# commit
Commit complete.
admin@ncs(config-device-xrv4)# end
admin@ncs# 

admin@ncs# show devices list
NAME  ADDRESS        DESCRIPTION  NED ID              ADMIN STATE  
-----------------------------------------------------------------
xrv4  10.171.1.105  -            ios-xr-nc-7.1.1  unlocked     
admin@ncs# 
```

## 動作確認
NSO の GUI にアクセスし、デバイスを sync します。下記 GUI 上で sync-from ボタンを押します。成功すると緑色になります。

![Screen Shot 2020-12-04 at 13.19.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156216/aa804a0b-2c35-d33c-5418-41ab151be619.png)

その後デバイス名をクリックすると、先ほどなかった設定が見えるようになっています！

![qiita1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156216/a85172cf-8354-e576-a284-4332832bd304.png)

これで NETCONF 対応のデバイスを、GUI で操作できるようになりました。次に、実際に設定をしてみます。下の方にある "config" を探してクリックします。


![Screen Shot 2020-12-03 at 19.01.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156216/710de000-745d-7991-0d0d-dcecfce6d048.png)

するといくつか設定できる項目が現れます。aaa モジュールを選択したので aaa 関連のコンフィグが見えます。これをクリックします。

![Screen Shot 2020-12-03 at 19.01.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156216/87d0c992-2e85-5c0c-5cd3-69a13c8f2633.png)

試しに banner を設定してみます。

![Screen Shot 2020-12-03 at 19.02.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156216/430999d5-f5c7-571b-2173-8b3caa46a465.png)

バナーの設定画面になりますので "Hello NSO!" と入力し、下部にある "Commit manager" をクリックします。

![Screen Shot 2020-12-03 at 19.03.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156216/9aa510a4-6a7b-e41d-9a18-9319ba5b3304.png)

右上の "Commit" ボタンを押すと、設定が NETCONF で反映されます。

![Screen Shot 2020-12-03 at 19.04.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156216/c09eedb4-307c-1571-c864-cb6b86ae2e99.png)

試しに XRv にログインしてみると、無事にバナーが設定されていました！

![Screen Shot 2020-12-03 at 19.06.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156216/a2bc4949-ef58-83d7-627e-78ae6e3f0d1e.png)

これで NETCONF デバイスを NSO の GUI で操作できるようになりました。

# まとめ
NETCONF は非常に注目されているプロトコルである一方、それを利用するにはまだ課題があります。Cisco NSO でも、これまでは Linux 上でドライバを作る必要があり、決して容易ではなかったと言えます。

この NETCONF NED Builder の実装により、手軽に NED を作成し、NSO から GUI で NETCONF 対応デバイスが操作できるようになりました。

また NSO は、Model-driven アーキテクチャにより、管理デバイスに対して複数の API を上位に提供できます。上記のようにデバイスを登録するだけで、NSO に対して RESTCONF、JSON-RPC などを使い、NETCONF デバイスを操作することもできます。

皆様、楽しいクリスマスシーズンをお過ごしください！