1. Khởi tạo mã nguồn từ Git
Mã nguồn được truy xuất từ kho lưu trữ:
https://wwwin-github.cisco.com/netascode/terraform-aac.git
2. Cấu trúc tệp cấu hình Terraform
2.1 backend.tf – Định nghĩa nơi lưu trữ trạng thái
Tệp này xác định phương thức lưu trữ trạng thái Terraform:
terraform {
backend "http" {}
}
2.2 main.tf – Điểm vào của kịch bản Terraform
Gọi module từ kho: netascode/nac-aci/aci:0.7.0, truyền các tham số như danh sách thư mục YAML, kiểm soát chính sách, và tên file mặc định:
module "aci" {
source = "netascode/nac-aci/aci"
version = "0.7.0"
yaml_directories = ["data"]
manage_tenants = true
write_default_values_file = "defaults.yaml"
}
2.3 provider.tf – Cấu hình nhà cung cấp
Xác định các nhà cung cấp cần thiết và thông tin kết nối đến APIC:
terraform {
required_providers {
aci = {
source = "CiscoDevNet/aci"
version = ">= 2.1.0"
}
utils = {
source = "cloudposse/utils"
version = ">= 0.15.0"
}
}
}
provider "aci" {
url = var.apic_url
username = var.apic_user
password = var.apic_pwd
insecure = true
retries = 4
}
2.4 terraform.tfvars và variables.tf – Quản lý biến
Tệp terraform.tfvars chứa giá trị thực tế cho các biến:
apic_url = "http://f1apic1.aci.pub"
apic_user = "apic:tacacs\\\\aac-gitlab"
apic_pwd = "aac-gitlab"
Tệp variables.tf khai báo kiểu và mô tả biến:
variable "apic_url" {
type = string
}
variable "apic_user" {
type = string
}
variable "apic_pwd" {
type = string
}
2.5 Thư mục data và tệp YAML
Các tệp YAML trong thư mục data định nghĩa cấu hình ACI, ví dụ:
---
apic:
tenants:
- name: 'xiawang3_aci_jenkins_team'
vrfs:
- name: 'test'
bridge_domains:
- name: BD_VLAN100
vrf: PROD-linus-aac-terraform
application_profiles:
- name: PROD-linus-aac-terraform
endpoint_groups:
- name: EPG_VLAN100
bridge_domain: BD_VLAN100
static_ports:
- node_id: 101
port: 1
vlan: 100
2.6 Tổng kết
Khi chạy Terraform, thứ tự xử lý là:
- versions.tf
- provider.tf
- variables.tf
- main.tf
- merge.tf
- backend.tf
- outputs.tf
3. Phân tích mã nguồn module netascode/nac-aci/aci:0.7.0
3.1.1 Các tệp TF chính
version.tf: Xác định phiên bản Terraform và nhà cung cấp yêu cầu.variables.tf: Khai báo các biến đầu vào như danh sách thư mục YAML, bật/tắt quản lý chính sách.merge.tf: Kết hợp nội dung từ các tệp YAML thành một cấu trúc dữ liệu duy nhất bằngutils_yaml_merge.main.tf: Định nghĩa logic xử lý tenant, VRF, Bridge Domain dựa trên dữ liệu từ YAML.
3.1.3 merge.tf – Gộp dữ liệu YAML
Sử dụng data.utils_yaml_merge để đọc và hợp nhất các tệp YAML từ thư mục data, defaults, và modules. Nếu không có dữ liệu nào, sẽ phát sinh lỗi.
3.1.4 main.tf – Xử lý cấu hình tenant
Dùng for_each để lặp qua từng tenant trong cấu hình YAML, chỉ xử lý nếu được bật trong biến manage_tenants và nằm trong danh sách managed_tenants.
3.1.5 aci_tenants.tf – Tạo tài nguyên ACI
Áp dụng module netascode/tenant/aci:0.1.1 để tạo tenant và VRF. Mỗi VRF được cấu hình với các thuộc tính như alias, description, policy nhóm, và route target.
4. Mã nguồn module netascode/tenant/aci:0.1.1
4.1 main.tf – Tài nguyên thực tế
Sử dụng aci_rest_managed để tương tác với APIC qua REST API:
resource "aci_rest_managed" "fvTenant" {
dn = "uni/tn-${var.name}"
class_name = "fvTenant"
content = {
name = var.name
nameAlias = var.alias
descr = var.description
}
}
4.2 Quá trình tạo tenant
Tài nguyên fvTenant được tạo với DN duy nhất và các thuộc tính được truyền từ biến.
5. Phân tích mã nguồn provider Cisco ACI
Source code: data_source_aci_rest_managed.go
Chứa logic xử lý giao tiếp REST với APIC, bao gồm việc gửi yêu cầu POST/PUT/DELETE theo cấu trúc JSON.