3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Terraformでiosxe_yangを使ってIOS-XEを触ってみた

3
Last updated at Posted at 2026-05-31

先日は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を見てみます。
image.png

Router#show running-config | section track
track 1 ip sla 1 reachability
 delay down 180
Router#

無事に設定できました!

destroyして削除ができるかも確認してみます。
image.png

Router#show running-config | include track
Router#

削除も問題ありません。

NaCで公開されているリソースと組み合わせれば、NaCで用意があるものはNaCで、まだ用意されていないものはiosxe_yangで、という形でIOS-XEの一通りの設定が容易にIaC化できそうです。
クラウド環境にはTerraformを使っているけれど、ネットワーク機器は毎回CLIで設定を流し込み、という運用をされている方も多いと思います。
もしIOS-XEの機器を御利用であれば、NaCとiosxe_yangを利用して、Terraformに運用を統一してみては如何でしょうか?

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?