はじめに
NSOではサービスパッケージの作成時に、テンプレートを使用することが出来ます。これはサービステンプレートとも呼ばれ、入力されたパラメータを展開した状態のデバイスConfig等を得るために使用されています。
NSO 5.6 では、部分毎をグループ化することが出来るようになりました。これによって、テンプレートファイルを効率よく書くことができ、また可読性もあがります。
テンプレート例
以下の例では、GbEth マクロが定義されています。パラメータとして、name, desc, mask を受け取ることができ、name と mask にはデフォルト値が設定されています。また、マクロ内では、$name, $desc, $mask を使用してその値を使用しています。
作成されたマクロを使用するには、expand タグを使用します。このマクロは desc のみが必須パラメータとなっており、以下の例では name, mask パラメータが渡されていないため、それぞれデフォルト値が使用されます。
<config-template xmlns="http://tail-f.com/ns/config/1.0"
servicepoint="l3vpn-template">
<?macro GbEth name='{interface-number}' desc mask='255.255.255.252'?>
<GigabitEthernet tags="nocreate">
<name>$name</name>
<description tags="merge">$desc</description>
<ip tags="merge">
<address>
<primary>
<address>{ip-address}</address>
<mask>$mask</mask>
</primary>
</address>
</ip>
</GigabitEthernet>
<?endmacro?>
<devices xmlns="http://tail-f.com/ns/ncs">
<?foreach {endpoint/ce}?>
<device tags="nocreate">
<name>{device}</name>
<config tags="merge">
<!-- CE template for Cisco IOS routers -->
<interface xmlns="urn:ios">
<?foreach {link}?>
<?expand GbEth desc='Link to PE'?>
<?end?>
<?foreach {local}?>
<?expand GbEth desc = 'Local network' mask='255.255.255.0'?>
<?end?>
</interface>
入れ子になったマクロ
マクロの定義は、以下のように入れ子にすることが可能です。GbEthWithVrf マクロでは、上で作成した GbEth マクロが使用されています。
<?macro GbEthWithVrf name='{interface-number}'
mask=255.255.255.252 desc forwarding?>
<?expand GbEth name=$name desc='$desc' mask=$mask?>
<GigabitEthernet tags="nocreate">
<name>$name</name>
<vrf tags="merge">
<forwarding>$forwarding</forwarding>
</vrf>
</GigabitEthernet>
<?endmacro?>
...
<interface xmlns="urn:ios" tags="nocreate">
<?foreach {link}?>
<?expand GbEthWithVrf desc = 'Link to CE router'
forwarding = '{string(/name)}'?>
<?end?>
</interface>
参考情報
サービステンプレートで使用可能なマクロについては、以下のドキュメントもご確認ください。
https://developer.cisco.com/docs/nso/guides/#!templates/service-templates
Macros in Service Templates