先日はCisco Network as Code(NaC)を利用してTerraformでIOS-XEを触る方法について記載しました。
この方法はとても便利で簡単なのですが、まだこの方法では設定できない機能も多いのが実情です。
これはそもそもIOSXE Providerで提供されているresourceがまだIOS-XEの膨大な機能全てを網羅できていないためです。
そこで使えるのがIOSXE Providerで提供されているiosxe_yangです。
これはYANGで定義されたデータモデルに従ってresourceを記述すればそれをNETCONFもしくはRESTCONFを使って設定してくれるという汎用的なもので、これを使えば一通りの機能は設定できてしまいます。
早速試してみましょう!
まず今回は、IP SLA等で利用されるtrackの設定を試してみます。
IOS-XEのYANG定義については下記の場所で公開されています。
https://github.com/YangModels/yang/tree/main/vendor/cisco/xe
この中で、IOS-XE 17.18でのtrack設定について書かれているものが下記のCisco-IOS-XE-track.yangというファイルです。
https://github.com/YangModels/yang/blob/main/vendor/cisco/xe/17181/Cisco-IOS-XE-track.yang
このファイルをそのまま読み解くのは辛いので、pyangというツールで構造を視覚的に見てみます。
$ pyang -f tree ./Cisco-IOS-XE-track.yang
module: Cisco-IOS-XE-track
augment /ios:native/ios:track:
+--rw tracked-object-v2* [object-number]
| +--rw object-number union
| +--rw (track-type)?
| | +--:(endpoint-tracker-case)
| | | +--rw endpoint-tracker? empty
| | +--:(interface-case)
| | | +--rw interface
| | | +--rw name? string
| | | +--rw protocol? enumeration
| | | +--rw routing? empty
| | +--:(ip-case)
| | | +--rw ip
| | | +--rw route
| | | | +--rw address? inet:ipv4-address
| | | | +--rw mask? inet:ipv4-address
| | | | +--rw (option)?
| | | | +--:(reachability-case)
| | | | | +--rw reachability? empty
| | | | +--:(metric-case)
| | | | +--rw metric? enumeration
| | | +--rw sla
| | | +--rw number? uint32
| | | +--rw (option)?
| | | +--:(reachability-case)
| | | | +--rw reachability? empty
| | | +--:(state-case)
| | | +--rw state? empty
| | +--:(ipv6-case)
| | | +--rw ipv6
| | | +--rw route
| | | +--rw address? ios-types:ipv6-prefix
| | | +--rw (option)?
| | | +--:(reachability-case)
| | | | +--rw reachability? empty
| | | +--:(metric-case)
| | | +--rw metric? enumeration
| | +--:(list-case)
| | | +--rw list
| | | +--rw (option)?
| | | +--:(boolean-case)
| | | | +--rw boolean? enumeration
| | | +--:(threshold-case)
| | | +--rw threshold? enumeration
| | +--:(service-case)
| | | +--rw service? string
| | +--:(stub-object-case)
| | +--rw stub-object? empty
| +--rw delay
| | +--rw down? uint32
| | +--rw up? uint32
(以下略)
これで一応構造は分かりますが、毎度pyangで調べるのは面倒なので、もっと楽をしたいと思います。
まず、実機にtrackの設定を実際に入れてみます。
Router#configure terminal
Enter configuration commands, one per line. End with CNTL/Z.
Router(config)#track 1 ip sla 1 reachability
Router(config-track)#delay down 180
Router(config-track)#end
Router#show running-config | section track
track 1 ip sla 1 reachability
delay down 180
Router#
そしてshow running-config | format netconf-xmlを実行します。
Router#show running-config | format netconf-xml
<config xmlns="http://tail-f.com/ns/config/1.0">
<native xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-native">
<version>17.18</version>
<boot-start-marker/>
<boot>
<system>
<flash>
<flash-list-ordered-by-user>
<flash-leaf>bootflash:/packages.conf</flash-leaf>
</flash-list-ordered-by-user>
</flash>
</system>
</boot>
<boot-end-marker/>
<memory>
<free>
<low-watermark>
(以下略)
沢山出力されますが、trackの部分だけ抜き出すと以下の構造でした。
<track>
<tracked-object-v2 xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-track">
<object-number>1</object-number>
<ip>
<sla>
<number>1</number>
<reachability/>
</sla>
</ip>
<delay>
<down>180</down>
</delay>
</tracked-object-v2>
</track>
これを参考にHCLで書いてみます。
実機に入れた設定は一旦消しておきます。
Router#configure terminal
Enter configuration commands, one per line. End with CNTL/Z.
Router(config)#no track 1
Router(config)#end
Router#show running-config | include track
Router#
作成したHCLは下記の通り。
resource "iosxe_yang" "track_ipsla_example" {
path = "/Cisco-IOS-XE-native:native/track/Cisco-IOS-XE-track:tracked-object-v2[object-number='1']"
attributes = {
"ip/sla/number" = "1"
"ip/sla/reachability" = ""
"delay/down" = "180"
}
}
これでplan、applyして再度running-configを見てみます。

Router#show running-config | section track
track 1 ip sla 1 reachability
delay down 180
Router#
無事に設定できました!
Router#show running-config | include track
Router#
削除も問題ありません。
NaCで公開されているリソースと組み合わせれば、NaCで用意があるものはNaCで、まだ用意されていないものはiosxe_yangで、という形でIOS-XEの一通りの設定が容易にIaC化できそうです。
クラウド環境にはTerraformを使っているけれど、ネットワーク機器は毎回CLIで設定を流し込み、という運用をされている方も多いと思います。
もしIOS-XEの機器を御利用であれば、NaCとiosxe_yangを利用して、Terraformに運用を統一してみては如何でしょうか?
