Terraformはクラウドサービスだけでなく、ネットワーク機器の構成管理にも利用できます。
しかし、AWSなどでの使い方は事例も沢山公開されておりTFファイルのサンプルも容易に入手できますが、ネットワーク機器を扱う方法はあまり情報が無く、TFファイルも0から書くとなると実用的なものを作るのは結構大変です。
Cisco社の製品についてはNetwork as Codeという名称でCiscoが作って公開されているものがあり、「IOS-XE用のものはまだ開発中ですが公開はされています」と聞いたので、それを試してみたいと思います。
Network as Codeのドキュメントは下記のサイトにあります。
https://netascode.cisco.com/docs/
サイトを開くとACIやCatalyst SD-WAN、Meraki等が並んでいますが、一見するとIOS-XEがありません。

Data Modelsを見るとIOS-XEがあり、説明を確認することができました。

しかしACI等のようにFirst Stepsの説明はまだ載っておらず、何から手を付ければ良いのかよくわかりません。
TFファイルはgithubで公開されているので、そちらを確認してみます。
https://github.com/netascode/
IOS-XEのリポジトリはterraform-iosxe-nac-iosxeです。
https://github.com/netascode/terraform-iosxe-nac-iosxe
Examplesが書かれており、system.nac.yamlとmain.tfの2つのファイルを用意すれば良い模様。

main.tfについては内容を変更する必要は無さそうなので、全くそのままコピー。
今回はテスト用の機器としてC1111を用意しており、先ほどのData Modelsの中からStatic Routeの書き方を確認し、system.nac.yamlの内容を下記のように作成しました。
https://netascode.cisco.com/docs/data_models/iosxe/device/static_route/
iosxe:
devices:
- name: Device1
configuration:
routing:
static_routes:
- prefix: 192.0.2.1
mask: 255.255.255.255
next_hops:
- ip: 192.0.2.254
もちろんTerraformも使えるようにしておく必要があります。
今回はWindowsの環境で、Terraformの導入方法は調べると沢山情報が出てきますが、今回そこは本題ではないので省略します。
とりあえず動かしてみる事を優先し、ダウンロードサイトから入手した実行ファイルをそのまま同ディレクトリに。

機器に接続して設定を変更するわけなので認証情報が要ると思うのですが、書き方のお作法がわかりません。
そもそもC1111側にもAPIインターフェースの有効化などが必要なのでは。。
とりあえず試しにinit、planを実行してみると、やはりエラーに。

これはProviderの情報を確認してみた方が良さそうなので、下記のドキュメントを読んでみる事にします。
https://registry.terraform.io/providers/CiscoDevNet/iosxe/latest/docs
ドキュメントによるとデフォルトではNETCONFを利用する仕様との事で、C1111側ではnetconf-yangという1行を設定するだけでした。
※ TCPの830番でNETCONFのインターフェースが有効化されるので、インターネットに繋がっている機器では不正アクセスされないようACL等も考慮が必要
認証情報は先ほどのエラーメッセージの通り、provider "iosxe"でusernameとpasswordを書けば良いようです。
しかし作った構成情報は複数人で共有できるようにしたいので、認証情報を平文で直書きするのは避けたい。
さらに説明を読んでいくと、IOSXE_USERNAMEとIOSXE_PASSWORDの環境変数に値を入れる形でも良いようなので、これでやってみます。

show running-configで確認してみると、反映されていました!
startup-configへの保存はされていません。

このままだと追加した設定は再起動後に消えてしまうので、write memoryしておきます。

さらにドキュメントを読み進めていくとsave_configの値を使ってstartup-configに書き込む方法なども載っていたのでTerraformからでも設定の保存は出来そうですが、今回はここまで。

