Quy trình thực thi mã khách hàng trên Terraform

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à:

  1. versions.tf
  2. provider.tf
  3. variables.tf
  4. main.tf
  5. merge.tf
  6. backend.tf
  7. outputs.tf

3. Phân tích mã nguồn module netascode/nac-aci/aci:0.7.0

Đường dẫn: registry | GitHub

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ằng utils_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

Đường dẫn: registry | GitHub

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.

Thẻ: Terraform ACI Cisco yaml infrastructure-as-code

Đăng vào ngày 16 tháng 10 lúc 10:43