Skip to content

Terraform + CML でノードのコンフィグは外部ファイルを参照する

Terraform で CML 上にラボを作成する際、同時に「ノードにコンフィグを流し込む」ことが可能です。 Terraform からノードへ設定を行うには cml2_node (Resource) の configuration を使います。 更にこの流し込むコンフィグを外部ファイルから参照したい場合は Terraform の file Function を利用することで実現出来ます。

但し、file Function を使って外部ファイルを参照させても CML Provider のバグなのか、以下のエラーになってしまいました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
cml2_node.dev1: Creating...
╷
│ Error: Provider produced inconsistent result after apply
│
│ When applying changes to cml2_node.dev1, provider
│ "provider[\"registry.terraform.io/ciscodevnet/cml2\"]" produced an unexpected new value:
│ .configuration: was cty.StringVal("hostname dev1\r\n!\r\nend"), but now cty.StringVal("hostname
│ dev1\n!\nend").
│
│ This is a bug in the provider, which should be reported in the provider's own issue tracker.

このエラーは「外部ファイルの改行コードを (CRLF では無く) LF に設定する」ことで回避することが出来ました。

サンプルファイル

今回、利用したサンプルファイルは以下です。 main.tf から file Function で dev1.txtdev2.txt を参照させています。 上述の通り、dev1.txtdev2.txt の改行コードは LF を指定します。

main.tf
terraform {
  required_providers {
    cml2 = {
      source  = "registry.terraform.io/ciscodevnet/cml2"
      version = "~> 0.7.0"
    }
  }
}

provider "cml2" {
  address     = "https://10.0.0.1"
  username    = "admin"
  password    = "password"
  skip_verify = true
}

resource "cml2_lab" "lab1" {
  title = "Example"
}

resource "cml2_node" "ext" {
  lab_id         = cml2_lab.lab1.id
  nodedefinition = "external_connector"
  label          = "Internet"
  configuration  = "System Bridge"
  x              = 160
  y              = 0
}

resource "cml2_node" "sw" {
  lab_id         = cml2_lab.lab1.id
  nodedefinition = "unmanaged_switch"
  label          = "Switch"
  x              = 160
  y              = 80
}

resource "cml2_node" "dev1" {
  lab_id         = cml2_lab.lab1.id
  label          = "dev1"
  nodedefinition = "cat8000v"
  configuration  = file("dev1.txt")
  x              = 0
  y              = 160
}

resource "cml2_node" "dev2" {
  lab_id         = cml2_lab.lab1.id
  label          = "dev2"
  nodedefinition = "cat8000v"
  configuration  = file("dev2.txt")
  x              = 320
  y              = 160
}

resource "cml2_link" "ext_sw" {
  lab_id = cml2_lab.lab1.id
  node_a = cml2_node.ext.id
  slot_a = 0
  node_b = cml2_node.sw.id
  slot_b = 0
}

resource "cml2_link" "sw_dev1" {
  lab_id = cml2_lab.lab1.id
  node_a = cml2_node.sw.id
  slot_a = 1
  node_b = cml2_node.dev1.id
  slot_b = 0
}

resource "cml2_link" "sw_dev2" {
  lab_id = cml2_lab.lab1.id
  node_a = cml2_node.sw.id
  slot_a = 2
  node_b = cml2_node.dev2.id
  slot_b = 0
}

resource "cml2_link" "link1" {
  lab_id = cml2_lab.lab1.id
  node_a = cml2_node.dev1.id
  slot_a = 1
  node_b = cml2_node.dev2.id
  slot_b = 1
}
dev1.txt
hostname dev1
!
interface GigabitEthernet1
 ip address 172.16.0.1 255.255.255.0
 no shutdown
!
interface GigabitEthernet2
 ip address 192.168.0.1 255.255.255.0
 no shutdown
!
end
dev2.txt
hostname dev2
!
interface GigabitEthernet1
 ip address 172.16.0.2 255.255.255.0
 no shutdown
!
interface GigabitEthernet2
 ip address 192.168.0.2 255.255.255.0
 no shutdown
!
end

CML 上に作成されたラボ

下記のラボが作成されました。 Terraform が外部ファイルを参照し、ノードにコンフィグを設定したことが分かります。

file