はじめに
NSO では Plug-and-play scripting という機能でスクリプトをサポートしております。Plug-and-play scripting には 3 つの種類があり、今回は 2 つめのポリシースクリプトについて説明します。
- Command scripts
- Policy scripts(今回の内容)
- Post-commit scripts
詳細は下記のサイトで説明されていますが、ここでは examples を用いて簡単に試す方法を紹介します。
https://developer.cisco.com/docs/nso/guides/#!plug-and-play-scripting/plug-and-play-scripting
ポリシースクリプトとは
ポリシースクリプトとは、NSO でコミット時に、ポリシーに沿っているかを確認するスクリプトです。その結果によってトランザクションを中止するか、実行するか、または warning にしてユーザに判断を促すといった制御をすることができます。 この機能により、NSO でコミットする設定がポリシーに沿っているかを判断し、ポリシーに沿っていない設定がコミットされることを防ぎます。
Examples とコマンドスクリプトの設置
$NCS_DIR の中には examples.ncs というフォルダがあり、自己学習のためのサンプルがあらかじめ用意されています。そのうち 11 番が Scripting のサンプルになります(NSO 5.7 の場合)。
NSO のローカルインストールの場合、ncs-setup コマンドを使って NSO の実行ディレクトリを作成すると、 scripts というフォルダが自動で生成されます。しかし、policy フォルダは作成されませんので、policy フォルダを作成し、その中にサンプルのファイル check_dir.sh をコピーして設置します。
$ pwd
/home/cisco/ncs-run/scripts
$ mkdir policy
$ cd policy
$ cp $NCS_DIR/examples.ncs/getting-started/developing-with-ncs/11-scripting/packages/scripting/scripts/policy/check_dir.sh .
$ ls
check_dir.sh
ポリシースクリプトの読み込み
ポリシースクリプトを設置したら、NSO に読み込ませます。読み込む際は script reload all コマンドを使います。
admin@ncs# script reload all
/home/cisco/NSO-5.7/scripts: ok
command:
device_save.sh: unchanged
/home/cisco/ncsrun/scripts: ok
policy:
check_dir.sh: new
admin@ncs#
無事に check_dir.sh が読み込まれました。
ポリシースクリプトの実行
NSO のコミット時にポリシーに沿っているかチェックする対象のパスを、コマンドスクリプト内に記載されている policy の部分に指定します。
begin policy
keypath: /devices/global-settings/trace-dir
dependency: /devices/global-settings
priority: 2
call: each
end
check_dir.sh では /devices/globa-setting/trace-dir をチェックし、デフォルトの ./logs から変更される時には warning を表示するようにしています。実際に動かすと、次のようになります。
admin@ncs# config t
Entering configuration mode terminal
admin@ncs(config)# devices global-settings trace-dir ./newdir
admin@ncs(config)# commit
The following warnings were generated:
'devices global-settings trace-dir': /devices/global-settings/trace-dir: must retain it original value
(./logs)
Proceed? [yes,no] no
Aborted: by user
admin@ncs(config)#
無事に warning が表示されました。
動作説明
NSO 内部では、実際には check_dir.sh が以下のように実行されます。
$check_dir.sh --keypath /devices/global-settings/trace-dir --value ./newdir
スクリプト内を見ると、--value で指定された値を ${dir} に格納しており、下記の箇所でオリジナル値から変更されているかを評価しています。
orig="./logs"
dir=${value}
# dir=`ncs-maapi --get /devices/global-settings/trace-dir`
if [ "${dir}" != "${orig}" ] ; then
echo "/devices/global-settings/trace-dir: must retain it original value (${orig})"
exit 1
fi
ここでは、trace-dir が orig で定義された ./logs と異なる場合は、exit 1 を返します。この exit status の意味は、以下のようになります。
- 0: 問題なし、commit を実施
- 1: メッセージを表示し、ユーザに commit を実施するか確認
- 2: エラーのため commit を中断
よって、今回はユーザに確認メッセージを表示しています。試しに exit status を 2 に変えて実行してみます。
orig="./logs"
dir=${value}
# dir=`ncs-maapi --get /devices/global-settings/trace-dir`
if [ "${dir}" != "${orig}" ] ; then
echo "/devices/global-settings/trace-dir: must retain it original value (${orig})"
exit 2
fi
すると、下記のようにすぐに commit が中断されました。
admin@ncs# config t
Entering configuration mode terminal
admin@ncs(config)# devices global-settings trace-dir ./newdir
admin@ncs(config)# commit
Aborted: /devices/global-settings/trace-dir: must retain it original value (./logs)
admin@ncs(config)#
このように、ポリシースクリプトを利用することで、NSO にコミットされる設定が、ポリシーに沿っているかを、スクリプトベースで評価することができます。これにより、非常に柔軟なポリシーを NSO に適用することが可能になります。