2018-01-28 12:23 AM 2018-01-28 11:12 AM 更新
NETCONF対応ネットワーク機器では、使用するデバイスモデルをYang形式でダウンロード出来るように、get-schema オペレーションが実装されています。それを使用して、NSOで使用するために必要なYang ファイルを取得する方法について説明します。
NETCONF 対応機器へ接続する際、クライアント(NSO) はその機器がどのような機器かわかりません。サーバ側(ネットワーク機器側)も、クライアント側がどのような能力を持っているか不明です。そこで、プロトコルで規定されていますように、<hello>オペレーションをお互い実施し、capability 情報の交換を行います。
クライアント側では、相手が送信してくる<hello> に記述された capability より、必要なデータモデルのネットワークスペース(モジュール)名を認識します。また、それを元にクライアント側で必要なモジュールをロードします。
必要なモジュールは事前に用意しておく必要がありますので、<hello>で送られてくるモジュールリストについて、<get-schema> オペレーションを使用して yang をリクエストし、取得します。
ネットワーク機器から送られる<hello> を確認するため、NSO に同梱されているnetconf-console を使用します。
$ netconf-console --host=192.168.10.1 --port=830 --user=cisco --password=cisco --hello
<?xml version="1.0"?>
<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:xml:ns:yang:ietf-netconf-monitoring?deviation=cisco-xr-netconf-monitoring-deviations</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>
<capability>http://cisco.com/ns/yang/Cisco-IOS-XR-aaa-lib-cfg?module=Cisco-IOS-XR-aaa-lib-cfg&revision=2015-11-09</capability>
<capability>http://cisco.com/ns/yang/Cisco-IOS-XR-aaa-locald-admin-cfg?module=Cisco-IOS-XR-aaa-locald-admin-cfg&revision=2015-11-09</capability>
<capability>http://cisco.com/ns/yang/Cisco-IOS-XR-aaa-locald-cfg?module=Cisco-IOS-XR-aaa-locald-cfg&revision=2015-11-09</capability>
<capability>http://cisco.com/ns/yang/Cisco-IOS-XR-aaa-locald-oper?module=Cisco-IOS-XR-aaa-locald-oper&revision=2015-11-09</capability>
<capability>http://cisco.com/ns/yang/Cisco-IOS-XR-aaa-protocol-radius-cfg?module=Cisco-IOS-XR-aaa-protocol-radius-cfg&revision=2015-11-09</capability>
<capability>http://cisco.com/ns/yang/Cisco-IOS-XR-aaa-protocol-radius-oper?module=Cisco-IOS-XR-aaa-protocol-radius-oper&revision=2015-11-09</capability>
<capability>http://cisco.com/ns/yang/Cisco-IOS-XR-aaa-tacacs-cfg?module=Cisco-IOS-XR-aaa-tacacs-cfg&revision=2015-11-09</capability>
<capability>http://cisco.com/ns/yang/Cisco-IOS-XR-aaa-tacacs-oper?module=Cisco-IOS-XR-aaa-tacacs-oper&revision=2015-11-09</capability>
...
この例のネットワーク機器は、IOS-XR を使用する機器です。IOS-XR で使用するモデルのリストが取得出来ることがわかります。
capability 一つを例に見てみます。
<capability>http://cisco.com/ns/yang/Cisco-IOS-XR-aaa-lib-cfg?module=Cisco-IOS-XR-aaa-lib-cfg&revision=2015-11-09</capability>
こちらの出力からは、
namespace: http://cisco.com/ns/yang/Cisco-IOS-XR-aaa-lib-cfg
module: Cisco-IOS-XR-aaa-lib-cfg
revision: 2015-11-09
が使用されていることがわかりました。
では、Cisco-IOS-XR-aaa-lib-cfg モジュールを機器から取得してみましょう。
$ netconf-console --host=192.168.10.1 --port=830 --user=cisco --password=cisco --get-schema=Cisco-IOS-XR-aaa-lib-cfg
<?xml version="1.0"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1">
<data xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring">module Cisco-IOS-XR-aaa-lib-cfg {
/*** NAMESPACE / PREFIX DEFINITION ***/
namespace "http://cisco.com/ns/yang/Cisco-IOS-XR-aaa-lib-cfg";
prefix "aaa-lib-cfg";
/*** LINKAGE (IMPORTS / INCLUDES) ***/
import Cisco-IOS-XR-types { prefix "xr"; }
...
</data></rpc-reply>
NETCONF オペレーションに対する返答ですので、XML でエンコードされていて、/rpc-reply/data パスにYangが含まれていることがわかります。この Yang ファイルを Cisco-IOS-XR-aaa-lib-cfg.yang として保存すれば、このモジュールについて取得完了です。
これらを踏まえて、順に全てのモジュールをダウンロードするスクリプトを作成してみます。
hello から取得したモジュール一覧を配列とし、それぞれ取得し保存しています。
また、ファイル中にinclude文でsub-module が読み込まれていますので、それらも取得しています。
HOST=192.168.10.1
PORT=830
USER=cisco
PASS=cisco
modules=$(netconf-console --host=$HOST --port=$PORT --user=$USER --password=$PASS --hello | grep cisco.com | sed "s#.*http://cisco.com/ns/yang/.*?module=\(.*\)&.*#\1#")
for module in $modules
do
echo -n "$module ..."
netconf-console --host=$HOST --port=$PORT --user=$USER --password=$PASS --get-schema=$module | xmllint --xpath "/*[local-name()='rpc-reply']/*[local-name()='data']/text()" - > $module.yang;
echo "downloaded"
done
submodules=$(grep -h -e '^[ ]*include.*[ ]*{' *.yang | sed "s/.*include \(.*\) {/\1/")
for submodule in $submodules
do
if [ ! -e $submodule.yang ]; then
echo -n "$submodule ..."
netconf-console --host=$HOST --port=$PORT --user=$USER --password=$PASS --get-schema=$submodule | xmllint --xpath "/*[local-name()='rpc-reply']/*[local-name()='data']/text()" - > $submodule.yang;
echo "downloaded"
fi
done
NETCONF 機器から必要な yang ファイルを取得し、コンパイルを行うPioneer ツールがあります。
https://github.com/NSO-developer/pioneer
これを使用すると、デバイス登録後に簡単に取得出来ます。
NSO の通常のパッケージとなっていますので、clone、make したあと、packages ディレクトリに配置してください。packages reload によって有効化も必要です。
admin@ncs# show running-config devices device iosxr
devices device iosxr
address 10.70.74.233
port 830
authgroup cisco
device-type netconf
state admin-state unlocked
!
admin@ncs#
admin@ncs# devices device iosxr pioneer yang fetch-list
Retrieving module list from device
Device supports netconf-monitoring
Found out the names for a total of 348 modules
hello message: 212
netconf-monitoring subtree: 348
netconf-monitoring xpath: 0
Marked module Cisco-IOS-XR-ipv6-io-oper for download
Marked module Cisco-IOS-XR-es-acl-cfg for download
Marked module Cisco-IOS-XR-aaa-protocol-radius-oper-sub1 for download
Marked module Cisco-IOS-XR-lib-keychain-cfg for download
Marked module Cisco-IOS-XR-ip-rib-ipv4-oper for download
...
Marked module Cisco-IOS-XR-ipv4-ospf-oper-sub2 for download
message Marked 348 modules for download, skipped 0
yang-directory /tmp/download/iosxr
admin@ncs#
admin@ncs# devices device iosxr pioneer yang download
Downloading 348 modules to /tmp/download/iosxr
1/348 Downloading module bgp-multiprotocol -- succeeded
2/348 Downloading module bgp-operational -- succeeded
3/348 Downloading module bgp-policy -- succeeded
4/348 Downloading module bgp-types -- succeeded
5/348 Downloading module bgp -- succeeded
6/348 Downloading module Cisco-IOS-XR-aaa-lib-cf
...
345/348 Downloading module openconfig-mpls -- succeeded
346/348 Downloading module openconfig-types -- succeeded
347/348 Downloading module policy-types -- succeeded
348/348 Downloading module routing-policy -- succeeded
message Downloaded 346 modules, failed 2, skipped 0:
Downloaded bgp-multiprotocol
Downloaded bgp-operational
Downloaded bgp-policy
Downloaded bgp-types
Downloaded bgp
...
Downloaded openconfig-mpls-ldp
Downloaded openconfig-mpls-rsvp
Downloaded openconfig-mpls-sr
Downloaded openconfig-mpls-types
Downloaded openconfig-mpls
Downloaded openconfig-types
Downloaded policy-types
Downloaded routing-policy
yang-directory /tmp/download/iosxr
admin@ncs#
admin@ncs# devices device iosxr pioneer yang build-netconf-ned
Starting build of 346 YANG modules, this may take some time
...
Build complete. Run install-netconf-ned, then run 'packages reload' to use the package
ned-directory /tmp/packages/iosxr
ビルドが完了しましたら、NSO のランタイムディレクトリ中の packages ディレクトリに配置し、packareを読み込みし直す必要があります。
admin@ncs# devices device my-netconf-device pioneer yang install-netconf-ned
admin@ncs# packages reload
NED の作成は完了しました。Pioneer パッケージを使用して、上記まで実施した場合は、既にリモートデバイスを使用できる状態です。
Pioneer
検索バーにキーワード、フレーズ、または質問を入力し、お探しのものを見つけましょう
シスコ コミュニティをいち早く使いこなしていただけるよう役立つリンクをまとめました。みなさんのジャーニーがより良いものとなるようお手伝いします
下記より関連するコンテンツにアクセスできます