■統合された構成の定義を実現するために
既存のネットワークが後からAPIへの対応を進めている他の多くの実装とは異なり、ACIはソフトウェアとハードウェアの両方を1からAPIによる管理を前提として開発されています。そのため、Terraformが主要なターゲットととしているCloudの定義ツールとしての使い方との親和性は非常に高いです。Terraformのプロバイダの一覧においても、Cloudの項目に分類されている点などが、他の「ネットワークなネットワーク」とACIの違いを示していると言えるでしょう。
ACIはAnsibleへの対応を優先して進めていましたが、現在ではTerraformにも対応しており、多くの運用管理に関するパラメータの定義がTerraformのプロバイダを通じて構成可能となっています。
本ページでは、Terraform自体に対する解説は含めていません。Terraformウェブサイト等の情報を合わせてご確認下さい。
■Terraform利用における認証方式
Terraformを通じてACIを構成する場合にも認証が必要です。認証方式としてはパスワードを用いる方法と、署名された公開鍵認証を用いる方法が提供されていますが、パスワード認証の方法を利用した場合、大量の処理を一度にAPICに対して実行するとAPICのDoS対策機能によって接続が遮断(HTTP 503 errorが返される)されてしまう可能性があるため、運用環境においてACIの構成管理をTerraformを用いて利用したい場合には署名方式を用いることが推奨されます。
署名方式を利用するための手順は以下のとおりです。
1. 鍵の生成(公開鍵・秘密鍵)
2. APICへの公開鍵の登録
1. 鍵の生成(公開鍵・秘密鍵)
Terraformノード側でRSA鍵を生成します。
opensslコマンドによる生成例
$ openssl req -new -newkey rsa:2048 -days 36500 -nodes -x509 -keyout admin_terraform.key -out admin_terraform.crt -subj '/CN=Admin/O=Cisco Systems/C=JP'
2. APICへの公開鍵の登録
署名された公開鍵をAPICの管理者権限を持ったアカウントに登録します。登録は様々な方法で実行可能ですが、AnsibleのようにTerraform自体を使って登録することは2020/05時点では対応していないため、APIC GUIを通じて行う方法で登録を行います。
APIC GUIを通じた公開鍵の登録例
(1) APIC GUIにおいて、公開鍵を紐付けるアカウントを選択します([Admin] - [AAA] - [Users])。なお、署名形式の認証を利用できるアカウントはAPICのローカルアカウントに限られます。
(2) [User Certificates] 欄において、[+]をクリックし、名前をつけた上で生成した公開鍵を貼り付けます。

いずれの方法で登録した場合でも、APICローカルアカウントに正しく公開鍵が紐付けられたことを確認して下さい。
■Terraform - ACI Provider 構成例
署名方式の認証を利用し、TerraformのACI Providerを使ってTenantとVRFを構成するTerraformの構成例です。
main.tf
provider "aci" {
username = "admin"
private_key = var.aci_private_key
cert_name = var.aci_cert_name
url = var.aci_apic_url
insecure = true
}
sample.tf
resource "aci_tenant" "target_tenant" {
name = "${var.aci_tenant_name}${var.aci_pod_id}"
description = "created_by_terraform"
}
resource "aci_vrf" "target_vrf" {
tenant_dn = aci_tenant.target_tenant.id
name = var.aci_vrf_name
pc_enf_pref = "unenforced"
}
variables.tf
variable "aci_apic_url" {
default = "https://apic_url"
}
variable "aci_private_key" {
default = "/path/acihot_terraform.key"
}
variable "aci_cert_name" {
default = "acihot_terraform"
}
variable "aci_pod_id" {}
variable "aci_tenant_name" {}
variable "aci_vrf_name" {}
pod10_demo.tfvars
aci_pod_id = "10"
aci_tenant_name = "Tenant"
aci_vrf_name = "VRF1"
これらを用意した上で、以下の手順を実行することで Terraform を用いた ACI の構成を実行できます。
- terraform init
→ ACI Providerのダウンロードが実行されます
- terraform plan -var-file=pod10_demo.tfvars
→ APICにログインし、Terraformによる構成の確認が実行されます
- terraform apply -var-file=pod10_demo.tfvars
→ APICにログインし、Terraformによる構成の実行が行われます
■Terraform - aci_rest 利用例
ACIの運用管理において必要となる大半の操作対象に紐づくProviderが提供されていますが、ACI Providerが全てのパラメータの構成をサポートしてないケースや、そもそもACI Providerが用意されていない項目も多く存在します。そうした場合には、aci_restを使用することで、TerraformからAPICに対するあらゆるパラメータの構成管理を行うことが可能です。
resource "aci_rest" "l3out_domain" {
path = "api/node/mo/uni/tn-${var.aci_tenant_name}${var.aci_pod_id}/out-${var.aci_l3out_name}/rsl3DomAtt.json"
class_name = "l3extRsL3DomAtt"
content = {
"tDn" = "uni/l3dom-L3-out-Domain"
}
}
■参考情報
ACIとTerraformを組合せて利用する上で必要となる情報については、Terraform公式サイトに公開されています。
また、Cisco Live!セッションにおいても ACI と Terraform を組合せた構成管理について扱っています。
- DEVNET-2585 How to programmability migrate from traditional network to ACI with Terraform
YouTubeのCiscoチャンネルにて、ACIとTerraformの連携について解説した動画が公開されていますので、リンクしておきます。