キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 
cancel
569
閲覧回数
0
いいね!
0
コメント
Asami Agarie
Cisco Employee
Cisco Employee

 

 

 

はじめに

NSO テンプレートには 条件文等、テンプレートを動的にする処理命令 ( Processing Instructions ) が用意されています。本記事は、NSO 4.6 以降、追加、拡張された構文 tag や、今後 deprecate される構文について一部ご紹介します。

 

 

 

when から if ..への移行

NSO 4.5 の ドキュメント NSO Development では、テンプレートの Conditional Statement として when を使用した条件文について説明しています。

Conditional Statements
Sometimes it is necessary to control which parts of a template that should be evaluated. The 'when' attribute makes it possible to set a conditional statement that controls if the sub-tree should be evaluated or not.
       <policy-map xmlns="urn:ios" tags="merge">
         <name>{$POLICY_NAME}</name>
         <class>
          <name>{$CLASS_NAME}</name>
          <priority when="{qos-class/priority}">
          <percent>{$CLASS_BW}</percent>
          </priority>
                  <bandwidth when="{not(qos-class/priority)}">
                   <percent>{$CLASS_BW}</percent>
                  </bandwidth>
                  <set>
                   <ip>
                    <dscp>{$CLASS_DSCP}</dscp>
                   </ip>
                  </set>
                 </class>
               </policy-map>

when を使用した条件文は最新バージョン 5.5 でも使用できますが、4.6 以降ドキュメントからは削除されました。代わりに、<?if?>..<?else?>..<?end?>を条件文として紹介しています。  

Conditional Statements
Sometimes it is necessary to control which parts of a template that should be evaluated. The if processing
instruction makes it possible to set a conditional statement that controls if the sub-tree should be evaluated
or not.
     <policy-map xmlns="urn:ios" tags="merge">
      <name>{$POLICY_NAME}</name>
      <class>
       <name>{$CLASS_NAME}</name>
       <?if {qos-class/priority}?>
        <priority>
         <percent>{$CLASS_BW}</percent>
        </priority>
       <?else?>
        <bandwidth>
         <percent>{$CLASS_BW}</percent>
        </bandwidth>
       <?end?>
       <set>
        <ip>
         <dscp>{$CLASS_DSCP}</dscp>
        </ip>
       </set>
      </class>
     </policy-map>

<?if?>..<?else?>..<?end?> は  条件文としての汎用性を高めたものです。when は今後 deprecate されることが決まっています。新規に NSO Template を作成する場合は、<?if?>..<?else?>..<?end?> をご使用ください。また、現在も when を使用している場合は、早めのご移行をお勧めします。なお、deprecate の時期については公開しておりません。バージョンアップの際は、CHANGES をご確認ください。

when と if, if-else の比較

<?else?> 節は必須ではありません。省略してもいいです

Before 

After

*************************************************************

<interface>
  <name>{/interface}</name>
  <shutdown when="{shutdown}"/>
  <address when="{not(shutdown)}">{address}</address>
  <mask when="{not(shutdown)}">{mask}</mask>
</interface>

*************************************************************

*************************************************************<interface>
  <name>{/interface}</name>
  <?if {shutdown}?>
    <shutdown/>
  <?else?>
    <address>{address}</address>
    <mask>{mask}</mask>
  <?end?>
</interface>

*************************************************************

 

 

 

その他、変更のあった構文 : Processing Instructions

 

if-else 同様に NSO 4.6 以降、追加または拡張された構文があります。以下、以前との対比をみてみます。

foreach の拡張

<?foreach?>..<?end?> で括ったブロック内に複数の属性タグを挿入できるようになりました。

Before 

After

*************************************************************

<vrf>
  <name>VPN{/vpn-number}</name>
  <ip-route-forwarding-list foreach=”{tunnel}">
    <prefix>{network}</prefix>
    <mask>{netmask}</mask>
    <forwarding-address>10.255.254.{(tunnel-number - 1)*4+2}  </forwarding-address>
  </ip-route-forwarding-list>
</vrf>

*************************************************************

*************************************************************

<vrf>
  <name>VPN{/vpn-number}</name>
  <?foreach {tunnel}?>
    <ip-route-forwarding-list>
      <prefix>{network}</prefix>
      <mask>{netmask}</mask>
      <forwarding-address>10.255.254.{(tunnel-number – 1)*4/2}      </forwarding-address>
    </ip-route-forwarding-list>
  <?end?>
</vrf>

*************************************************************

 

for 文 の対応

for 文では、変数を使用し繰り返し処理ができます。while-loop のように記述できます。

Before 

After

*************************************************************

    変数による反復処理はできない

*************************************************************

*************************************************************

<interface xmlns="urn:ios">
  <?for i=0; {$i < 4}; i={$i + 1}?>
    <FastEthernet tags="nocreate">
      <name>0/{$i}</name>
      <shutdown tags="merge"/>
   </FastEthernet>
  <?end?>
<!-- it doesn’t exist here anymore -->
</interface>

*************************************************************

  

set の対応

set を使用し変数に新しい値を設定したり、設定済みの変数を操作できます。なお、変数は必ず string 型となります。

Before 

After

*************************************************************

    実行時に変数に値を設定することはできない

*************************************************************

*************************************************************

<interface xmlns="urn:ios">
  <?set i=0?>
  <?for ;{$i < 4};?>
    <FastEthernet tags="nocreate">
      <name>0/{$i}</name>
      <shutdown tags="merge"/>
    </FastEthernet>
    <?set i={$i + 1}?>
  <?end?>
  <!-- i=‘5’ here -->
</interface>

*************************************************************

 

set-context-node の対応

コンテキストノードに任意の相対 Xpath を指定できるようになりました。

Before 

After

*************************************************************

<device-list foreach=”{/devices}">
  <name>{device}</name>
</device-list>

*************************************************************

*************************************************************

<?set-context-node {/devices}?>
<device-list>
  <name>{device}</name>
</device-list>
<!-- context node is /devices until the following closing tag -->

*************************************************************

 

set-root-node の対応

アクセス可能な Xpath tree のルートノードを指定できます。なお、カレントコンテキストノードは変わりません。set-root-node で指定できるルートノードは、現在のアクセス可能なツリーに限らず、データストア全体の何れかのノードを選択できます。

Before 

After

*************************************************************

     ルートノードは変更できない

*************************************************************

*************************************************************

<?set-root-node {/devices}?>
<device-list>
  <name>{/device}</name>
</device-list>
<!-- root node is /devices until the following closing tag -->

*************************************************************

 

 

NSO Template の Processing Instructions の変更に関する詳細は、CHANGES に記載されています。そちらもご参照ください。

参考情報

"NSO Dev Days: Making & Breaking Templates"                                                                        

https://www.youtube.com/watch?v=eDRLniGR_Sg&t=602s

 

Getting Started

検索バーにキーワード、フレーズ、または質問を入力し、お探しのものを見つけましょう

シスコ コミュニティをいち早く使いこなしていただけるよう役立つリンクをまとめました。みなさんのジャーニーがより良いものとなるようお手伝いします